【问题标题】:Submit arrays to php using dojo使用 dojo 将数组提交到 php
【发布时间】:2012-01-12 14:04:21
【问题描述】:

如何将数组从dojo 提交到php。 我正在提交这些值:

["a", "b", "c"]

这是我目前得到的:

 btn_send.onclick(function(){
            var name_array = name_looper();
            console.log(name_array);
            dojo.xhrPost({

                url: "dojo_phpform.php",
                content: {names: name_array},
                load: function(result) {
                    var x = dojo.byId('results');
                    x.innerHTML = result;
                }
            });
        });

        function name_looper(){
            var names = dojo.query('input[type=text]');
            var name_array = [];
            names.forEach(function(element, index, array){
                name_array[index] = dojo.attr(element, 'value');
            });

            return name_array;
        }

我试图从 php 文件 (dojo_phpform.php) 中回显 $_POST['names'] 并且它没有返回任何错误。看起来该数组实际上并未提交。唯一返回的是数组中的最后一项。我该怎么办?请帮忙,提前谢谢!

【问题讨论】:

  • 使用var_dump($_POST)然后看看会得到什么
  • 你能把你的php表单代码贴在这里吗?
  • @Philippe:我只做了 print_r($_POST['names']);在 php 文件上查看它是否工作

标签: php arrays post dojo xmlhttprequest


【解决方案1】:

我刚刚用 grails 和 php 对此进行了测试。在 grails 中,通过 dojo xhrPost 提交数组没有问题:我检索了正确解析的数组,并按预期使用了所有值。

如果我发帖:

dojo.xhrPost({
    content : {
       names : ['foo', 'bar']
    },
    url : "mygrailscontroller"
});

我在另一边得到一个数组参数。这证明问题不是在dojo端解决,而是在php端。

在 php 中,如果表单输入有一个数组类型的变量,它的 name 参数必须用方括号设置,例如:“names[]”而不是“names”。

所以...在您的情况下,解决方案不是将数组展平为字符串(对不起),而是用括号命名您的数组参数。所以它会是:

dojo.xhrPost({
    content : {
       "names[]" : ['foo', 'bar']
    },
    url : "myphpcontroller"
});

【讨论】:

  • 感谢您发布此信息,我不知道这是可能的。 grails 也处理{"names[]": ['foo', 'bar']} 吗?
  • 实际上在 grails 中我不需要 []... 它接受名为“names”的 post 参数,但服务器将其作为数组检索。
【解决方案2】:

据我所知,dojo 的 xhr 函数不支持它。我自己正在使用辅助函数来“展平”参数。

_flattenXhrParams: function(params)
{
    var newParams = {};
    for(var key in params)
    {
        if(dojo.isObject(params[key]))
        {
            for(var innerKey in params[key])
            {
                newParams[key + "[" + innerKey + "]"] =
                        params[key][innerKey];
            }
        }
        else if(dojo.isArray(params[key]))
        {
            for(var i = 0, l = params[key].length; i < l; i++)
            {
                newParams[key + "[]"] = params[key][i];
             }
        }
        else
        {
            newParams[key] = params[key];
        }
    }
    return newParams;
}

我知道这很丑,而且显然只适用于一维数组/对象。在你的情况下,你会这样做:

dojo.xhrPost({
    url: "dojo_phpform.php",
    content: _flattenXhrParams({names: name_array}),
    load: function(result) {
        var x = dojo.byId('results');
        x.innerHTML = result;
    }
});

.. 你会得到像 names[]=a&amp;names[]=b&amp;names[]=c 这样的 POST 参数。对于对象,你会得到names[somekey]=a&amp;names[otherKey]=b 等。PHP 可以很好地处理这两者。

【讨论】:

    【解决方案3】:

    我很确定内容对象的值只接受字符串。如果你想提交一个数组,你必须把它转成 JSON,然后在服务器上json_decode它。

    【讨论】:

    • 不使用内容对象具体怎么提交?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多