Несколько чекбоксов с одинаковым именем

согласно 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

2 ответов


Это никогда бы не сработало без [], не в PHP.

W3C ничего не указывает о том, как строки запроса обрабатываются на стороне сервера. (Игнорируя несущественное,устаревший угол спецификации CGI, имеет отношение только к PHP, поскольку до недавнего времени это была дыра в безопасности).

похоже, что этот шаблон является допустимой разметкой, но обычно не используется по причине, которую вы описываете.

аналогичная картина и используется для радио кнопки, из которых одновременно можно выбрать только одну. (На самом деле, давая радио входы с тем же именем, как браузер знает, чтобы рассматривать их как группу). Возможно, именно об этом вы и думали.


Если вы действительно хотите его в 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 документации.