发布具有相同名称属性的表单字段

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&amp;a=bar&amp;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 变量中的变量。

【讨论】:

以上是关于发布具有相同名称属性的表单字段的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有相同名称的字段的表单创建 JSON 文件?

更改用于分隔具有相同名称标识符的表单输入字段的字符?

PDF 表单与 itext 合并。 C#

表单字段和数据库表字段的名称相同吗?

Laravel提交表单具有相同的输入名称ajax

使用 codeigniter 将具有相同输入名称的表单输入插入数据库行