忙しい現代人の腰&肩のお悩み対策!

データベースにチェックボックスのON、OFF状態を
保存しようとしているのですが、
やり方が色々あり、どのやり方が一番いいのかわかりません。
調べたところ、大きく以下の4つがあることがわかりました。

-----------------------------------------
方法1 チェックボックス分カラムを用意する
-----------------------------------------

id name flag4 flag3 flag2 flag1
15 なまえ 1   1   0  0


-----------------------------------------
方法2 ビット演算を使う
-----------------------------------------

id name bit
15 なまえ 12

-----------------------------------------
方法3 カンマで区切ってデータを入れる
-----------------------------------------

id name check
15 なまえ 3,4

-----------------------------------------
方法4 チェックボックス管理テーブルを作る
-----------------------------------------

main_tb
id name
15 なまえ

check_tb
id check
15 4
15 3 


それぞれ、一長一短があると思うのですが
それぞれのメリット・デメリット、一般的にどの方法が好まれているのか等
アドバイス頂けると嬉しいです。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

あくまで私見ですが参考までに



→一般的には(1)が好まれるのではないでしょうか
往々にして選択肢というのはシステムの運用が始まると拡張することがないため
1レコードに個別に埋め込むのが感覚的にももっとも適しているため

メリット:
特定のレコードに対する有無だけをチェックする場合はもっとも効率的
データ構造が単純なためイメージしやすい
(ようはエクセルちっくなデータだと思えばよいので)

デメリット:
項目が増えるといちいちカラムを増やさないといけず、多くの選択肢がある
場合は物理的に対応できないなど、スケーラビリティが低い
冗長なもち方のため集計や抽出の際にあまり効率的なSQLをかけない

→次に(2)と(3)はほぼ同様のケースであまりSQLライクではありません
とくに(3)のような持ち方だとおおよそSQLとしての集計には向きません
(例示の(2)はビット処理じゃないですね?1と2がチェックなら3?)

メリット:
カラム数がへらせる
データの拡張が容易

デメリット:
とくにインデックスがききにくいため大量のデータ処理にはむかない
データに制限をつけにくい

→個人的には(4)を使うケースが多いです

メリット:
集計が簡単で簡便なSQL文で表現できる
拡張性はたかい

デメリット:
かならず集計のSQLが必要になるためなれないとSQL文が書きにくい

ただし最初に書いた通り、拡張する必要があるかどうかで(1)の方を選ぶことも
多々ありそれはケースバイケースで設計時点で調整します
    • good
    • 0
この回答へのお礼

回答有り難うございます。
メリット・デメリットをご丁寧にありがとうございます。
例示2のbit 12は 1100を10進数として挿入したとして考えた場合です。

一長一短あるので、使用するシーンで使い分けていくのがよさそうですね。

お礼日時:2014/01/22 18:13

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qチェックボックスを使った複数選択からデータベースへの登録

チェックボックスを使った複数選択の処理を教えて下さい。

現在の処理は下記のようにしております。

00.phpの中のチェックボックスの記述です。複数選択してから01.phpに値を渡します。

<label>
<input type="checkbox" name="working_days1" value="ド短期1日~OK">
ド短期1日~OK</label>
<label>
<input type="checkbox" name="working_days2" value="週2、3日程度">
週2、3日程度</label>
<label>    
<input type="checkbox" name="working_days3" value="月~金曜日">
月~金曜日</label>
<br>
<label>
<input type="checkbox" name="working_days4" value="土日祝日のみ">
土日祝日のみ</label>
<label>
<input type="checkbox" name="working_days5" value="毎日オールフリー">
毎日オールフリー</label>


00.phpから01.phpへPOSTでデータを渡します。

<?
$working_days1 = htmlspecialchars($_POST["working_days1"]);
$working_days2 = htmlspecialchars($_POST["working_days2"]);
$working_days3 = htmlspecialchars($_POST["working_days3"]);
$working_days4 = htmlspecialchars($_POST["working_days4"]);
$working_days5 = htmlspecialchars($_POST["working_days5"]);

各変数の中を確認してチェックするかどうかへ決め、変数に格納します。

if($working_days1 == "ド短期1日~OK" ){$d01 = "checked";}
if($working_days2 == "週2、3日程度"){$d02 = "checked";}
if($working_days3 == "月~金曜日"){$d03 = "checked";}
if($working_days4 == "土日祝日のみ" ){$d04 = "checked";}
if($working_days5 == "毎日オールフリー"){$d05 = "checked";}
?>

