質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

14658閲覧

チェックボックスのデータベース登録について

ssk

総合スコア332

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

3クリップ

投稿2015/10/24 09:19

編集2015/10/24 13:45

チェックボックスにチェックされた数によって、動的にデータベースに反映させたいのですが、行き詰まっています。。現状、以下のコードです。$checkboxにはチェックボックス(配列が入っています)

$sql='INSERT INTO table(sample,sample,sample,sample,sample) VALUES(?,?,?,?,?)';
↑ここの「?」を動的に?いや、そしたらsample,sample,sample,sample,sampleも動的にしないといけないしな、、、という訳でNullの状態でも$sample[]=$valueに入れたら、うまくいくんじゃないかという考えに終着しました。(この考えがあっているかも不明です)

どうするのが最も正解なのでしょう。。

PHP

1<?php 2$checkbox=$_POST['checkbox'];//値を取得($checkboxは配列) 3 4 try{ 5 require_once('../../conf/db_con.php'); 6 //データ反映 7 $sql='INSERT INTO table(sample,sample,sample,sample,sample) VALUES(?,?,?,?,?)'; 8 $stmt=$dbh->prepare($sql); 9 foreach($checkbox as $value){ 10 echo $sample[]=$value; 11 } 12 $stmt->execute($sample); 13 $dbh=null; 14 }catch(Exception $e){ 15 print 'ただいま障害により大変ご迷惑をお掛けしております。'; 16 exit(); 17 } 18?>

【追加・修正依頼】
チェックボックスが複数あり、チェックされたもの(当然、複数の可能性あり)の値をデータベースに登録したい、ということですね?
↑はい、その通りです。

チェックボックスの数が一定か、不定か
↑チェックボックスの数は一定です。(10個のチェックボックスがあります、今後増えるかもしれませんが今のところ10個です)

最終的にどのような機能(WEBページ?)を作成したいのか
↑最終的にはジャンルで絞り込めるようにしたいです。(【不動産の場合】バス・トイレ別、南向き等【飲食店の場合】喫煙可、貸し切り有など) よろしくお願いいたします。

【テーブル構造】※サンプルで動かしているので簡易的です。すいません。
・id
・user_code
・checkbox_data1
・checkbox_data2
・checkbox_data3
・checkbox_data4
・checkbox_data5
・checkbox_data6
・checkbox_data7
・checkbox_data8
・checkbox_data9
・checkbox_data10

といった構造になっています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2015/10/24 11:19

チェックボックスが複数あり、チェックされたもの(当然、複数の可能性あり)の値をデータベースに登録したい、ということですね? これはチェックボックスの数が一定か、不定かによって対処方法が変わってくると思います。 最終的にどのような機能(WEBページ?)を作成したいのかを教えていただけると、 具体的な回答を得やすくなると思います。
ssk

2015/10/24 12:38

チェックボックスが複数あり、チェックされたもの(当然、複数の可能性あり)の値をデータベースに登録したい、ということですね? ↑はい、その通りです。 チェックボックスの数が一定か、不定か ↑チェックボックスの数は一定です。(10個のチェックボックスがあります、今後増えるかもしれませんが今のところ10個です) 最終的にどのような機能(WEBページ?)を作成したいのか ↑最終的にはジャンルで絞り込めるようにしたいです。(【不動産の場合】バス・トイレ別、南向き等【飲食店の場合】喫煙可、貸し切り有など) よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2015/10/24 13:29

table の構造が分かるように明記してください。
ssk

2015/10/24 13:44

【テーブル構造】※サンプルで動かしているので簡易的です。すいません。 ・id ・user_code ・checkbox_data1 ・checkbox_data2 ・checkbox_data3 ・checkbox_data4 ・checkbox_data5 ・checkbox_data6 ・checkbox_data7 ・checkbox_data8 ・checkbox_data9 ・checkbox_data10 といった構造になっています。
退会済みユーザー

退会済みユーザー

2015/10/24 13:51

捕捉してくれているのに、余計にわかりにくくなっています。 不動産の「設備」を登録するプログラムなのに、「user...」ってどういう意味なんでしょう?
ssk

2015/10/24 13:58

