我想使用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)时有什么区别?
答案 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=Snake
或animal[]=Ape&animal[]=Snake
。
通常,服务器可以处理这两种变体。
如果服务器是使用PHP实现的,则需要后一种语法(尾随[]
),否则PHP将丢弃除最后一项之外的所有内容。
所以我的结论是:使用普通语法,除非你有一个PHP后端(或者如果后端有类似的行为)。