変数に格納されたチェックを実行してチェック済みとします。

<label>
<input type="checkbox" name="working_days1" value="ド短期1日~OK" <?php echo $d01 ?>>
ド短期1日~OK</label> 
<label>
<input type="checkbox" name="working_days2" value="週2、3日程度" <?php echo $d02 ?>>
週2、3日程度</label>
<label>    
<input type="checkbox" name="working_days3" value="月~金曜日" <?php echo $d03 ?>>
月~金曜日</label>
<label>
<input type="checkbox" name="working_days4" value="土日祝日のみ" <?php echo $d04 ?>>
土日祝日のみ</label>
<label>
<input type="checkbox" name="working_days5" value="毎日オールフリー" <?php echo $d05 ?>>
毎日オールフリー</label>

こんな感じでチェックされた項目の確認をした後で、内容をMYSQLのデータベースに登録をしたいのですが、
データベースへの登録も含めて、一連の流れの中で、配列を利用して、もっと簡単なよい方法が
ないか御指導いただけませんでしょうか?

データベースへの登録も配列に格納しないとworking_dayというテーブルしか用意をしていないので
その中にどのように格納して、また取り出しをすればよいかわかりません。

どうぞ超初心者レベルでのご指導をお手間ですが、よろしくお願い致します。

チェックボックスを使った複数選択の処理を教えて下さい。

現在の処理は下記のようにしております。

00.phpの中のチェックボックスの記述です。複数選択してから01.phpに値を渡します。

<label>
<input type="checkbox" name="working_days1" value="ド短期1日~OK">
ド短期1日~OK</label>
<label>
<input type="checkbox" name="working_days2" value="週2、3日程度">
週2、3日程度</label>
<label>    
...続きを読む

Aベストアンサー

