一個前に記事に書きましたが、やはりcheckboxのvalueの取得方法について気になったので、調べてみることにしました。
まずは、ためしに以下のソースを作成。(以下、html、head、titleタグを省略)
<body> <form action="./test.php" method="post"> <input type="checkbox" name="foo" value="1">りんご<br> <input type="checkbox" name="foo" value="2">オレンジ<br> <input type="checkbox" name="foo" value="3">バナナ<br> <input type="hidden" name="flg" value="1"> <input type="submit" value="Run"> </form> <?php if($_POST["flg"] == 1){ ?> フォーム変数の値は、<?php print ($_POST["foo"]); ?>となりました。 <?php } ?> </body> |
この場合、下のような挙動をしめしました。
(1)何もチェックをつけない:エラーを起こさず何も表示されない。
(2)1個だけチェックをつける:チェックをつけた値が表示される。
(3)複数個にチェックを入れる:最後のチェックボックスの値だけ表示される。
この時点で、リスト(例えば、1,3のような)的に表示してくれないことが判明。
では、どうすればいいのか??
ぐぐってみると、PHP checkboxの受け渡しPHPで、
<input type='checkbox' name='color[]' value='blue'>
via:PHP checkboxの受け渡しPHP
<input type='checkbox' name='color[]' value='red'>
<input type='checkbox' name='color[]' value='yellow'>
PHPでcheckbox内の値の受け渡しメモ。
nameに[]をつけると、配列としてPHP側に受け渡る。
PHP側で、
$color = $_POST["color"]);
のように受け取ると、
変数colorは配列となっている。
と書かれていたので、下のように書き換えてみました。
<body> <form action="./test.php" method="post"> <input type="checkbox" name="foo" value="1">りんご<br> <input type="checkbox" name="foo" value="2">オレンジ<br> <input type="checkbox" name="foo" value="3">バナナ<br> <input type="hidden" name="flg" value="1"> <input type="submit" value="Run"> </form> <?php if($_POST["flg"] == 1){ ?> フォーム変数の値は、 <?php $foo = $_POST["foo"]; foreach ($foo as $key => $value){ print ($value); } ?> となりました。 <?php } ?> </body> |
別にクライアントで「[]」を書かなくてもいいんじゃーねーと判断して実行した結果、警告が表示されました。
やはり「[]」を書かないとダメみたいです。
<body> <form action="./test.php" method="post"> <input type="checkbox" name="foo[]" value="1">りんご<br> <input type="checkbox" name="foo[]" value="2">オレンジ<br> <input type="checkbox" name="foo[]" value="3">バナナ<br> <input type="hidden" name="flg" value="1"> <input type="submit" value="Run"> </form> <?php if($_POST["flg"] == 1){ ?> フォーム変数の値は、 <?php $foo = $_POST["foo"]; foreach ($foo as $key => $value){ print ($value); } ?> となりました。 <?php } ?> </body> |
ただ、ここで問題になってくるのは、何もチェックをいれずに、submitをしてしまうと警告が出てしまう点。
なので、さらに正常終了するように処理を追加する必要があります。
<body> <form action="./test.php" method="post"> <input type="checkbox" name="foo[]" value="1">りんご<br> <input type="checkbox" name="foo[]" value="2">オレンジ<br> <input type="checkbox" name="foo[]" value="3">バナナ<br> <input type="hidden" name="flg" value="1"> <input type="submit" value="Run"> </form> <?php if($_POST["flg"] == 1){ ?> <?php $foo = $_POST["foo"]; /* フォーム変数が存在する場合 */ if($foo != ""){ print ("フォーム変数の値は、"); foreach ($foo as $key => $value){ print ($value); } print ("です。"); /* フォーム変数が存在しない場合 */ }else{ print ("フォーム変数がありません。"); } ?> <?php } ?> </body> |
if文を追加して、宣言されている場合と、未宣言されている場合とで、処理を分けました。
あと、ちょっと今回の件に関して気になったことがあったのですが、エントリーがさらに長くなりそうなので、次のエントリーで書きたいと思います。
右のメニューを拝見するとjavaやCなど様々なプログラム言語をご存知のようですが、この記事について、なぜHTML側のinputタグで配列指定しなくても、checkboxの値が配列として取得できると思ったのでしょうか?
返信削除私はそれほど多様な言語を理解しているわけではありませんが、PHP以外の他のプログラムではそのような詳細な指定は不要で、なんとなく取得できてしまうものなのでしょうか?
横から失礼します。
返信削除Javascriptではname属性で値を取得しようとした場合配列で取得します。
詳細は下記ページで。
http://www.openspc2.org/JavaScript/reference4/DOM/getElementsByName/index.html