【问题标题】:PHP: Retrieving value of checkboxes when name doesn't have arrayPHP:当名称没有数组时检索复选框的值
【发布时间】:2010-11-07 19:54:48
【问题描述】:

一个我无法控制的表单正在将数据发布到我的 PHP 脚本。该表单包含以下几行的复选框:

<input type="checkbox" value="val1" name="option"/>
<input type="checkbox" value="val2" name="option"/>

如果我要为表单编写代码,我会写 name="option[]" 而不是 name="option"。但这不是我能做的改变。现在,如果两个复选框都被选中,$_POST["option"] 只返回其中一个值。如何在 PHP 中检索所有选定的值?

【问题讨论】:

  • 维基有什么原因吗?
  • Ian,你的意思是启用社区维基?我也启用了它,这样人们就可以在他们认为合适的时候改进问题。

标签: php post checkbox


【解决方案1】:

您可以读取原始帖子数据。例如:

<fieldset>
    <legend>Data</legend>
    <?php
    $data = file_get_contents("php://input");
    echo $data."<br />";
    ?>
</fieldset>

<fieldset>
    <legend>Form</legend>
    <form method="post" action="formtest.php">
        <input type="checkbox" value="val1" name="option"/><br />
        <input type="checkbox" value="val2" name="option"/><br />
        <input type="submit" />
    </form>
</fieldset>

选中这两个框,输出将是:

option=val1&option=val2

这是live demo。然后,您所要做的就是自己将字符串解析为合适的格式。这是一个执行类似操作的函数示例:

function parse($data)
{
    $pairs = explode("&", $data);

    // process all key/value pairs and count which keys
    // appear multiple times
    $keys = array();
    foreach ($pairs as $pair) {
        list($k,$v) = explode("=", $pair);
        if (array_key_exists($k, $keys)) {
            $keys[$k]++;
        } else {
            $keys[$k] = 1;
        }
    }

    $output = array();
    foreach ($pairs as $pair) {
        list($k,$v) = explode("=", $pair);
        // if there are more than a single value for this
        // key we initialize a subarray and add all the values
        if ($keys[$k] > 1) {
            if (!array_key_exists($k, $output)) {
                $output[$k] = array($v);
            } else {
                $output[$k][] = $v;
            }
        } 
        // otherwise we just add them directly to the array
        else {
            $output[$k] = $v;
        }
    }

    return $output;
}

$data = "foo=bar&option=val1&option=val2";

print_r(parse($data));

输出:

Array
(
    [foo] => bar
    [option] => Array
        (
            [0] => val1
            [1] => val2
        )

)

在某些情况下,此功能可能无法按预期工作,因此请小心。

【讨论】:

  • 根据您的 PHP 设置,您可能无法在 php://input 流上使用 file_get_contents。在这种情况下,您需要使用 fopen('php://input', 'r') 和 stream_get_contents($fp)
  • 那会是什么 PHP 设置?
猜你喜欢
  • 2011-08-14
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2018-02-28
  • 2016-02-29
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
相关资源
最近更新 更多