2008/10/05

[php]checkboxの取得について~その1

一個前に記事に書きましたが、やはり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'>
<input type='checkbox' name='color[]' value='red'>
<input type='checkbox' name='color[]' value='yellow'>

PHPでcheckbox内の値の受け渡しメモ。

nameに[]をつけると、配列としてPHP側に受け渡る。

PHP側で、
$color = $_POST["color"]);
のように受け取ると、
変数colorは配列となっている。

via:PHP checkboxの受け渡しPHP

と書かれていたので、下のように書き換えてみました。

<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文を追加して、宣言されている場合と、未宣言されている場合とで、処理を分けました。

あと、ちょっと今回の件に関して気になったことがあったのですが、エントリーがさらに長くなりそうなので、次のエントリーで書きたいと思います。

2 件のコメント:

  1. 右のメニューを拝見するとjavaやCなど様々なプログラム言語をご存知のようですが、この記事について、なぜHTML側のinputタグで配列指定しなくても、checkboxの値が配列として取得できると思ったのでしょうか?

    私はそれほど多様な言語を理解しているわけではありませんが、PHP以外の他のプログラムではそのような詳細な指定は不要で、なんとなく取得できてしまうものなのでしょうか?

    返信削除
  2. 横から失礼します。
    Javascriptではname属性で値を取得しようとした場合配列で取得します。

    詳細は下記ページで。
    http://www.openspc2.org/JavaScript/reference4/DOM/getElementsByName/index.html

    返信削除