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

2022-08-30 16:43:30

我见过很多处理表单输入的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>

网址示例:

http://zzz.com?fruit[1]=apple&fruit[2]=banana

示例 PHP:

assert($_POST['fruit'] === array(1=>'apple', 2=>'banana'));

我对此提出问题:

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

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

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

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


答案 1

背后的机制是什么?在这一点上,这个仅包含括号的名称将转换为数组?这是HTPP协议的一个功能吗?网络服务器?PHP 语言>

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

foo=bar&foo=baz

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

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

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

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

与PHP数组相同,只是您不必引用字符串键。

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

是的,可以。


答案 2

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

早在我记得的时候,它就是一个普通的编程工具(我想我甚至记得它更常用于多文件上传,当你有“添加文件”链接将另一个元素附加到表单中时,使用与上一个相同的名称(with)。[]

在 PHP 中应用的相同规则也适用于表单。您可以使用 自动索引元素(对于泛型列表)或使用元素 ID 显式列出它们(例如 file[1]、file[2] 等(按照我前面的示例))[]

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

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


推荐