多个复选框共用同一个名称

19
根据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
你必须使用[],然后可以使用in_array来确定哪些复选框已被选择。很烦人,但不是所有的表单都这样吗? - thatidiotguy
4
W3C没有明确规定这一点,因为它是“PHP”(可能也包括其他语言)特定的,与W3C无关。其他语言没有这个要求。正如你所说,浏览器会发送所有值。 - James Montagne
我理解你的观点。谢谢。所有表格都很烦人。 - Buzu
2个回答

12

如果没有 [],在 PHP 中那永远行不通。

W3C 没有规定如何处理服务器端的查询字符串。(忽略一个无关的CGI 规范的过时角落, 它只关乎 PHP, 直到最近它还是一个安全漏洞)。

看起来这种模式是有效的标记,但并不常用,正如你所描述的原因。

类似的模式用于单选钮,其中一次只能选择一个(事实上,给单选钮输入相同的名称就是浏览器知道如何将它们视为一组的方法)。也许这就是你想到的。


也许吧。我知道单选按钮是这样使用的,我猜你是对的。我之前有点混淆了。 - Buzu
这在经典ASP中也适用。它还仅返回复选框的选中值。 - Nathan

3
如果您确实想要使用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文档


我使用 [] 完全没问题,只是好奇而已。但是我会阅读你提供的链接,因为了解更多总是好的。 - Buzu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接