web-dev-qa-db-ja.com

同じ名前を共有する複数のチェックボックス

W3cによると、「フォーム内の複数のチェックボックスが同じコントロール名を共有する場合があります。したがって、たとえば、チェックボックスを使用すると、ユーザーは同じプロパティに対して複数の値を選択できます。」ただし、これを行うと、PHPは最後の値のみを取得します。例:

<?php
if ($_POST) {
echo "<pre>";
print_R($_POST);
echo "</pre>";
}
?>
<form action="" method = "post">
<input type="checkbox" name="pet" value="dog" />Dog<br />
<input type="checkbox" name="pet" value="Cat" />Cat<br />
<input type="checkbox" name="pet" value="bird" />bird<br />
<input type="checkbox" name="pet" value="iguana" />iguana<br />
<input type="submit" />
</form>

そのフォームを送信すると、最後に表示されるチェックボックスのみが設定されていることがわかります。ブラウザはそれらすべてを送信しますが、それらは互いに上書きします。そのため、同じ名前を複数のチェックボックスに設定すると、問題が発生する可能性があります。いつもそうだったの?実際にすべての値を配列として送信することができたのを覚えているようです。

名前の最後に[]を追加するだけで、値の配列を作成できることを私は知っています。

<?php
if ($_POST) {
echo "<pre>";
print_R($_POST);
echo "</pre>";
}
?>
<form action="" method = "post">
<input type="checkbox" name="pet[]" value="dog" />Dog<br />
<input type="checkbox" name="pet[]" value="Cat" />Cat<br />
<input type="checkbox" name="pet[]" value="bird" />bird<br />
<input type="checkbox" name="pet[]" value="iguana" />iguana<br />
<input type="submit" />
</form>

しかし、w3cはそれを指定していません。正直なところ、名前の最後にいつも[]を使用していたかどうかは覚えていませんが、何らかの理由で、ある時点で使用しなかったと思います。過去に[]なしで動作させることができた時期はありましたか?

http://www.w3.org/TR/html401/interact/forms.html#checkbox

13
Buzu

これは、PHPではなく、[]なしでは機能しませんでした。

W3Cは、クエリ文字列がサーバー側でどのように処理されるかについては何も指定していません。 (無関係なものを無視すると、 CGI仕様の廃止されたコーナー 、PHP最近までセキュリティホールであったという点で)にのみ関連します)。

あなたが説明する理由から、そのパターンは有効なマークアップであるように見えますが、一般的には使用されていません。

同様のパターンisラジオボタンに使用され、一度に1つしか選択できません。 (実際、無線入力に同じ名前を付けることは、ブラウザーがそれらをグループとして扱うことを知る方法です)。おそらくそれはあなたが考えていたものです。

6
sourcejedi

PHPで本当に必要な場合は、次のことを試してください。

<?php

if (count($_POST)) {
  header("Content-type: text/plain");
  $fp = fopen("php://input", "r");
  fpassthru($fp);
  fclose($fp);
  exit;
}

?>
<form action="" method = "post">
<input type="checkbox" name="pet" value="dog" />Dog<br />
<input type="checkbox" name="pet" value="Cat" />Cat<br />
<input type="checkbox" name="pet" value="bird" />bird<br />
<input type="checkbox" name="pet" value="iguana" />iguana<br />
<input type="submit" />

</form>

php://inputストリームの詳細については、 PHPドキュメント を参照してください。

2
Vedran Šego