いえ、不動産の設備を登録するプログラムではないです(不動産のバス・トイレ別などは、あくまで一例です)。ジャンルで絞り込めるようにしたいのです。
guest

回答2

0

情報の追記、ありがとうございます。

(SUUMOのような)会員制の物件情報サイトで、
"お気に入りの検索条件"
を登録できるような機能を想定されているのでしょうか?

であれば、SQLは動的にする必要はなさそうです。

チェックボックスごとに対応するカラムがあるようなので、以下を前提に回答させていただきます。

  • チェックボックスがチェックされていれば対応するカラムに1を、チェックされていなければ0を格納する。
  • 各チェックボックスのvalue属性の値は、対応するカラムの名前と一致している。
  • user_codeは会員IDで、チェックボックスの値と同様にPOSTデータから取得する。

'id'というカラムは用途が不明なので、とりあえず無視します。
(オートインクリメントのPKでしょうか?)

php

1$columnList = array( 2 'checkbox_data1', 3 'checkbox_data2', 4 'checkbox_data3', 5 'checkbox_data4', 6 'checkbox_data5', 7 'checkbox_data6', 8 'checkbox_data7', 9 'checkbox_data8', 10 'checkbox_data9', 11 'checkbox_data10' 12); 13 14$placeholders = array_fill(0, count($columnList), '?'); 15 16$userCode = $_POST['user_code']; 17// チェックボックスが1つもチェックされていない場合、空配列を代入する。 18$checkbox= (isset($_POST['checkbox'])) ? $_POST['checkbox'] : array(); //値を取得($checkboxは配列) 19 20try{ 21 require_once('../../conf/db_con.php'); 22 23 //データ反映 24 $sql= sprintf( 25 'INSERT INTO table (user_code, %s) VALUES (?, %s)', 26 implode(', ', $columnList), 27 implode(', ', $placeholders)); 28 $stmt = $dbh->prepare($sql); 29 30 $stmt->bindValue(1, $userCode, PDO::PARAM_STR); 31 32 $index = 2; 33 foreach($columnList as $column){ 34 $value = in_array($column, $checkbox) ? 1 : 0; 35 $stmt->bindValue($index, $value, PDO::PARAM_INT); 36 37 $index++; 38 } 39 40 $stmt->execute(); 41 $dbh=null; 42}catch(Exception $e){ 43 print 'ただいま障害により大変ご迷惑をお掛けしております。'; 44 exit(); 45}

投稿2015/10/24 14:44

編集2015/10/25 13:35
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssk

2015/10/24 15:27

ありがとうございます!初心者の僕でもなんとか理解できました>< ただ、以下だけ理解ができなったです。ここでは何をやっているのでしょうか? $index = 2; foreach($columnList as $column){ $value = in_array($column, $checkbox) ? 1 : 0; $stmt->bindValue($index, $value, PDO::PARAM_INT); $index++; }
ssk

2015/10/24 15:43

Invalid parameter number: parameter was not defined in 試してみたのですが、このようなエラーが表示されてしまいました。。
ssk

2015/10/24 16:14

$index = 1; ↑$index = 2;を$index = 1;に変更するとできました($index = 1;に変えて合っているのか不安です。。) $index = 1; foreach($columnList as $column){ $value = in_array($column, $checkbox) ? 1 : 0; $stmt->bindValue($index, $value, PDO::PARAM_INT); $index++; }
KiyoshiMotoki

2015/10/24 21:39

むむ、動きませんでしたか。。 ともあれ、解決できたようで幸いです。
退会済みユーザー

退会済みユーザー

2015/10/24 22:39

$checkbox = $_POST['checkbox']; だと、一つもチェックされていない時にエラーで、止まりますね。 $checkbox= (isset($_POST['checkbox'])) ? $_POST['checkbox'] : array();
KiyoshiMotoki

2015/10/25 13:36

Kosuke_Shibuya様、ご指摘ありがとうございます。 確かにおっしゃる通りですね。 回答のコードを修正させていただきました。
ssk

2015/10/25 15:09 編集

こちらで再度、質問失礼します。 $index = 1; ↑$index = 2;を$index = 1;に変更するとできました($index = 1;に変えて合っているのか不安です。。) こちらで意図した動きをしたのですが、間違っていますでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/25 15:19 編集