>さてMySQLでの記述ですが、これはまだ試していないのですが、
>if(isset($_POST["working_days"][0]){
>foreach($_POST["working_days"] as $chkflg){
>$sql="insert into job(job_id, title, working_days)values
>('" . $_POST["job_id"] . "','" . $_POST["title"] . "','" . $_POST["working_days"] . "')";
>というように記述するのでOKなのでしょうか?

OKかどうかは分かりませんが、この場合の$chkflgはチェックボックスの中のチェックされたvalue値です。例えば0なら"ド短期1日~OK"に対応しますね。
データベースへの記録は文字列ではなく、整数のままで良いと言うならこのままでよいと思います(定型文字列であれば、対応数字をつくっておいてそのまま数字で記録の方が良い)。
なお、データベースへ登録する時そのまま$_POST値をSQL文に投入するとSQLインジェクションという脆弱性につながりますので、整形したりチェックする必要があります。
http://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3

面倒でも、例えばMySQLならば
$title = mysql_real_escape_string($_POST["title"]);
のように整形する必要がありますね。ですから、例文であれば、
$sql="insert into job(job_id, title, working_days)values
('" . mysql_real_escape_string($_POST["job_id"] ). "','" . mysql_real_escape_string($_POST["title"]) . "','" . $chkflg. "')";

となります。

なお、別にチェックボクスの数字(value値)と文字列(ド短期1日~OKのような文字列)のテーブルを作っておけば、

create table checkbox_tb (
checkobx_id int(4),
checkbox_name varchar(32),
PRIMARY KEY (checkbox_id)
);
SQL取得時に表示名も一緒に取得する事が出来るので便利です。
SELECT job.*,checkbox_tb.checkbox_name FROM job,checkbox_tb WHERE checkbox_tb.checkbox_id = job.working_days AND 条件

参考まで。

>さてMySQLでの記述ですが、これはまだ試していないのですが、
>if(isset($_POST["working_days"][0]){
>foreach($_POST["working_days"] as $chkflg){
>$sql="insert into job(job_id, title, working_days)values
>('" . $_POST["job_id"] . "','" . $_POST["title"] . "','" . $_POST["working_days"] . "')";
>というように記述するのでOKなのでしょうか?

OKかどうかは分かりませんが、この場合の$chkflgはチェックボックスの中のチェックされたvalue値です。例えば0なら"ド短期1日~OK"に対応します...続きを読む

Qチェックボックスの項目をDBにinsertしたい

チェックボックスの複数項目をDBにインサートしたいのですが、DBのフィールドを見ると、チェックボックスの値だけ空になってしまいます。
プログラミング初心者のため、基本的なところでつまずいている可能性も高いのですが、正しいコードがわかる方がいらっしゃいましたらご教授ください。

よろしくお願いします。


■DBの構造

以下のようなフィールド構造にしており、一人につき1行でデータを持ちたいと思っています。
フィールド   name/ mail/comment/kokugo/sugaku/rika/syakai/eigo/・・・

● 実際のデータの持ち方(以下のようにしたいです。)
例 太郎/ taro@/hello/ 国語/数学/ / /  
次郎/ jiro@/ nice/ / 数学/ /社会/ 英語

※太郎は、国語と数学をチェックボックスで選択
※次郎は、数学と社会と英語をチェックボックスで選択



■チェックボックス画面html(一部抜粋)

----


<form action="regist.php" method="post">
名前:<br />
<input type="text" name="name" size="30" value="" /><br />
メールアドレス:<br />
<input type="text" name="mail" size="30" value="" /><br />
コメント:<br />
<textarea name="comment" cols="30" rows="5"></textarea><br />


科目<br />
<form name="kamoku" method="post" action="regist.php">
国語<input type="checkbox" name="kokugo" value="国語">
数学<input type="checkbox" name="sugaku" value="数学">
理科<input type="checkbox" name="rika" value="理科">
社会<input type="checkbox" name="syakai" value="社会">
英語<input type="checkbox" name="eigo" value="英語">
<br />
-----


■phpのファイル(regist.php)
※該当部分だけ記述させていただきます。
----


<?php

// $checkboxの中身は配列
$checkbox = $_REQUEST["chk"];

?>


<html>
<head>

<title>DB登録練習</title>

</head>
<body>

// 選んだ科目を画面に表示させる

<tr>
<td>科目</td><td><?php
for($i=0; $i<sizeof($checkbox); $i++){
print "${checkbox[$i]}<br>";
}
?></td>
</tr>


// DB登録部分

<?php

$name = $_REQUEST['name'];
$mail = $_REQUEST['mail'];
$comment = $_REQUEST['comment'];

$kokugo = $_REQUEST['kokugo'];
$sugaku = $_REQUEST['sugaku'];
$rika = $_REQUEST['rika'];
$syakai = $_REQUEST['syakai'];
$eigo = $_REQUEST['eigo'];


$del_flag = $_REQUEST['del_flag'];
$reg_date = $_REQUEST['reg_date'];

$result = mysql_query("INSERT INTO DBpractice(name, mail, comment, kokugo,sugaku,rika, syakai, eigo,del_flag,reg_date) VALUES('$name', '$mail', '$comment','$kokugo','$sugaku','$rika','$syakai','$eigo','0', now())", $conn);
if (!$result) {
exit('データを登録できませんでした。');
}

----

チェックボックスで選択した複数科目をブラウザ上で表示させるところは上手くできるのですが、DBに挿入するときのみ、科目のみがうまく入りません。(他の項目は挿入されています。)

よろしくお願いします。

チェックボックスの複数項目をDBにインサートしたいのですが、DBのフィールドを見ると、チェックボックスの値だけ空になってしまいます。
プログラミング初心者のため、基本的なところでつまずいている可能性も高いのですが、正しいコードがわかる方がいらっしゃいましたらご教授ください。

よろしくお願いします。


■DBの構造

以下のようなフィールド構造にしており、一人につき1行でデータを持ちたいと思っています。
フィールド   name/ mail/comment/kokugo/sugaku/rika/syakai/eigo/・・・

● 実際の...続きを読む

Aベストアンサー

$checkbox = $_REQUEST["chk"];
の前に、

print_r($_POST);

と書いて、どんな風に値が渡されているのか確認しましょう。
解決方法は見えてくると思いますよ。

QDBの値をチェックボックスに反映させたい

DBに登録してあるデータをもとに、該当するチェックボックスに、画面表示時にチェックを入れるプログラムを作成しています。

DBからのデータは $info という配列の中の9番目に 男性であれば「0」,女性であれば「1」という数字が入っており、 $info[9]に実際に値が入っているところまでは確認できました。

これをもとに以下のようにコーディングを行ったのですが、ラジオボタンのみ空欄のままになっています。(他のテキストデータはうまく表示されています。)

原因と、解決策がわかるかたがいらっしゃいましたらご教授ください。
※プログラミングは初心者です。

よろしくお願いたします。

----------------
<?php

switch($info[9]){
case 0:
$checked0 = 'checked';
break;
case 1:
$checked1 = 'checked';
}
?>

■body内

<dt>性別:</dt>

<input type="hidden" name="seibetsu" value="$info[9]">
<input name="radiobutton" type="radio" value=0 "$checked0"/ >男性
<input name="radiobutton" type="radio" value=1 "$checked1"/>女性

--------------------------

DBに登録してあるデータをもとに、該当するチェックボックスに、画面表示時にチェックを入れるプログラムを作成しています。

DBからのデータは $info という配列の中の9番目に 男性であれば「0」,女性であれば「1」という数字が入っており、 $info[9]に実際に値が入っているところまでは確認できました。

これをもとに以下のようにコーディングを行ったのですが、ラジオボタンのみ空欄のままになっています。(他のテキストデータはうまく表示されています。)

原因と、解決策がわかるかたがいらっしゃいま...続きを読む

Aベストアンサー

ページのソースをみればわかると思いますが
checkedをクォーテーションでくくる必要がないのでは?

また、データのやり取りをするときにあまり「0」を使うのは
よくないですね。
1以上の整数を使うことをおすすめします。

Qデータベースの1要素に複数データを格納したい

顧客管理データベースシステムを作成しようとしているのですが、
データベースの要素に複数データが入る場合の管理方法が
分からず困っています。

一例を挙げると、複数の電話番号を持つ人にも対応するように
データベース設計をしようとした場合、どのようにするのが
ベストなのかが分かりません。

電話番号1,電話番号2といったような要素を用意して、
データベースを検索するときには両方を参照する以外に
手は無いのでしょうか?

それとも顧客番号と複数電話番号検索用IDのようなものを対応させ、
電話番号データベース(電話番号ID、電話番号1、電話番号2、電話番号3)
のようなものを用意することで調べるのでしょうか?

正直、どちらもデータベース要素が3つ以上の場合に融通が利かなかったり
まだるっこしい感じがしたりするのですが、代替手段を良く知りません。
何か良い方法ございましたら、ご教示願えませんでしょうか?

Aベストアンサー

正規化して、電話番号を別テーブルに持つか、
顧客マスターに、電話1、電話2、電話3・・・と複数フィールドを持たせるか、
それぞれメリットとデメリットがあるので、
使い方次第でどちらでもいいかと思います。

固定、FAX、携帯、だけでなく、部署別とかで、多数ある可能性があるのなら、
別テーブルにした方がいいでしょう。

設計例

[顧客ID][表示順][電話番号][種別]
1111__1___012-111-1111 固定
1111__2___012-111-2222 FAX
1111__3___012-111-3333 携帯

顧客ID と 表示順 で複数フィールド主キーに設定

柔軟性が高いです。電話番号がどれだけ増えても対応できます。
joinしたものを対象に検索すれば、インデックスを使って高速に処理できます。


最大3つとか5つまでとか限定できるなら顧客マスターに全部入れてもいいでしょう。
ANo.4 で提案されている検索用のフィールドを作成するのもなかなかいいアイデアですが、デー多数が多いとインデックスが利用できないので重くなる可能性があります。
その場合は、面倒ですが、Orで連結した条件式を用意すればいいでしょう。

[電話1]=[検索番号] Or [電話2]=[検索番号] Or [電話3]=[検索番号]

正規化して、電話番号を別テーブルに持つか、
顧客マスターに、電話1、電話2、電話3・・・と複数フィールドを持たせるか、
それぞれメリットとデメリットがあるので、
使い方次第でどちらでもいいかと思います。

固定、FAX、携帯、だけでなく、部署別とかで、多数ある可能性があるのなら、
別テーブルにした方がいいでしょう。

設計例

[顧客ID][表示順][電話番号][種別]
1111__1___012-111-1111 固定
1111__2___012-111-2222 FAX
1111__3___012-111-3333 携帯

顧客ID と 表示順 で複数フィ...続きを読む

QPHP・MYSQLで複数のチェックボックスを使う場合

いつもお世話になっております。

チェックボックスの値を
<input type="checkbox" value="ok" name="check[]">
として配列で渡し、ここで選択された値をforeachで回してvalueがokの場合は対応するカラムにokを挿入しています。
このやり方では、例えばチェックボックスでチェックさせたい項目が100個あった場合はチェック結果を格納するテーブルに
ck1 ck2 ck3 ck4 ck5 ck6......ck99 ck100
のように100個カラムを作る必要があります。
100個作るのが面倒・・・というわけでは無く、このやり方で良いのだろうかと疑問に感じてきました。

大量のチェックボックスを処理する場合、他に良いテーブル構造や方法などありましたら教えていただけるとうれしいです。

Aベストアンサー

>foreachで回してvalueがokの場合は対応するカラムにokを挿入

という運用方法であれば

><input type="checkbox" value="ok" name="check[]">

では実現できません。

たとえば
<input type="checkbox" value="1" name="check[]">
<input type="checkbox" value="2" name="check[]">
<input type="checkbox" value="3" name="check[]">
などのようにvalue値で判断するか、
<input type="checkbox" value="1" name="check[1]">
<input type="checkbox" value="1" name="check[2]">
<input type="checkbox" value="1" name="check[3]">
のようにvalueは適当にいれておいてnameでユニークにするのが
妥当でしょう。いずれのやり方でも

>ck1 ck2 ck3 ck4 ck5 ck6......ck99 ck100
>のように100個カラムを作る必要があります。

とする必要はなく、「チェックされたものを入れておくカラム」が
1個あれば、あとは1番と3番と7番がチェックされました・・・
のように1チェックにつき1レコードをもてばカラムを
増やす必要はありません。

>foreachで回してvalueがokの場合は対応するカラムにokを挿入

という運用方法であれば

><input type="checkbox" value="ok" name="check[]">

では実現できません。

たとえば
<input type="checkbox" value="1" name="check[]">
<input type="checkbox" value="2" name="check[]">
<input type="checkbox" value="3" name="check[]">
などのようにvalue値で判断するか、
<input type="checkbox" value="1" name="check[1]">
<input type="checkbox" value="1" name="check[2]">
<input type="...続きを読む

QPHPでフォームからデータDBに書き込むサンプル

PHPで、フォームから入力されたデータをMySQLのDBへ書きこみ、次画面でHTML内に入力されたデータ表示するようなサンプルプログラム等、どこかに公開されてないでしょうか。
若しくは、ご存知の方、教えて頂ければ幸いです。

1、フォームへデータ入力
2、サブミットを押す。
3、DBへデータを書き込み。
4、HTML内にデータを表示する。

というような流れ。

Aベストアンサー

書いてみました。
MySQL環境が無く、テストしていないので分かりませんが、
タブン動くと思いますよ^^

フォーム表示 → 登録ボタンクリック → データベース登録 → データベース検索 → 検索結果のHTMLでの表示

詳しい人ツッコミお願いします!

<!-- ここからヘッダー部分です -->
<html>
<head>
<title>テストスクリプト</title>
</head>
<body>
<!-- ここまでヘッダー部分です -->

<?php

# フォームからPOSTデータが送信されていない場合の処理
# 意味は"もしregという名前のPOSTデータが無かったら?"
if(!$_POST['reg']){

# HTMLで入力フォームを表示(送信ボタンクリックでこのスクリプト自身にPOST)
print <<< html
MySQLへ登録してそれをHTMLで表示するスクリプト
<form action="$PHP_SELF" method="post">
<input type="text" name="reg">
<input type="submit" value="登録">
</form>
html;

# regと言うPOSTデータが送信されてきたら以下の処理
}else{

# データベースに接続(アドレス・ポート番号・ユーザー名・パスワードを環境に合わせて書き換える)
$dbcon = mysql_connect("MySQLサーバのアドレス:ポート番号","ユーザー名","パスワード");

# データベースを選択(データベース名を環境に合わせて書き換える)
mysql_select_db("データベース名");

# SQL文を用意(登録用)
# 意味は"$_POST['reg']というデータをテーブル名と言うテーブルに登録します"
$sql_reg = "insert into テーブル名 values('" . $_POST['reg'] . "')";

# データを登録
$result_reg = mysql_query($sql_reg);

# 登録に成功したら以下の処理
# 意味は"もし$result_regが成功したら?"
if($result_reg){

# 参照用SQL文を用意(テーブル名を環境に合わせて書き換える)
# 意味は"テーブル名というテーブルの全てのカラムを検索します"
$sql_sel = "select * from テーブル名";

# 登録したデータを参照する
$result_sel = mysql_query($sql_sel);

# 登録データの参照に成功したら以下の処理
# 意味は"もし$result_selが成功したら?"
if($result_sel){

# 参照したデータを全部表示(カラム名を環境に合わせて書き換える)
while ($item = mysql_fetch_array($result_sel)){
print $item['カラム名'] . "<BR>";
}

# データベース接続を切断
mysql_close($dbcon);

# 登録データの参照に失敗したら以下の処理
}else{

# エラーメッセージを表示
print "データの参照に失敗しました。";

# データベース接続を切断
mysql_close($dbcon);

}

# 登録に失敗したら以下の処理
}else{

# エラーメッセージを表示
print "登録に失敗しました";

# データベース接続を切断
mysql_close($dbcon);

}

}

?>

<!-- ここからフッター部分です -->
</body>
</html>
<!-- ここまでフッター部分です -->

参考URL:http://lcl.web5.jp/prog/phpdb.html

書いてみました。
MySQL環境が無く、テストしていないので分かりませんが、
タブン動くと思いますよ^^

フォーム表示 → 登録ボタンクリック → データベース登録 → データベース検索 → 検索結果のHTMLでの表示

詳しい人ツッコミお願いします!

<!-- ここからヘッダー部分です -->
<html>
<head>
<title>テストスクリプト</title>
</head>
<body>
<!-- ここまでヘッダー部分です -->

<?php

# フォームからPOSTデータが送信されていない場合の処理
# 意味は"もしregという名前のPOS...続きを読む

Qチェックボックス複数選択 mysql受け渡し

PHPを習いはじめたのですが分からない所がありましたので質問をさせて頂きました。
チェックボックスを作り複数選択されたデータをMYSQLに受け渡したいのですがどうしてもうまくいきません。受け渡しが出来たかと思えばARRAYのみ表示されてしまい、重要な内容が一切表示されません。
こちらがスクリプトになります。
<tr>
<td>(チェックボックス)<br />順番不問</td>
<td>
<span class="checkbox"><input name="check1[]" type="checkbox" value="aaa" />aaa</span>
<span class="checkbox"><input name="check1[]" type="checkbox" value="bbb" />bbb</span>

</tr>
</td>

//mysql
$sql = "insert into table values('$check1')";

多分この$sql分のなにかが間違ってると思うですがいくらやっても
出来ません、、
mysql の設定はカラムはcheck1となっており、text, 値はnullとなっております。
どのなたか複数チェックボックスで表示された項目をMYSQLのデータベースに移行できる方法をご存知の方お伺い出来ませんでしょうか。
宜しくお願い致します。

PHPを習いはじめたのですが分からない所がありましたので質問をさせて頂きました。
チェックボックスを作り複数選択されたデータをMYSQLに受け渡したいのですがどうしてもうまくいきません。受け渡しが出来たかと思えばARRAYのみ表示されてしまい、重要な内容が一切表示されません。
こちらがスクリプトになります。
<tr>
<td>(チェックボックス)<br />順番不問</td>
<td>
<span class="checkbox"><input name="check1[]" type="checkbox" value="aaa" />aaa</span>
<span class="checkbox"><input name="c...続きを読む

Aベストアンサー

#3さんと同じような事ですが、受け取り側は配列での処理になります。
チェックが一つでも変数ではなく要素が一つの配列としてみなされます。
$arr_check1 = $_POST['check1'];
として受け取るとチェックをした数だけ要素を持つ配列になるので
例えばカラムcheck1にチェックをつけた項目をスペースで区切って格納したいのであれば、
if(isset($arr_check1) and count($arr_check1)>0){
$str_check1 = "";
for($i=0;$i<count($arr_check1);$i++){
if($i == 0){
$str_check1 .= $arr_check1[$i];
}
else{
$str_check1 .= " " . $arr_check1[$i];
}
}
}

のように一つの文字列にしてから$str_check1をSQLでカラムにインサートします。

Qリスト上のcheckboxのON/OFF状態をうまくMySQLに格納したい

次のような、3項目×100人分(100行)からなるシンプルな表があります。
(環境: MySQL5.0.37、PHP5.2.2)

左から、出席番号を表すテキストボックス(Readonly)、
宿題の提出の有無を表すチェックボックス、氏名です。
表の一番下に、登録ボタン(submit)があります。

-------------------------------
出席番号 チェック  氏名
myNo   myCheck  myName
-------------------------------
[  1]   [ ]     阿藤
-------------------------------
[  2]   [ ]     伊藤
-------------------------------
[  3]   [ ]     宇藤
-------------------------------
:(以降、100人続く)

[チェック状態をDBに登録する]


このチェックボックスのOn/Offの状況を、SQLのUpdate文で一括登録したいのですが、
うまくできません。


テキストボックスに記入された出席番号の配列($myNo[])には、count($myNo)と
やると100があると返ってきます。

チェックボックスに記入された配列($myCheck[])は、チェックされた場合しか
配列に格納されないという特性があるようです。

何もチェックしないでSubmitボタンを押下した場合、count($myCheck)はゼロを
返してくるのです。

ですので、つい最近、全然別件で、同じような質問をして解決したばかりですが、
http://oshiete1.goo.ne.jp/qa5054417.html
ここにある解法は通じないように思います。

以下のコメント部分、どのように記述すればうまくUpdate文を適用できるでしょうか?


<?php

$con = mysql_connect(localhost, username, userpw);

$selectdb = mysql_select_db(dbname, $con);

//■■■■■■■↓↓↓↓質問の本題:ここの部分をどう記述すればいいですか?
if ($_POST["exec"] != "") {
$sql = "update mytable set myCheck = ?????? where myNo = ??????";
mysql_query($sql, $con);
}
//■■■■■■■ここまで


$sql = "select * from mytable";

$rst = mysql_query($sql, $con);
$recmax = mysql_num_rows($rst);

$body .= "<table border=\"1\">\n";
$body .= "\t<tr>\n";
$body .= "\t\t<th>出席番号</th>\n";
$body .= "\t\t<th>チェック</th>\n";
$body .= "\t\t<th>氏名</th>\n";
$body .= "\t</tr>\n";

for ($recnum = 0; $recnum < $recmax; $recnum++) {

$col = mysql_fetch_array($rst);

$body .= "\t<tr>\n";

$body .= "\t\t<td><input type=\"text\" name=\"myNo[]\" value=\"" . $col["myNo"] . "\" readonly></td>\n";

$value_myCheck = "";
if ($col["myCheck"] == '1') {
$value_myCheck = " checked";
}
$body .= "\t\t<td><input type=\"checkbox\" name=\"myCheck[]\" value=\"1\"" . $value_myCheck . "></td>\n";

$body .= "\t\t<td>" . $col["myName"] . "></td>\n";

$body .= "\t</tr>\n";

}

$body .= "</table>\n";

?>
<html>
<head></head>
<body>
<form method="post" action="<?php $_SERVER['PHP_SELF'] ?>">
<?= $body ?>
<input type="submit" name="exec" value="チェック状態をDBに登録する">
</form>
</body>
</html>

次のような、3項目×100人分(100行)からなるシンプルな表があります。
(環境: MySQL5.0.37、PHP5.2.2)

左から、出席番号を表すテキストボックス(Readonly)、
宿題の提出の有無を表すチェックボックス、氏名です。
表の一番下に、登録ボタン(submit)があります。

-------------------------------
出席番号 チェック  氏名
myNo   myCheck  myName
-------------------------------
[  1]   [ ]     阿藤
-------------------------------
[  2]   [ ]  ...続きを読む

Aベストアンサー

手順は2つ。

まず、全員のチェックをはずします。

$sql = "update mytable set myCheck =0";

その次に、値を受け取ったものだけチェックをします

$myChecks=implode(",",$myCheck);
$sql = "update mytable set myCheck =1 WHERE myNo in ({$myChecks})";

QボタンをクリックでPHP文を実行

ボタンをクリックしたときのみPHP文を実行したいのですが・・・

<input type="button" onClink="<?php~?>">
でいけるかと思ったのですが、
ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。

onClink="window.open(test.php)"
という方法以外でお願いします。

Aベストアンサー

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作します

ですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。
ボタンを押したらサーバーにリクエストする という動作ならば可能です。

つまり
質問で言われているような
onClink="window.open(test.php)"

<form name="f1" action="test.php" method="post">
<input type="submit" name="submit" value="submit" />
</form>
等のような形になります

こういった一般的な方法だと いちいち画面が切り替わったようになってしまうのを嫌って Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎません

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、...続きを読む

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング