表单输入字段名称包含方括号,如字段[index]

she*_*iel 20 php forms

我已经看到很多PHP代码处理表单输入,其中输入字段名称包含方括号.据我所知,当PHP脚本检查$ _POST变量时,这会以某种方式导致PHP数组.

示例HTML:

<form action='http://zzz.com' method='post'>
    <input name='fruit[1]' value='apple' />
    <input name='fruit[2]' value='banana' />
</form>
Run Code Online (Sandbox Code Playgroud)

示例网址:

http://zzz.com?fruit[1]=apple&fruit[2]=banana
Run Code Online (Sandbox Code Playgroud)

示例PHP:

assert($_POST['fruit'] === array(1=>'apple', 2=>'banana'));
Run Code Online (Sandbox Code Playgroud)

我对此有疑问:

  • 它背后的机制是什么?这些包含括号的名称在什么时候被转换为数组?这是HTTP协议的一个特性吗?网络服务器?PHP语言?

  • 继续上一个问题,这是一个常用的黑客还是普通的编程工具?

  • 在输入字段名称中使用括号的规则是什么(全部)?

  • 可以用这种方式创建多维数组吗?

net*_*der 14

背后的机制是什么?此时仅包含括号的名称将转换为数组?这是HTPP协议的一个特性吗?网络服务器?PHP语言?>

这是PHP语言的一个特性.实际上,HTTP协议并不禁止使用多个相同的GET/POST参数.根据HTTP规范,以下内容:

foo=bar&foo=baz
Run Code Online (Sandbox Code Playgroud)

不应该导致foo == baz.这是两个具有两个不同值的参数.但是,PHP会foo用最新的覆盖前者,导致$_POST['foo'] == 'baz',即使它们可以单独解析.

继续上一个问题,这是一个常用的黑客还是普通的编程工具?

这取决于观点.在PHP世界中,这是完全正常的,因为语言不支持在不使用括号的情况下指定同名的多个参数[].但是在HTTP世界中,foo != foo[].

在输入字段名称中使用括号的规则是什么(全部)?

与PHP数组相同,除了您不必引用字符串键.

可以用这种方式创建多维数组吗?

是的你可以.


Bra*_*tie 5

据我所知,这是PHP内部查看(和解析)通过表单(GET/POST)传递的元素与[]后缀并将它们解释为元素数组的机制.HTTP协议并不关心,它只是传递元素的名称及其在查询字符串中的关联值.

这是我记忆中的常规编程工具(我想我甚至记得它更常用于多文件上传,当你有"添加文件"链接,将另一个元素附加到表单时,使用相同的名称(和[])一样.)

适用于PHP的相同规则适用于表单.您可以使用[]自动索引元素(对于通用列表)或使用元素ID(例如文件[1],文件[2]等)明确列出它们(按照我之前的示例))

是的,可以使用多维数组.

有关更多信息,请查看PHP自己的_POST文档(尤其是注释)

  • @zerkms:我不同意见.与MSDN一样,评论是查找常见问题和解决方案的好地方.当然,你是对的,那里有糟糕的代码/糟糕的做法,我经常在评论中发现更多好信息而不是坏信息.任何不是特别有帮助或误导的事情往往会被更高级的爱好者纠正.此外,我认为你不会在尝试那里的例子时遇到太多麻烦.同样地,任何可能遭受性能或安全漏洞影响的人都会在他们不知道的情况下更好地了解,恕我直言. (3认同)