横レスすみません。 KiyoshiMotoki さんの回答が正しく、$index = 2; でないと正しく、プレースホルダに値が割り当てされないと思いますが…。写経した時に、どこかおかしくなっているのではありませんか?もしくはDBの構造がKiyoshiMotokiさんの提示したものと異なっているか。
KiyoshiMotoki

2015/10/25 15:20 編集

少なくとも、私の意図した動きではありません。 私が書いたコードは、foreach文の直前に $stmt->bindValue(1, $userCode, PDO::PARAM_STR); という一行があり、1個目のプレースホルダ("?")にユーザーコードをバインドしています。 そのため、10個のチェックボックスの値は2個目から11個目のプレースホルダにバインドすることになるので、 $index = 2; だったわけです。 $index = 1に変更して動いたということは、ssk様が書いたSQL文は 'INSERT INTO table (user_code, %s) VALUES (?, %s)', ではなく 'INSERT INTO table (%s) VALUES (%s)', になっていませんでしたか? これだと確かにINSERT文はエラーなく実行されますが、 カラム'user_code'に値を登録していないため、 誰がチェックボックスにチェックを入れたのかが分からなくなるかと思います。
ssk

2015/10/25 15:25

>'INSERT INTO table (%s) VALUES (%s)', たしかに、このようになっています。 >誰がチェックボックスにチェックを入れたのかが分からなく 誰がチェックボックスにチェックを入れての、わからなくて良い場合はこのままでも大丈夫でしょうか?
ssk

2015/10/25 15:27

>$index = 2; でないと正しく、プレースホルダに値が割り当てされないと思いますが…。 なぜか意図した動きになっていまして、あら?これで良いのかなと思っていました。。
退会済みユーザー

退会済みユーザー

2015/10/25 15:34

「なぜか」という言葉が出なくなることを期待します…w 私もKiyoshiMotokiさんもあなたが提示されたコードをそのままの状態で動かしているはずと思って回答しています。 あなたがどうそのコードをアレンジしたのかなんてエスパーではありませんから、あなたが書いた手元のコードを提示しない限り知る由もないのです。 回答する立場の人は同時に「初心者のいう『そのまま書いた』は信用してはいけない。」とも思っているので、「手元のコードを提示してください」と書かれている質問よく見かけますね。
KiyoshiMotoki

2015/10/25 15:37

> 誰がチェックボックスにチェックを入れての、わからなくて良い場合はこのままでも大丈夫でしょうか? そうすると、逆に、誰がチェックを入れたのか分かりたい場合に対応できないコードになってしまいますよ? 「そんな場合はない」 ということでしたら、構わないと思います。
ssk

2015/10/25 15:40

>「なぜか」という言葉が出なくなることを期待します…w すいません。。やっていることが理解できずでした。 ※一応、そのまま書いたつもりです>< $value = in_array($column, $checkbox) ? 1 : 0; ここの「?」はどういう意味でしょうか?
ssk

2015/10/25 15:42

>「そんな場合はない」 ということでしたら、構わないと思います。 そうなんですか!今のところは大丈夫なのですが、今後、今回のこととは別件で必要になるかもしれないので、理解だけはしておきます。
ssk

2015/10/25 15:45

参考URLまでありがとうございます!理解できました。
KiyoshiMotoki

2015/10/25 15:55 編集

> ここの「?」はどういう意味でしょうか? まずは、ご自分で調べてみることをお勧めします。 厳しいことを申し上げますが、 ssk様が今後もエンジニアをお続けになるのであれば、 「誰の力も借りることができない」 というシチュエーションが、いつか必ず訪れます。 それに、私は 「知りたいことを自力で調べる」 というのも一種のスキルだと思っており、それを身に付けることは、 長い目で見れば、ssk様のエンジニアとしての成長に大きく影響すると思います。 調べてみて分からなければ、別途、質問を投稿するなどしましょう。
ssk

2015/10/25 15:55

調べる範囲が甘かったかもしれません。 >知りたいことを自力で調べる」というのも一種のスキル たしかに、そうですよね。色々なサイトを参考に、それでもわからなければ質問を投稿します!その際は恐縮ですが、お力添えいただけると助かります><
KiyoshiMotoki

