发布具有相同名称属性的表单字段
Posted
技术标签:
【中文标题】发布具有相同名称属性的表单字段【英文标题】:POSTing Form Fields with same Name Attribute 【发布时间】:2011-01-13 06:58:21 【问题描述】:如果您有一个包含带有重复name
属性的文本输入的表单,并且该表单已发布,您是否仍然能够从php 中的$_POST
数组中获取所有字段的值?
【问题讨论】:
Multiple inputs with same name through POST in php的可能重复 这个问题比建议的副本要老得多,而且有更多的答案。肯定是这个的副本? 目前的共识是以“质量”结束:meta.stackexchange.com/questions/147643/…> 由于“质量”是不可衡量的,我只是通过投票。 ;-) 很可能归结为哪个问题与标题上最好的新 Google 关键字有关。 【参考方案1】:没有。只有最后一个输入元素可用。
如果您想要多个具有相同名称的输入,请使用name="foo[]"
作为输入名称属性。然后$_POST
将包含一个 foo 数组,其中包含来自输入元素的所有值。
<form method="post">
<input name="a[]" value="foo"/>
<input name="a[]" value="bar"/>
<input name="a[]" value="baz"/>
<input type="submit" />
</form>
请参阅html reference at Sitepoint。
如果你不使用[]
,$_POST
将只包含最后一个值的原因是因为 PHP 基本上只会爆炸并遍历原始查询字符串以填充 $_POST
。当它遇到一个已经存在的名称/值对时,它会覆盖之前的。
但是,您仍然可以像这样访问原始查询字符串:
$rawQueryString = file_get_contents('php://input'))
假设你有这样的表格:
<form method="post">
<input type="hidden" name="a" value="foo"/>
<input type="hidden" name="a" value="bar"/>
<input type="hidden" name="a" value="baz"/>
<input type="submit" />
</form>
然后 $rawQueryString
将包含 a=foo&a=bar&a=baz
。
然后您可以使用自己的逻辑将其解析为数组。一种天真的方法是
$post = array();
foreach (explode('&', file_get_contents('php://input')) as $keyValuePair)
list($key, $value) = explode('=', $keyValuePair);
$post[$key][] = $value;
然后会为查询字符串中的每个名称提供一个数组数组。
【讨论】:
好酷,所以每个具有重复名称的输入应该只是 name="foo[]"?不是 name="foo[0]" 什么的? @danwellman 只需foo[]
即可,但您也可以使用foo[0]
、foo[bar]
甚至foo[bar][baz]
。只需在您的网络服务器上尝试各种组合,看看它们是如何到达 $_POST 的。【参考方案2】:
只需使用name="nfo[val][]"
而不是name="nfo[val]"
,在PHP 中您可以使用foreach()
HTML 代码:
<form method="post">
<input name="nfo[val][]" value="val1"/>
<input name="nfo[val][]" value="val2"/>
<input name="nfo[val][]" value="val3"/>
<input type="submit" />
</form>
PHP 代码:
$output='';
foreach ($nfo['val'] as $key=>$val)
$output.= $val.", ";
$output
将是:val1, val2, val3
希望这会有所帮助!
【讨论】:
很好的答案,因为我认为您必须在 html 表单中引用 val 。 [val] 可以是字符串或整数。谢谢!【参考方案3】:你必须创建一个数组:
与name=inputname[]
并通过 post、request 或 get 获取
$inputs = $_POST['inputname'];
print_r($inputs);
【讨论】:
【参考方案4】:仅当名称为数组类型names[]
在这种情况下,您将获得一个数组作为 $_POST 变量中的变量。
【讨论】:
以上是关于发布具有相同名称属性的表单字段的主要内容,如果未能解决你的问题,请参考以下文章