通过php中的POST输入具有相同名称的多个输入


119

是否可以获取多个具有相同名称的输入以进行发布,然后从PHP访问它们?想法是这样的:我有一个表格,允许输入不确定数量的物理地址以及其他信息。如果我只是在几个条目中为每个字段赋予相同的名称,然后通过post提交数据,PHP是否可以访问它?

举例来说,我在一个名为“ xyz”的页面上有五个输入,我想使用PHP访问它们。我可以做点什么:

    $_POST['xyz'][0]

如果是这样,那将使我的生活变得轻松十倍,因为我可以通过表单发送无限量的信息,然后通过遍历名称为“ xyz”的项目数组来让服务器处理该信息。

Answers:


216

更改输入的名称:

<input name="xyz[]" value="Lorem" />
<input name="xyz[]" value="ipsum"  />
<input name="xyz[]" value="dolor" />
<input name="xyz[]" value="sit" />
<input name="xyz[]" value="amet" />

然后:

$_POST['xyz'][0] == 'Lorem'
$_POST['xyz'][4] == 'amet'

如果是这样,那将使我的生活变得轻松十倍,因为我可以通过表单发送无限量的信息,然后通过遍历名称为“ xyz”的项目数组来让服务器处理该信息。

请注意,这可能是错误的解决方案。显然,这取决于您发送的数据。


谢谢您的帮助。因为这是我问题的最完整答案,所以我选择它作为“答案”。但是,来自Interstellar_coder的答案也很好,但是您已经解释说,如果使用不正确,这可能是一个陷阱。我将限制项目的最大数量,并且我将在此表单上进行很多验证,因此,除非此方法中固有的问题未在此处进行说明,否则我不会遇到任何安全问题。
亚当

10
@Adam:重新阅读您的问题后,这是一种非常容易接受的方法。你可能想走得更远一个阶段,并且有address[0][street] address[0][city] address[0][zip]address[1][street] address[1][city] address[1][zip]......你可以读到这些$_POST['address'][0]['city'],例如
埃里克·

那么在HTML中如何命名呢?这样可以大大减轻难度。我要采用的方法是具有几个这样命名的字段:l1 [],l2 [],city [],state [],zip [],zip4 []。然后,对于第一个地址,我只需在每个字段中使用$ i == 0。因此,如果我正确理解了您的方法,我可能会这样命名我的元素:name =“ address [] [city]”代表city字段。那是对的吗?
亚当

@亚当:可能。我认为您可能需要将索引放在第一个内部[],例如[0]。这使得HTML更加难以生成,但是在PHP端读取数据并不困难
Eric

我想到的问题是:该字段是否会在数组内部以随机顺序出现?还是按格式排列它们(即使有些字段留空)?
rajeev 2013年

38

在您的html中,您可以传入名称数组

<input type="text" name="address[]" /> 

这样,php将接收一个地址数组。


3
正确正确的答案,这就是为什么我投票赞成。但是您没有对此做太多解释,这就是为什么我没有选择它作为我的问题的答案的原因。这已经帮了我很多忙,因为我已经尝试了好一阵子了(您可能在我之前的一个问题中注意到了)。我以前的方法是简单地将所有输入添加到带有*分隔值的隐藏字段中,然后重置输入字段,但是这种方法要好十倍,因为如果发现以前添加的地址是不正确
亚当

请注意,空数组的POST计数为1,索引为“ 0”时没有任何内容。您需要使用'empty'关键字if(!empty($ arrayName)){// do something}进行检查
Fi Horan 16'Aug

10

Eric的回答是正确的,但问题是字段未分组。假设您有多条街道和城市属于同一条街道:

<h1>First Address</h1>
<input name="street[]" value="Hauptstr" />
<input name="city[]" value="Berlin"  />

<h2>Second Address</h2>
<input name="street[]" value="Wallstreet" />
<input name="city[]" value="New York" />

结果将是

$POST = [ 'street' => [ 'Hauptstr', 'Wallstreet'], 
          'city' => [ 'Berlin' , 'New York'] ];

要将它们按地址分组,我宁愿建议使用Eric在评论部分中也提到的内容:

<h1>First Address</h1>
<input name="address[1][street]" value="Hauptstr" />
<input name="address[1][city]" value="Berlin"  />

<h2>Second Address</h2>
<input name="address[2][street]" value="Wallstreet" />
<input name="address[2][city]" value="New York" />

结果将是

$POST = [ 'address' => [ 
                 1 => ['street' => 'Hauptstr', 'city' => 'Berlin'],
                 2 => ['street' => 'Wallstreet', 'city' => 'New York'],
              ]
        ]

0

对于任何其他发现此问题的人-值得注意的是,您可以在输入名称中设置键值。多亏具有相同名称属性的POSTing Form Fields中的答案,您还可以在不使用引号的情况下交互字符串或整数。

答案假定您不介意PHP返回的键值,但是您可以设置name=[yourval](字符串或整数),然后允许您引用现有记录。


自己解析这是胡说八道。没有任何情况需要这样做。
贾维德

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.