PHP中的多维数组(带复选框的表单数据)

时间:2012-03-17 12:58:45

标签: php arrays checkbox

我是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个值。

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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

...将输出postdata,就像GET查询字符串一样:blah=1&blah=2&blah=3(blah表示同名的3个表单字段,其中前两个将在$_POST中覆盖$_POST['blah'] = 3离开{{ 1}})。 在&上进行一点点爆炸并循环和解析查找有问题的变量,甚至是任何冲突的变量,都会让你到达目的地。


原始答案:

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;
}