我有几个复选框,我试图采用一种懒惰的方式将它们插入数据库。
所以我想知道,POST超级数组中复选框数组(checkboxes [])的顺序是否与它们在我的html页面中的顺序相同?
如果没有,那么我将不再是一个懒惰的开发者!
感谢您的帮助。
答案 0 :(得分:9)
是的,请参阅17.13.4 Form content types of the HTML 4 specification。对于application/x-www-form-urlencoded:
控件名称/值按它们在文档中出现的顺序列出。该名称与值
=
分隔开来,名称/值对由&
分隔开来。
部件以相同的顺序发送到处理代理程序,相应的控件显示在文档流中。
PHP手册说明了相同的内容(见How do I create arrays in a HTML <form>
?):
在HTML中指定数组键是可选的。如果未指定键,则按照元素在表单中显示的顺序填充数组。
答案 1 :(得分:0)
虽然从技术上来说答案是“是”,但它仍然取决于它是如何被访问的,真的(以及你如何懒惰它!)。
例如,如果未勾选复选框,则它不包含在POST中。这是因为它不是由浏览器发送的。是的,其他人仍在秩序中,但你必须在“懒惰”中解释这一点。
还要记住,如果您使用“复选框[1]”,“复选框[2]”等表单字段名称来执行此操作,那么这些也可能不符合您期望的顺序取决于你在PHP中访问它的方式。
执行“while $ i&lt; $ number_of_known_checkboxes”,然后查看“$ checkbox [$ i]”就可以了。但是,使用“while $ i&lt; count($ checkbox)”将失败(因为复选框仅填充了选中的复选框),foreach循环也可能会向您显示问题。
答案 2 :(得分:0)
有一点需要警惕。无论HTML 4规范如何说,它们都按照它们在 DOM 中出现的顺序提交。
看看这个(无效的)HTML。
<html>
<head>
<title>Test Page</title>
</head>
<body>
<form name="f1" method="get" action="fostered.htm">
<label>A <input type="checkbox" name="a" checked="checked" /></label>
<table>
<tbody>
<tr>
<td>
<label>B <input type="checkbox" name="b" checked="checked" /></label>
</td>
</tr>
<tr>
<label>C <input type="checkbox" name="c" checked="checked" /></label>
</tr>
</tbody>
</table>
<input type="submit" />
</form>
</body>
</html>
在这种情况下,提交的顺序是A,C,B,因为在解析过程中,C复选框是“foster parented”,它位于表格的开头之前,因为它不在表格单元格内。
当然,这通常会显示在渲染页面上,但CSS可能会掩盖它。
麻烦地验证HTML的另一个好理由。
值得注意的是,“隐藏”输入字段不是寄养父母,所以如果C是隐藏字段,提交顺序将是A,B,C。