2015/10/25 16:02

お力になれると良いですが・・・w
guest

0

ベストアンサー

補足より

不動産の設備を登録するプログラムではないです(不動産のバス・トイレ別などは、あくまで一例です)。ジャンルで絞り込めるようにしたいのです。

具体的な例をあげないと、お互いに想定するケース、前提に相違が生じる恐れがあるため、「不動産」を例に説明します。

DBに「部屋」の情報を持つ room テーブルがあり、「設備」をどう持つかですが、通常「正規化」して、roomとは別に、equipment テーブル・設備マスターを持つべきです。こうしておくことで、設備の項目の増減に対応することが容易になります。

具体的には以下のような最小構成になります。

部屋テーブル

sql

1CREATE TABLE `room` ( 2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', 3 `name` varchar(16) DEFAULT NULL COMMENT '部屋番号', 4 PRIMARY KEY (`id`) 5) ENGINE=InnoDB DEFAULT CHARSET=utf8;

部屋・設備リンクテーブル

sql

1CREATE TABLE `equipment` ( 2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', 3 `room_id` int(11) DEFAULT NULL COMMENT '部屋番号', 4 `name` int(11) DEFAULT NULL COMMENT '設備名', 5 PRIMARY KEY (`id`) 6) ENGINE=InnoDB DEFAULT CHARSET=utf8;

設備マスター

sql

1CREATE TABLE `master_equipment` ( 2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 3 `name` varchar(11) DEFAULT NULL COMMENT '設備名', 4 PRIMARY KEY (`id`) 5) ENGINE=InnoDB DEFAULT CHARSET=utf8;

こうしておくことで、以下のようなSQLで抽出可能になります。

sql

1SELECT 2 room.* 3FROM 4 room 5WHERE 6 room.id IN ( 7 SELECT 8 room_id 9 FROM 10 equipment 11 WHERE id IN (1, 2) 12 )

html は以下のように出力するようにしておけばいいですね。

html

1<form action=""> 2 <!-- master_euipment から動的に生成する --> 3 <label><input type="checkbox" name="equipment[]" value="1" />オートロック</label> 4 <label><input type="checkbox" name="equipment[]" value="2" />南向き</label> 5 <label><input type="checkbox" name="equipment[]" value="3" />インターネット</label> 6 <label><input type="checkbox" name="equipment[]" value="4" />対面キッチン</label> 7</form>

追記

html

1<?php 2if (null != filter_input_array(INPUT_POST)) { 3 $arrPost = filter_input_array(INPUT_POST); 4 5 $room_id = $arrPost['room_id']; 6 $arrEquipmentId = (isset($arrPost['equipment'])) ? $arrPost['equipment'] : []; 7 8 //$dbh = 9 10 foreach ($arrEquipmentId as $equipmentId) { 11 $vals = []; 12 $sql = 'INSERT INTO equipmet (id, room_id, euipment_id) VALUES (null, ?, ?)'; 13 $vals[] = $room_id; 14 $vals[] = $equipmentId; 15 16 $stmt = $dbh->prepare($sql); 17 $stmt->execute($vals); 18 } 19} 20?> 21<!DOCTYPE HTML> 22<html lang="en-US"> 23 <head> 24 <meta charset="UTF-8"> 25 <title></title> 26 </head> 27 <body> 28 <form action="" method="post"> 29 <input type="hidden" name="room_id" value="1" /> 30 <!-- master_euipment から動的に生成する --> 31 <label><input type="checkbox" name="equipment[]" value="1" />オートロック</label> 32 <label><input type="checkbox" name="equipment[]" value="2" />南向き</label> 33 <label><input type="checkbox" name="equipment[]" value="3" />インターネット</label> 34 <label><input type="checkbox" name="equipment[]" value="4" />対面キッチン</label> 35 </form> 36 </body> 37</html>

投稿2015/10/24 14:23

編集2015/10/24 14:55
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssk

2015/10/24 14:30

サンプルコードまで、ありがとうございます>< ただ、知らいたいことは、チェックボックスが複数あり、チェックされたもの(当然、複数の可能性あり)の値をデータベースに登録したいのですが、その際の処理はどのようになりますでしょうか? 説明不足で申し訳ございません。
退会済みユーザー

退会済みユーザー

2015/10/24 14:52 編集

ざっくり、追記しました。 実際には、バリデーションやトランザクション処理、CSRF対策用のコードも入れることになります。
ssk

2015/10/24 14:59

ありがとうございます。 こちらはHTMLを動的に生成する方法でしょうか? 理解できず、すいません。。
退会済みユーザー

退会済みユーザー

2015/10/24 15:01

ちゃんと読みましょうよ… INSERT INTO 〜 というSQLがあるのに「HTMLを動的に生成する方法」ですかとは…。
ssk

2015/10/24 15:08

読んだのですが、わからなかったです>< <label><input type="checkbox" name="equipment[]" value="1" />オートロック</label> <label><input type="checkbox" name="equipment[]" value="2" />南向き</label> <label><input type="checkbox" name="equipment[]" value="3" />インターネット</label> <label><input type="checkbox" name="equipment[]" value="4" />対面キッチン</label> こちらのチェックボックスを選択(複数も可)して foreach ($arrEquipmentId as $equipmentId) { $vals = []; $sql = 'INSERT INTO equipmet (id, room_id, euipment_id) VALUES (null, ?, ?)'; $vals[] = $room_id; $vals[] = $equipmentId; $stmt = $dbh->prepare($sql); $stmt->execute($vals); } こちらでデータベースに入れるのでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/24 15:12 編集

そうですよ。 実際に動かしてみればわかります。コードだけを眺めていたって何にもなりません。実際に動かして、試すことを繰り返すしか上達の道はありません。 動くコードを回答しているので動かしてください。
ssk

2015/10/24 15:12

すいません、ありがとうございます。試しています。
退会済みユーザー

退会済みユーザー

2015/10/24 15:33

> 読んだのですが、わからなかったです>< ただ漠然と「わからない」では、どう答えてあげればいいのかわからないので、どこまで理解できて、どこがわからないのかを明確に質問してください。
ssk

2015/10/24 15:55

初学者で知識が乏しく。。以下のPHP、特に前半が何をやっているのか、どうやって「オートロック」や「南向き」の情報を渡しているのかがわかりませんでした。 <?php if (null != filter_input_array(INPUT_POST)) { $arrPost = filter_input_array(INPUT_POST); $room_id = $arrPost['room_id']; $arrEquipmentId = (isset($arrPost['equipment'])) ? $arrPost['equipment'] : []; //$dbh = foreach ($arrEquipmentId as $equipmentId) { $vals = []; $sql = 'INSERT INTO equipmet (id, room_id, euipment_id) VALUES (null, ?, ?)'; $vals[] = $room_id; $vals[] = $equipmentId; $stmt = $dbh->prepare($sql); $stmt->execute($vals); } } ?>
退会済みユーザー

退会済みユーザー

2015/10/24 16:02

> どうやって「オートロック」や「南向き」の情報を渡している HTMLにSUBMIT を設定していませんが、ボタンを設置して、クリックすれば送信できますよね。
ssk

2015/10/24 16:08

$arrEquipmentId = (isset($arrPost['equipment'])) ? $arrPost['equipment'] : []; ここでは、$arrEquipmentIdに「オートロック」などの値を入れているのでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/24 16:11

デバッグの仕方はわかりませんか? $arrEquipmentId = (isset($arrPost['equipment'])) ? $arrPost['equipment'] : []; この行の下に、 var_dump($arrEquipmentId); をいれて確認できます。
ssk

2015/10/24 16:17

できました!! しっかり読んで1つ1つ何をしているのか、理解します。 Kosuke_Shibuyaさん助かりました!><
退会済みユーザー

退会済みユーザー

2015/10/24 16:20

ソースと合わせて、リファレンスをしっかり読むといいですよ。 読むといいよいうよりは、必須です。 http://php.net/manual/ja/funcref.php 初心者に限らず、エキスパートな人ほどリファレンスは読んでいるものです。
ssk

2015/10/24 16:26

はい! 貴重なお時間をお付き合い頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問