我应该将'[]'附加到多个html复选框吗?

时间:2014-06-04 16:53:29

标签: javascript html

我想使用JavaScript为数据结构动态生成标记,以便可以通过提交将其发送到任意服务器。

据我了解,这是有效的HTML:

<form method="POST" action="/submit_data">
    <input type="checkbox" name="animal" value="Ape" />
    <input type="checkbox" name="animal" value="Snake" />

    <input type="submit" value="Send data">
</form>

但似乎某些服务器(例如基于PHP的?)在名称后跟一对方括号时可以更好地处理列表:

<form method="POST" action="/submit_data">
    <input type="checkbox" name="animal[]" value="Ape" />
    <input type="checkbox" name="animal[]" value="Snake" />

    <input type="submit" value="Send data">
</form>

当这些数据发送到服务器(基于PHP还是不基于PHP)时有什么区别?

3 个答案:

答案 0 :(得分:2)

如果您使用的是PHP,那么当您希望这些值成为列表的一部分时,您应该将[]附加到名称,至少在使用$_GET$_POST时。

但严格地说,animal[]animal没有区别。两者都是键,方括号在查询字符串格式中不是特殊的。如果您使用的是其他服务器后端,则可以处理animal的多个值。这两个值都由浏览器发送:

animal=Ape&animal=Snake

但是,在PHP中,也可以在PHP中解析animal的多个值。 $_GET$_POST全局变量是为了方便起见。它们遵循与parse_str函数相同的规则,该函数有一些怪癖,例如句点.被转换为下划线_

您可以使用以下命令获取原始GET查询:

$_SERVER['QUERY_STRING']

您可以使用以下命令获取原始POST数据:

file_get_contents("php://input")

(见http://www.php.net/manual/en/wrappers.php.php

$_GET$_POST超全局的创建受php.ini中variables_order设置的约束。只有在启用auto_globals_jit时才会创建它们(否则它总是在脚本运行之前发生)。只要启用了auto_globals_jit,您就可以使用原始数据而无需额外的开销。

答案 1 :(得分:0)

您应该使用不同的名称或使用方括号(基本上会创建值的数组)。

如果对多个输入使用相同的名称,PHP将只能处理最后一个。

单选按钮是一个例外,因为您只能进行一次选择,因此只需要一个值。

答案 2 :(得分:0)

感谢每个评论或发布答案的人。唉,大多数回复都针对PHP场景,这不是我主要关注的问题。 @FelixKling在这里添加了一些有用的评论(Felix,如果你选择发布答案,我会删除我的并接受你的。)

来自W3C

  

多个控件可以具有相同的名称;例如,这里我们给所有复选框命名相同的名称,服务器通过查看使用该名称提交的值来区分检查哪个复选框 - 就像单选按钮一样,它们也被赋予带值属性的唯一值。

因此,使用name="animal"name="animal[]"都是有效的,并会向服务器发送多个条目:animal=Ape&animal=Snakeanimal[]=Ape&animal[]=Snake

通常,服务器可以处理这两种变体。

如果服务器是使用PHP实现的,则需要后一种语法(尾随[]),否则PHP将丢弃除最后一项之外的所有内容。

所以我的结论是:使用普通语法,除非你有一个PHP后端(或者如果后端有类似的行为)。