アプリ版:「スタンプのみでお礼する」機能のリリースについて

次のような、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>

A 回答 (4件)

手順は2つ。



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

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

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

$myChecks=implode(",",$myCheck);
$sql = "update mytable set myCheck =1 WHERE myNo in ({$myChecks})";
    • good
    • 0
この回答へのお礼

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

#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";

でもフローを変えればいけそうです
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/23 20:43

yambejpさんの



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

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

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

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

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

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

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

お礼日時:2009/06/23 20:41

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



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

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

この回答への補足

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

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

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

補足日時:2009/06/21 01:12
    • good
    • 0

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