チェックボックスの値のチェック

このQ&Aのポイント
  • HTMLのフォームのチェックボックスから配列でphpに値を渡す際、チェックした値が1個しかない場合は変数として受け取りますか?
  • 値のチェックはissetのみで良いですか?
  • MySQLの繰り返し処理でチェックボックスの個数分のレコードを削除するのは一般的な処理ですか?
回答を見る
  • ベストアンサー

チェックボックスの値のチェック

プログラム初心者です 質問1 HTMLのフォームのチェックボックスから配列でphpに値を渡したときにチェックした値が1個しかなかった時には配列として受け取っているのでしょうか?それとも一個しかない場合は変数として受けとっているのでしょうか? 現状ではissetで調べて値がある場合にはその配列をforeachで取り出して実行しています(実際にやってみたら値1個でも動いていますが気になったので教えてください) 値のチェックはissetのみでいいでしょうか? 質問2 MySQLの方は、チェックの個数分のレコードを削除するために繰り返し処理の中でsqlを最大20回発行するのはダメな処理ですか?(チェック1個の場合は1回のみsqlを発行しています) 一般的に使われているならこれでいこうと思います よろしくお願いします

  • flash0
  • お礼率97% (297/306)
  • PHP
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
noname#244856
noname#244856
回答No.1

(インデントには全角スペースを使わせていただきます。) 【回答1】 1個以上 → 配列です。 0個 → 受け取りません。 手を抜くなら isset だけで十分ですが、厳密に "不正な" リクエストも考慮するならば is_string / is_array を活用した型チェックも欠かせません。毎回全部このチェックを記述するのは面倒なので適当に関数を作っておくといいでしょう。あらゆるニーズに対応できるように作成した関数があるので良ければ活用してください。 汎用的な変数構造フィルタリング関数 http://qiita.com/mpyw/items/c39b9ee695a5c2e74627 構造をフィルタリングすると同時にUTF-8バリデーションが行われ、UTF-8として正しくないバイト列を検知して無効化します。他の言語ではこういったエンコーディングバリデーションをするのがほぼ当たり前になってるようですが、PHPでは何故かあんまり浸透していないみたいですね・・・ 使用例: 名前: <input type="text" name="name" value="" /><br /> <input type="checkbox" name="checks[]" value="A" />A<br /> <input type="checkbox" name="checks[]" value="B" />B<br /> <input type="checkbox" name="checks[]" value="C" />C<br /> 備考1: <input type="text" name="options[]" value="" /><br /> 備考2: <input type="text" name="options[]" value="" /><br /> ↓ extract(filter_struct_utf8(INPUT_POST, array(   'name' =>     FILTER_STRUCT_FULL_TRIM,   'checks' =>     FILTER_STRUCT_FORCE_ARRAY,   'options' =>     FILTER_STRUCT_FORCE_ARRAY | FILTER_STRUCT_FULL_TRIM, ))); これで $name … 両端がトリミングされた文字列 $checks … 一次元配列 $options … 要素が全てトリミングされた一次元配列 になることが必ず保証されます。 しかし、チェックボックスに関しては、これではフォーム上に存在するものかどうかまでの確認は出来ません。もしそれを行いたいのであれば、そもそも「値」でチェックしようとするのをやめ、「キー」でチェックしてください。具体的には下記のようにします。 名前: <input type="text" name="name" value="" /><br /> <input type="checkbox" name="checks[0]" value="A" />A<br /> <input type="checkbox" name="checks[1]" value="B" />B<br /> <input type="checkbox" name="checks[2]" value="C" />C<br /> 備考1: <input type="text" name="options[]" value="" /><br /> 備考2: <input type="text" name="options[]" value="" /><br /> ↓ $default_checks = array('A', 'B', 'C'); extract(filter_struct_utf8(INPUT_POST, array( 'name' =>     FILTER_STRUCT_FULL_TRIM,   'checks' =>     array_fill(0, count($default_checks), null),   'options' =>     FILTER_STRUCT_FORCE_ARRAY | FILTER_STRUCT_FULL_TRIM, ))); これで $checks の各要素が NULL かどうかの判定を行えばいいだけです。変数が定義済みであることが確定しているので、 isset を使う必要はありません。単純に !== null として比較してください。 【回答2】 1回で全部削除できますよ。PDOのプリペアドステートメントを用いるならば、上記の $checks を受け取った後、 foreach ($checks as $k => $v) {   if ($v !== null) {     $params[] = $default_checks[$k];   } } if (!empty($params)) {   $sql = sprintf(     'DELETE FROM table WHERE checks IN (%s)',     implode(', ', array_fill(0, count($params), '?'))   );   $stmt = $pdo->prepare($sql);   $stmt->execute($params); } というように、「WHERE ... IN ( ... )」の条件部分に可変長のプレースホルダを設けてください。なお、$v は NULL でないかどうかを判定するためだけに用い、それ以外の用途に使ってはいけません。それが「A」「B」「C」のどれかである保証はないからです。 あと、言うまでもないですがCSRF攻撃対策は行ってくださいね・・・!

