みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

リスト上の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>

投稿日時 - 2009-06-20 22:33:09

QNo.5060783

暇なときに回答ください

質問者が選んだベストアンサー

手順は2つ。

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

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

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

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

投稿日時 - 2009-06-21 00:59:50

お礼

yamabejpさん、いつもお世話になっております。
大変参考になるご回答ありがとうございます。

> 手順は2つ。
> まず、全員のチェックをはずします。

なるほど!ものすごい目からウロコです。


> その次に、値を受け取ったものだけチェックをします
> $myChecks=implode(",",$myCheck);
> $sql = "update mytable set myCheck =1 WHERE myNo in ({$myChecks})";

なるほど、そういえば、SQL文でin(a,b,c)なる構文もありましたね。
それとimplode関数でカンマ区切りの文字列に仕立てて
in()内に展開させるわけですね。


ただ、結論的にこのまま組み込んでもだめでした。

> $myChecks=implode(",",$myCheck);

は、

$myNos=implode(",",$myNo);

のタイプミスですよね?そうですと、元質問に書いたように
MyNoはチェックの有無に関わらず全ての値が配列$myNoに格納されてしまうようです。

checkboxやめてradioにすれば解決しそうですが。。。

投稿日時 - 2009-06-21 22:01:06

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

#3のフォローありがとうございます。
ソースを読み違えていました

$body .= "<td><input type='checkbox' name='myCheck[]' value='{ $col["myNo"]}'{$value_myCheck}></td>\n";

ですね。または

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

でもフローを変えればいけそうです

投稿日時 - 2009-06-22 09:41:16

お礼

yambejpさん、たびたびありがとうございました。
おかげさまで頭のスイッチを切り替えられました。
解決して大変助かりました。ありがとうございました。

投稿日時 - 2009-06-23 20:43:37

ANo.3

yambejpさんの

> $myChecks=implode(",",$myCheck);

は意図的にあっているかと思います。
問題は、配列 $myCheck のデータ内容ではないでしょうか。

> $body .= "\t\t<td><input type=\"checkbox\" name=\"myCheck[]\" value=\"1\"" . $value_myCheck . "></td>\n";

これでは各々のチェックボックス判別に意味をなさないと思うので、
value を 1 ではなく $col["myNo"] をあてれば
チェックされた該当の番号のみが送られると思います。

投稿日時 - 2009-06-21 22:51:51

お礼

atseさん、レスありがとうございました。

>チェックされた該当の番号のみが送られると

なるほど!
ようやく発想の転換ができました。
checkboxというだけで、1を送るという固定概念に
とらわれていました。
おかげさまで解決いたしました。ありがとうございました。

投稿日時 - 2009-06-23 20:41:48

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

このUpdate処理で既存データが
Off→Onになる処理だけではなく

On→Offになったり
Off→Onにと、どちらの処理も行いたいということでしょうか?

投稿日時 - 2009-06-21 00:55:21

補足

ryoumasanさん、前回質問でも大変お世話になりました。

>On→Offになったり
>Off→Onにと、どちらの処理も行いたいということでしょうか?

ご推察のとおりです。チェックしてあってもチェックが外れたら
0(またはNULLとか空白"")をUpdateしたいと思っております。

投稿日時 - 2009-06-21 01:12:53

あなたにオススメの質問