[PHP-users 35386] Re: チェックボックスにチェックがない場合

Hisamitsu Issei ds1i-hsmt @ asahi-net.or.jp
2010年 10月 23日 (土) 12:24:30 JST


久光です


 説明が足りてなくてすみません。いろいろなフォームページが用意されていて、それらから送られてくるフォームデータを使ってMySQLを更新するphpファイルを作っています。

<input type="checkbox" name="hoge[]" value="1">
<input type="checkbox" name="hoge[]" value="2">
といったページから送られてきた配列を
implode(',', $_REQUEST['hoge'])
のようにカンマ区切りにまとめてMySQLのhogeフィールドに入力して更新する処理があります。チェックボックス全てがオフのときはMySQLのhogeフィールドは空値に更新します。

 ここで$_REQUEST['hoge']が存在しない場合は、全てのチェックボックスがオフだと判断してMySQLのhogeフィールドは空値にしてしまいたいところですが、今回の案件ではユーザ側の必要に応じていくつかのページが用意(どれくらいのパターンが用意されるかは未定)されていて更新が必要なフィールドの情報だけが送られてきます。MySQLのhogeフィールドを更新する必要がない場合には上述のようなチェックボックスが存在しないページからデータが送られてくるかもしれないので$_REQUEST['hoge']が存在しないからといってMySQLのhogeフィールドを空値に更新してしまうと想定外の挙動になってしまいます。

送られてきた値の中に$_REQUEST['hoge']が存在しない場合
(1)MySQLのhogeフィールドは更新しない
(2)MySQLのhogeフィールドを空値に更新する
のどちらなのかを区別しないといけないのです。対処法として私は

<input type="hidden"   name="hoge[]" value="no data">
<input type="checkbox" name="hoge[]" value="1">
<input type="checkbox" name="hoge[]" value="2">
というようにhogeフィールド更新のチェックボックスを作るページでは必ずhiddenで何か一つ値を入れておくというルールにして、$_REQUEST['hoge']が存在しない場合はMySQLのhogeフィールドの更新は必要なしと決め打ちできることにしようと考えたわけです。


 榎田様からアドバイスいただいたチェックボックスとhiddenをセットにする方法は入力用ページをphpで生成させるときにforeachをちょっと修正すればできあがるし、

if (isset($_REQUEST['hoge'])) {
   foreach ($_POST['hoge'] as $val) {
      if ($val !== 'no data') {
         // 処理
      }
   }
} else {
   // MySQLのhogeフィールドは更新不要なのでなにもしない。
}

という感じで私にとっては見やすいスクリプトになりました。ありがとうございます。




PHP-users メーリングリストの案内