题
在 HTML 表单中包含多个同名“隐藏”控制元素是否合法?我希望在服务器上获取所有这些元素的值。如果合法,主流浏览器是否正确实现了该行为?
解决方案
在浏览器与它确定。但是,应用程序库如何解析它可以变化。
程序是假设到组相同的命名项在一起。虽然HTML规范并没有明确说这一点,它是隐含在的上复选框文档:
的形式的几个复选框可以共享 相同的控制名字。因此, 例如,复选框允许用户 选择相同的几个值 属性。
其他提示
不同的服务器端技术会有所不同。在PHP中,你可以使用数组式的语法名称强制要在服务器端创建一个集合。如果发送到服务器,$_POST['colors']
将与两个值,#003366
和#00FFFF
的数组:
<input type="hidden" name="colors[]" value="#003366" />
<input type="hidden" name="colors[]" value="#00FFFF" />
一般来说,你需要使用一个标准的名称的方括号。大多数服务器端技术将能够分析得到的数据,并提供某种类型的集合。 Node.js的通过提供有用的功能 querystring.parse
:
const querystring = require('querystring')
querystring.parse('foo=bar&abc=xyz&abc=123') // { foo: 'bar', abc: ['xyz', '123'] }
如果你有这样的事情:
<input type="hidden" name="x" value="1" />
<input type="hidden" name="x" value="2" />
<input type="hidden" name="x" value="3" />
您查询字符串会变成看似x=1&x=2&x=3
......根据你使用解析查询字符串,这可能不是很好地工作的服务器软件。
是,与大多数应用服务器将收集的匹配元素,并用逗号,将它们连接起来,例如,像这样的形式:
<html>
<form method="get" action="http://myhost.com/myscript/test.asp">
<input type="hidden" name="myHidden" value="1">
<input type="hidden" name="myHidden" value="2">
<input type="hidden" name="myHidden" value="3">
<input type="submit" value="Submit">
</form>
</html>
...将解析为一个URL(在GET的情况下 - POST将相同的方式工作,虽然)是这样的:
http://myhost.com/myscript.asp?myHidden=1&myHidden = 2&myHidden = 3
...在这样的代码将被暴露给你:(例如,以下是这样回复于(的Request.QueryString( “myHidden”)):
1,2,3
所以抢的值,你只分割字符串,并访问它们作为一个数组(或任何您所选择的语言相媲美)。
(应明确:在PHP,它是稍微不同的(如乔纳森指出,托架符号暴露项作为数组到PHP代码),但ASP,ASP.NET和ColdFusion所有暴露的值作为逗号 - 分隔列表。所以,是的,重复的命名是完全有效的。)
HTML5
非规范部分 4.10.1.3 配置表单与服务器通信 明确表示它是有效的:
多个控件可以具有相同的名称;例如,这里我们给所有复选框赋予相同的名称,服务器通过查看使用该名称提交的值来区分哪个复选框被选中——就像单选按钮一样,它们也被赋予带有 value 属性的唯一值。
其规范版本很简单,在任何地方都不会禁止它,并且表单提交算法准确地说明了应该生成什么请求:
- 没有违反约束: https://www.w3.org/TR/html5/forms.html#constraints
- 多个名称被依次添加到“表单数据集”中: https://www.w3.org/TR/html5/forms.html#constructing-form-data-set
- 编码如
application/x-www-form-urlencoded
循环“表单数据集”并吐出多个key=val
https://www.w3.org/TR/html5/forms.html#url-encoded-form-data
具体地为PHP我提出了一些试验,在隐藏的输入阵列名称和我在这里分享我的结果:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Post Hidden 2D Arrays</title>
</head>
<body>
<form name="formtest" method="POST" target="_self">
<input type="hidden" name="elem['name'][]" value="first">
<input type="hidden" name="elem['name'][]" value="second">
<input type="hidden" name="elem['name'][]" value="third">
<input type="hidden" name="elem['name'][]" value="fourth">
<input type="hidden" name="elem['type'][]" value="normal">
<input type="hidden" name="elem['type'][]" value="classic">
<input type="hidden" name="elem['type'][]" value="regular">
<input type="hidden" name="elem['type'][]" value="basic">
<input type="hidden" name="elem['size'][]" value="4">
<input type="hidden" name="elem['size'][]" value="7">
<input type="hidden" name="elem['size'][]" value="3">
<input type="hidden" name="elem['size'][]" value="6">
<input type="hidden" name="elem['form'][]" value="triangle">
<input type="hidden" name="elem['form'][]" value="square">
<input type="hidden" name="elem['form'][]" value="hexagon">
<input type="hidden" name="elem['form'][]" value="circle">
<input type="submit" name="sendtest" value="Test">
</form>
<xmp>
<?php
print_r($_POST);
?>
</xmp>
</body>
</html>
提交表单生成下一个结果是:
Array
(
[elem] => Array
(
['name'] => Array
(
[0] => first
[1] => second
[2] => third
[3] => fourth
)
['type'] => Array
(
[0] => normal
[1] => classic
[2] => regular
[3] => basic
)
['size'] => Array
(
[0] => 4
[1] => 7
[2] => 3
[3] => 6
)
['temp'] => Array
(
[0] => triangle
[1] => square
[2] => hexagon
[3] => circle
)
)
[sendtest] => Test
)
查看此结果后,我提出更多的测试寻找更好的安排数组值的和与该结束(我将只显示新的隐藏输入):
<input type="hidden" name="elem[0]['name']" value="first">
<input type="hidden" name="elem[1]['name']" value="second">
<input type="hidden" name="elem[2]['name']" value="third">
<input type="hidden" name="elem[3]['name']" value="fourth">
<input type="hidden" name="elem[0]['type']" value="normal">
<input type="hidden" name="elem[1]['type']" value="classic">
<input type="hidden" name="elem[2]['type']" value="regular">
<input type="hidden" name="elem[3]['type']" value="basic">
<input type="hidden" name="elem[0]['size']" value="4">
<input type="hidden" name="elem[1]['size']" value="7">
<input type="hidden" name="elem[2]['size']" value="3">
<input type="hidden" name="elem[3]['size']" value="6">
<input type="hidden" name="elem[0]['temp']" value="triangle">
<input type="hidden" name="elem[1]['temp']" value="square">
<input type="hidden" name="elem[2]['temp']" value="hexagon">
<input type="hidden" name="elem[3]['temp']" value="circle">
获取提交表单后结果如下:
Array
(
[elem] => Array
(
[0] => Array
(
['name'] => first
['type'] => normal
['size'] => 4
['temp'] => triangle
)
[1] => Array
(
['name'] => second
['type'] => classic
['size'] => 7
['temp'] => square
)
[2] => Array
(
['name'] => third
['type'] => regular
['size'] => 3
['temp'] => hexagon
)
[3] => Array
(
['name'] => fourth
['type'] => basic
['size'] => 6
['temp'] => circle
)
)
[sendtest] => Test
)
我希望这有助于一些。
我相信它是合法的,至少在单选按钮的情况下和复选框。当我要在XSLT动态地添加文本框输入,我给他们所有相同的名称; ASP.NET中,的Request.Form [“whatever_name”]是所有这些值逗号分隔的字符串。
我已经使用相同的控制名只是试图,县[]数SELECT输入,从而使县英格兰,苏格兰,威尔士和爱尔兰在各自都通过作为相同的参数值。 PHP处理它很好,但HTML验证器会发出警告。我不知道是不是所有的浏览器处理这个同样的方式。