チェックボックス
HTMLの入力フォームに、チェックボックスというのがある。
ラジオボタンと違って、複数選択できる奴。
チェックボックスはこれ。
ラジオボタンはこれ。
困りごと
複数選択出来るわけだから、チェックされたものを配列に格納したい。
ところが、nameをすべて同じにして送信すると、$_POSTや$_GET配列からはチェックされた中で一番下にあるものだけしか取得出来ない。
つまり、
<input type="checkbox" name="chk" value="1">1
<input type="checkbox" name="chk" value="2">2
こーゆーのから送信したデータをPHPで取得した場合の$_POST['chk']や$_GET['chk']の中身は、<input type="checkbox" name="chk" value="2">2
1と2がチェックされてる場合も、2だけがチェックされてる場合も2になる。
解決方法
これを解決するにはname属性の値のケツに[]を書いてやればいい。
<input type="checkbox" name="chk[]" value="1">1
<input type="checkbox" name="chk[]" value="2">2
<input type="checkbox" name="chk[]" value="2">2
こうすることで、$_POST['chk']や$_GET['chk']は配列になり、配列の要素はチェックされたデータのvalue属性の値になる。
検証
以下のようなサンプルスクリプトを書いた。
<?php
echo "<pre>";
var_dump($_POST['check']);
echo "</pre>";
echo "<pre>";
var_dump($_POST['check']);
echo "</pre>";
echo <<< EOF
<form action="{$_SERVER['PHP_SELF']}" method="post">
<input type="checkbox" name="check[]" value="1">1<br>
<input type="checkbox" name="check[]" value="2">2<br>
<input type="checkbox" name="check[]" value="3">3<br>
<input type="checkbox" name="check[]" value="4">4<br>
<input type="checkbox" name="check[]" value="5">5<br>
<input type="submit">
</form>
EOF;
?>
これを実行する。
期待通りの動作。
匿名
XSS危ないですよー
匿名
XSS危ないですよー
--------------------
echo "";
foreach ($_POST as $key => $val) {
$_POST[$key] = htmlspecialchars($val, ENT_QUOTES);
}
var_dump($_POST['check']);
echo "";
--------------------
とすべき。