【问题标题】:Multidimensional Array in PHP (form data with checkboxes)PHP中的多维数组(带有复选框的表单数据)
【发布时间】:2012-03-17 12:58:44
【问题描述】:

我是 PHP 新手,在阅读表单提交的复选框时遇到问题。在解释之前,我想提一下,我正在尝试编辑一个更大的应用程序,并且无法以任何其他方式发送数据。只需找到一种读取发送内容的好方法即可。

发送普通文本输入时,表单将发布以下内容:

custom[0][type]="text"
custom[0][name]="VariableName"
custom[0][value]="VariableName"

基本上有一个主要的“自定义”多维数组,它有几个元素(0、1、2、3 等),每个元素都有名称和值。

但是,当其中一个元素是复选框时,会发布以下内容:

custom[1][type]="list"
custom[1][name]="SelectedOptions"
custom[1][value]="Value1"
custom[1][value]="Value3"
custom[1][value]="Value5"

进入 PHP 方面,这是我用来读取表单发送的数据的代码。下面的代码在场景 1 中工作正常(基于文本的输入),但当我们有列表类型的自定义数据时只读取一个值。

foreach($_POST['custom'] as $item){
    if($item['value'] != "") echo $item['name'].'='.$item['value']
}

问题在于 $item['value'] 只读取其中一个值,而不是全部 3 个。如何在一个变量中获取所有 3 个值?这可能是一件很容易的事情......

总而言之,这就是它与 POST 一起发送的内容(为 Variable2 选中了 3 个复选框)

custom[0][name] Variable1
custom[0][type] text
custom[0][value]    ValueForVariable1
custom[1][name] Variable2
custom[1][type] checkbox
custom[1][value]    Value1
custom[1][value]    Value3
custom[1][value]    Value5

这就是 print_r($_POST) 为上面发布的数据显示的内容

[custom] => Array
(
[0] => Array
    (
    [value] => ValueForVariable1
    [name] => Variable1
    [type] => text
    )
[1] => Array
    (
    [value] => Value1
    [name] => Variable2
    [type] => checkbox
    )

为了确保我们都在同一个页面上,实际数据是由更复杂的系统生成的,我们无法真正改变它。我有兴趣了解我们如何读取在 POST 中发送的 Variable2 的所有 3 个值。

谢谢!

【问题讨论】:

  • print_r($_POST) 究竟会产生什么? (只为了这个块就可以了)
  • 如果我正确理解您的命名,复选框名称可能不正确。复选框名称必须是 custom[1][value][] 否则您将用最后一个覆盖该值。
  • @jcmeloni - 我已经编辑了问题并添加了 print_r 数据。
  • @Rufinus - 仅凭我的基本 php 知识,我正在使用的系统中似乎有很多问题,但现在我必须完成这项工作。
  • 再次阅读我的第一条评论.....当然,您可以在 firebug 中阅读它,它会向您显示发送的内容,但是当 php 组装数组时,它会完全按照我说的...它会覆盖这些值。

标签: php arrays checkbox


【解决方案1】:

编辑: 有了你提供的额外信息,我发现我最初误解了这个问题。

由于您无法控制将数据发送到 PHP 脚本的表单,因此无法更改它以确保后面的同名复选框不会覆盖前面的复选框,因此您必须获取和处理原始帖子数据本身。

$postdata = file_get_contents("php://input");
echo $postdata;

... 将像 GET 查询字符串一样输出 postdata:blah=1&blah=2&blah=3(blah 表示具有相同名称的 3 个表单字段 blah,其中前两个将在 $_POST 中被覆盖,留下 $_POST['blah'] = 3)。 在& 上进行一点点爆炸,循环和解析寻找有问题的变量,甚至任何冲突的变量,都会让你到达你想要去的地方。


原答案:

HTML 表单仅提交已选中的复选框(或单选按钮)。如果它们没有被检查,浏览器不会将数据发送回服务器。

解决此问题的主要方法是了解您在后端寻找的内容并对其进行测试(即if (isset($_POST['checkboxname']))。

如果你真的需要一个通用的后端来动态合并所有复选框元素,无论是否选中,我过去解决这个问题的方法是使用 javascript 记录页面上的所有表单元素并提交该信息表单的其余部分(在我的情况下,还提交该字段是否已更改)。


您可以在脚本顶部运行以下函数,以按照您希望从 ASP 后台处理 POST 的方式处理 POST:

function post_process() {
    $rawpostdata = file_get_contents('php://input');
    if (!$rawpostdata) return;
    $fields = explode('&', $rawpostdata);
    $post = array();
    foreach ($fields as $field) {
        list($key, $val) = explode('=', $field);
        if (isset($post[$key])) $post[$key] .= ','.$val;
        else $post[$key] = $val;
    }
    $_POST = $post;
}

【讨论】:

  • 或者您使用世界上最古老的技巧并添加一个具有相同名称且 value="0" 的隐藏字段(如果检查值为 1),因此您始终可以获得所有字段,如果收音机/复选框被选中,0 值被覆盖。
  • @Jason 在发布的数据中可以看到,发布了 3 个值,这意味着在表单页面中选择了 3 个复选框。
  • @Rufinus 在我的特定场景中,我非常重视始终工作的相同代码,而无需记住为每个存在的单个字段(Intranet 数据库)添加(或更改)隐藏字段在几十页上有数百个字段的应用程序),但你是对的,在更有限(和更常见)的应用程序中可能更站得住脚。
  • @Cornel 我明白你在做什么。我也许可以为您找到解决方案...
  • @Jason:只是关于如何生成表单的问题......在我的应用程序中,我使用抽象/扩展 Zend_Forms,当我添加复选框或收音机时,隐藏字段会自动打印。
猜你喜欢
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多