共享相同名称的多个复选框

2022-08-30 22:24:03

根据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 文档php://input


推荐