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

Posted

技术标签:

【中文标题】多个复选框共享相同的名称【英文标题】:Several Checkboxes sharing the same name 【发布时间】:2013-05-09 07:04:36 【问题描述】:

根据 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

【问题讨论】:

您必须使用[],然后您可以使用in_array 来确定哪些复选框已被选中。烦人,但不是所有的形式? w3c 没有指定这一点,因为它是php 特定的(可能还有其他语言)并且与 w3c 无关。其他语言没有这个要求。正如您所说,浏览器确实会发送所有值。 我明白你的意思。谢谢。是的,所有形式都很烦人。 【参考方案1】:

如果没有[],这将永远无法工作,而不是在 PHP 中。

W3C 没有具体说明如何在服务器端处理查询字符串。 (忽略不相关的 obsolete corner of the CGI spec,它只与 PHP 相关,因为它直到最近还是一个安全漏洞)。

由于您描述的原因,该模式看起来是有效的标记,但不常用。

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

【讨论】:

也许吧。我知道单选按钮是这样使用的,我猜你是对的。我都弄糊涂了。 这也适用于经典 ASP。它也只返回复选框的选中值。【参考方案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 documentation找到。

【讨论】:

我可以使用 [],我只是对此感到好奇。但我会阅读您提供的链接,只是因为了解情况总是好的。

以上是关于多个复选框共享相同的名称的主要内容,如果未能解决你的问题,请参考以下文章

在多个 <input> 名称值上运行相同的 JS 函数

如何使用多个具有相同名称的表单输入?

引导验证器检查多个空复选框

在 Rails 中,如何处理多个选中的复选框,只在 , 或?

当复选框名称来自php中的数据库时,如何访问多个复选框名称

使用 php 获取多个复选框名称/ID