flash0
質問者

お礼

回答ありがとうございます すいません。mysqliの手続き型で同じようなことはできますか?

その他の回答 (1)

noname#244856
noname#244856
回答No.2

Mysqli手続き型ならこうですかね・・・ (手続き型はコードが長くなるのであんまり好きじゃないですが) foreach ($checks as $k => $v) {   if ($v !== null) {     $params[] = $default_checks[$k];   } } if (!empty($params)) {   $sql = sprintf(     'DELETE FROM table WHERE checks IN (%s)',     implode(', ', array_fill(0, count($params), '?'))   );   $stmt = mysqli_prepare($link, $sql);   call_user_func_array(     'mysqli_stmt_bind_param',     array_merge(       array($stmt),       array(str_repeat('s', count($params))),       $params     )   );   mysqli_stmt_execute($stmt); } Mysqli使ったこと無い上にデバッグしてないのでミスあったらごめんなさい m(_ _)m

flash0
質問者

お礼

回答ありがとうございます 無理いってすいません。いろいろと参考になりました

関連するQ&A

  • チェックボックスで受け取った値のPDOでの使い方

    現在PHPとSQLを使ってHPを作ろうとしている初心者です。 似たような質問は多くネットで見受けられるのですがうまくいかず悩んでます。 初歩的な質問で恐縮ですがご協力をお願いいたします。 やろうとしていることは、チェックボックスで選択された項目をMYSQLでSELECT文で抽出するというものです。 以下、現在作成中のプログラム(一部抜粋)です。 <?php $stcd=$_POST["stcd"];  ←ここでチェックボックスの値を受け取っているつもりですが、配列の観点をのちのSQL文含めどのように織り込めば良いかがわかりません。 $db = new PDO("mysql:host=localhost;dbname=".$dbname,$username,$password); $sql="SELECT * FROM property WHERE stcd ={$stcd}"; $res=$db->query($sql); $rows=$res->fetchAll(PDO::FETCH_ASSOC); echo '<br />検索結果は'.$res->rowCount().'件です<br/>'; foreach($rows as $r){ echo '<td>'.$r['price'].'円</td>'; echo '<td>'.$r['stname'].'</td>'; } ?> チェックボックスの受け取り方が明らかにこれではできないとわかってはいるのですが、解決策がさっぱりわかりません。 ご協力をお願いいたします。

    • ベストアンサー
    • PHP
  • チェックボックスの値の受け渡し

    PHP&MySQLで勉強しているものです。 ブラウザ上のチェックボックスにチェックすると、保存時にフィールド(CB)に値:1を書き込み、逆にブラウザのオープン時にフィールドの値が1の時にチェックボックスがチェックされた状態で表示させたいと思っています。 $sql="SELECT ID,NAME,CB FROM CASE" $rs=mysql_query($sql$dbHd) $row=mysql_fetch_row($rs) <INPUT type="checkbox" name="ip02" value"<?php print($row[2]) ?>"> 上記のようなINPUTを書いてみたものの、値はとれずの状態です。 どのように書き換えていけばいいでしょうか?

    • ベストアンサー
    • PHP
  • ループでチェックボックスにcheckedを入れたい

    昨日質問させて頂きました件は、上手く行きました。ありがとうございました。また、行き詰ってしまったのでよろしくお願いいたします。 $intersectという配列があります。中身はarray(20,22)です。 データベースのテーブルから、fetch_arrayですべてを取り出し、 この値と同じである場合、チェックボックスにチェックを入れたいと考えています。 しかし、最後の値しかチェックボックスにチェックが入りません。どうかよろしくお願いいたします。 ********************************************************** $sql = "SELECT * FROM option_name"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {  $subject = $row["subject"];//題名  $option_no = $row["opno"];//プランNO foreach ($intersect as $value){  if($value == $option_no){   $checked = "checked";   }else{   $checked = " "; } } $op_subject .= "<input type='checkbox' name='subject[]' value='$option_no' $checked>$option_no$subject<br>"; } print $op_subject;

    • ベストアンサー
    • PHP
  • 配列に値が入らない

    PHP初心者です。 <?php $sql = sprintf('SELECT * FROM image WHERE img_url="%s"', mysql_real_escape_string('img_url') ); $record = mysql_query($sql)or die(mysql_error()); while($data = mysql_fetch_assoc($record)) { $image = array($data['img_url']); } ?> これで $image にはデータベースの img_url のフィールドの値がすべて代入されるはずだったのですが なぜか配列には何も値が入りません。 何が悪いのか、配列についていろいろ調べてはみたのですが、どうしてもわかりませんでした。 どうやったら値が入るようになるか、教えていただけないでしょうか? よろしくお願いします。

    • 締切済み
    • PHP
  • C#で配列の値をチェックするメソッドを書きたい

    C#の配列についてお教え頂けませんでしょうか? CSVファイルから1行読取り、配列に格納しています。 string[] rowdata; string x; int y; double z; TextFieldParser Parser = new TextFieldParser(FILEPATH, Encoding.GetEncoding("shift_jis")); while (!Parser.EndOfData) { //1行読取り rowdata = csvParser.ReadFields(); //読み取った値を変数に x = rowdata[0]; //string y = rowdata[1]; //int z = rowdata[2]; //double } rowdata[0~3]を変数に格納する前に、データのチェックをおこないたいです。 例えば、rowdata[1]はint型変数に格納されます。しかしrowdata[1]に格納された値が「A1」とあった場合、int型変数yには格納できずエラーが起こります。 よって、rowdata[1]に数値以外の文字列があったら「0」に置き換えるなどの処理をいれたいです。 なので、配列を受け取ってデータチェックをするメソッドを作りたいと思いますが、どのように作っていいかがわかりません。 1つのメソッドでint、double、stringかどうかの、チェックを行いたいですが、そのようなことは可能なのでしょうか? 下記のように3つメソッドを作って、データをメソッドに渡しチェックを行なうのがいいのでしょうか? string CheckData(string[] arr){}; int CheckData(int[] arr){}; double CheckData(double[] arr){}; やりたい事は、 メソッド(配列を受取る) rowdata[0]が渡された場合、中身はstringかのチェック。問題なければ格納されている値を返す。問題があれば、何らかの処理。 rowdata[1]が渡された場合、中身はintかのチェック。問題なければ格納されている値を返す。問題があれば、何らかの処理。 rowdata[2]が渡された場合、中身はdoubleかのチェック。問題なければ格納されている値を返す。問題があれば、何らかの処理。 以上のような事です。宜しくお願い致します。

  • コンボボックスやリストボックスの値設定

    コンボボックスやリストボックスに データベースの値で設定するときについて疑問があります。 現システムでは JSP内でsqlタグを使ってレコードセットを取得し <core:forEach>でぐるぐるまわして値をセットしています。 ↓こんな感じです。 ----------------------------------------------------------- <sql:setDataSource var="db" dataSource="jdbc/xxxxx" /> <sql:query var="rs" dataSource="${db}" > SELECT * FROM XXXXX </sql:query> <select name="xxxxx"> <c:forEach var="row" items="${rs.rows}" > <option value="${row['xxxxx']}" <c:if test="${row['xxxxx'] == requestScope.xxxxx}" > selected </c:if> >${fn:escapeXml(row['xxxxx'])}</option> </c:forEach> </select> ----------------------------------------------------------- これでもちゃんと動いてるのですがMVCを考えるとJSP内でDB接続って疑問に感じます。 Sevletでコンボボックスに必要な値を取得しておいてリクエスト属性にセットし JSP内では変数をぐるぐる回すことも考えたのですが、 コンボボックスやリストボックスの数が増えたり面倒に思います。 コンボボックスやリストボックスに値を設定する場合は どういう方法がよいのでしょうか?

    • ベストアンサー
    • Java
  • 値をチェックしてから...

    $before という変数に goo,okwave,monster という値が入っています。この値は単語を,で分けられています。 行いたいことは、まず,で分けている単語を一つ一つにして hoge というテーブルの word に同じ単語が入っているレコードを探し出し(select * from hoge where word = '{$単語}')、そのレコードの ok というカラムに入っている値が 10 の場合は $after という変数にその単語を,で分け挿入します。 これを行う簡単なプログラムをお願いします。

    • ベストアンサー
    • PHP
  • チェックボックスでチェックした配列の値をDBに。

    チェックボックスでチェックした配列の値を データベースのカラム名と照らし合わせて 一致する所に「1」を入れたいのですが、うまくいきません。 PHP Version 5.1.6 MySQL - 5.0.45 で運用しています。 どうしたら、入れることができるでしょうか? ご教授、よろしくお願いいたします。 1 送るページ $sql = "select * from `class_tbl`"; $rest = mysql_query($sql, $con); while($col = mysql_fetch_array($rest)) { $classID = $col["classID"]; $class_name = $col["class_name"]; $sql = "select * from `member_sub_tbl` where `ID` ='$ID'"; $rst = mysql_query($sql, $con); while($col = mysql_fetch_array($rst)) { $kekka = $col["$classID"]; if($kekka==1) { echo <<<EOF <input type="checkbox" name="classID[]" value="$classID" checked/> $class_name EOF; } else{ echo <<<EOF <input type="checkbox" name="classID[]" value="$classID" /> $class_name EOF; } } } echo <<<EOF <input name="ID" type="hidden" value="$ID" /> EOF; 2 受けるページ $ID=$POST["ID"]; $classID=$POST["classID"]; var_dump($_REQUEST); 以下のように表示しています。 array(3) { ["classID"]=> array(10) { [0]=> string(4) "1010" [1]=> string(4) "1050" [2]=> string(4) "1110" [3]=> string(4) "1182" } ["sn"]=> string(2) "45" ["PHPSESSID"]=> string(32) "********************" } 「ID」の行に、配列の「1010」「1050」と 「member_sub_tbl(テーブル)」の「カラム名」を比較して、一致する所に「1」を入れたいのですがうまくいきません。 ※update をしたいのです。 試行錯誤していますが、方法が分かりません。 ご教授、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • チェックボックスからデータ受け取り

    htmlフォーから <input type="text" name="name"> <input type="checkbox" name="check[]" value="softbank">ソフト <input type="checkbox" name="check[]" value="docomo">ドコモ <input type="checkbox" name="check[]" value="au">Au foreach(${"_" . $_SERVER["REQUEST_METHOD"]} as $k=>$v) {  ${$k}=$v; //一括サニタイズ処理します。 } $_POSTのデータは$sample的な使い方ですが、 echo $name; →は表示OK 問題はチェックボックスデータですが、配列では上のforeachの処理では、受け取れません。上のforeach処理のような方法で、配列を$sample[]としても受け取るにはどのようにすればいいかアドバイス下さい。 当然$sample[]で受け取った後は、foreachとかでデータを取得処理します。

    • ベストアンサー
    • PHP
  • PHPで、配列に値をうまく入れれません。

    PHP初心者です。 PHP、Mysqlを使い、検索サイトを作ろうとしています。 チェックボックスでチェックされた値を、一覧.phpに送り、 if(チェックされた値) { $sql1 = select * from table where like '%検索%'; } $sql1の結果を配列に入れて、そのidで以下のように絞込をしたいのですが・・・ $sql2 = select * from table id = $sql1(ここで例えば2,5,7とかって入ってほしい); ググってfetchやらなんやら試したのですが、2,5,7がはいってたとしたら、最後の7だけしか取り出せなかったりと苦戦しています。 よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう