在php中的JS返回字符串中序列化输入

时间:2014-06-18 20:05:17

标签: javascript php ajax json

我的JS代码有点问题。

我有一个AJAX,我想在PHP中获取变量。

一切正常,除了" param"数据

这是代码:

$('#signup_submit').click(function (event){
    param = jQuery('input').filter(function() {
                     return this.name.match(/param/);
                }).serialize();
    event.preventDefault();
    $.ajax({
        type: "POST",
        url: result.php,
        data: {
            action: 'submit_ajax',
            email: $('#email').val(),
            send_welcome: true,
            listId:  $('#listid').val(),
            param: param
        },
        success: function(msg) {
            console.log('ok');
        }
    });
});

param(PHP)的结果var_dump:

 param%5Bconfirmation%5D=1

应该是这样的:

array(1){ 'confirmation'=>1 }

有什么想法来解决它吗?

感谢

4 个答案:

答案 0 :(得分:2)

使用serializeArray代替序列化。

param = jQuery('input').filter(function() {
    return this.name.match(/param/);
}).serializeArray();

答案 1 :(得分:2)

您发布的$param var看起来像param[confirmation]=1

您需要parse_str函数来获取序列化数据:

parse_str($param, $output);

<强>输出

var_dump($output);

array(1) {
  ["param"]=>
  array(1) {
    ["confirmation"]=>
    string(1) "1"
  }
}

或直接获取特定索引:

parse_str($param);
echo $confirmation; // 1

答案 2 :(得分:1)

输出是因为param是双重编码的,一次是.serialize()

param = jQuery('input')....serialize();

console.log(param);
// "param%5Bconfirmation%5D=1"

而且data:再次通过$.param() $.ajax()运行{/ 1}}:

console.log($.param({
    param: param
}));
// "param=param%255Bconfirmation%255D%3D1"

虽然针对$_POST解码了第一轮编码:

var_dump($_POST['param']);
// string(25) "param%5Bconfirmation%5D=1"

您必须使用parse_str()手动解码第二轮:

$param = array();
parse_str($_POST['param'], $param);

var_dump($param);
// array(1) { ["confirmation"]=> int(1) }

您还可以尝试通过将param与其他编码数据连接来避免双重编码:

data: param + '&' + $.param({
    action: 'submit_ajax',
    email: $('#email').val(),
    send_welcome: true,
    listId:  $('#listid').val()
}),

答案 3 :(得分:0)

%5B是[ %5D是]

您可以在提交

之前使用此功能修复编码
function fixedEncodeURI (str) {
    return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}

像这样:

$('#signup_submit').click(function (event){
    param = jQuery('input').filter(function() {
                     return this.name.match(/param/);
                }).serialize();
    event.preventDefault();
    $.ajax({
        type: "POST",
        url: result.php,
        data: {
            action: 'submit_ajax',
            email: $('#email').val(),
            send_welcome: true,
            listId:  $('#listid').val(),
            param: fixedEncodeURI(param)
        },
        success: function(msg) {
            console.log('ok');
        }
    });
});