Несколько флажков, имеющих одно и то же имя

В соответствии с 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

Ответ 1

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

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

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

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

Ответ 2

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