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

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

Это никогда бы не сработало без [] , а не в 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://input можно найти в документации PHP .