首页 文章

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

提问于
浏览
36

如果您的表单包含具有重复 name 属性的文本输入,并且表单已发布,您是否仍然可以从PHP中的 $_POST 数组中获取所有字段的值?

4 回答

  • 6

    不会 . 只有最后一个输入元素可用 .

    如果要使用相同名称的多个输入,请使用 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;
    }
    

    然后,它会为查询字符串中的每个名称提供一个数组数组 .

  • 7

    而不是 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

    希望这可以帮助!

  • 71

    你必须创建一个数组:使用 name=inputname[] 并获得post,request或get

    $inputs = $_POST['inputname'];
    
    print_r($inputs);
    
  • 2

    只有当名称是数组类型 names[] 时,在这种情况下,您将获得一个数组作为$ _POST变量中的变量 .

相关问题