为什么ajax有时urlencode序列化数据,有时它不会?

时间:2015-11-16 21:10:35

标签: php ajax serialization urldecode

当我使用ajax将序列化数据发送到PHP文件时,有时会根据我的编写方式进行URL编码。

最初我有以下代码可以正常工作:

$.ajax({
        type: 'POST',
        url: 'ajax-process.php',
        data: $("#sitestructure-form").serialize(), 
        success: function(d){$("#structureupdate").html(d);}
});

数据被发送到我的PHP文件,我可以回复它,它看起来像这样。

[{"id":20,"children":[{"id":21}]},{"id":19},{"id":18,"children":[{"id":14}]},{"id":16},{"id":13,"children":[{"id":11}]},{"id":17},{"id":15},{"id":12}]

我想发送多个数据,我称之为序列化数据' order'并添加了' process'为此我将我的代码更新为以下内容:

$.ajax({
        type: 'POST',
        url: 'ajax-process.php',
        data: {
            order: $("#sitestructure-form").serialize(),
            process: "sitemap-reordernavigation"
              },
        success: function(d){$("#structureupdate").html(d);}
                    });

然而,当我检索在' order'中发送的序列化数据时输出如下:

data=%5B%7B%22id%22%3A20%2C%22children%22%3A%5B%7B%22id%22%3A21%7D%5D%7D%2C%7B%22id%22%3A19%7D%2C%7B%22id%22%3A18%2C%22children%22%3A%5B%7B%22id%22%3A14%7D%5D%7D%2C%7B%22id%22%3A16%7D%2C%7B%22id%22%3A13%2C%22children%22%3A%5B%7B%22id%22%3A11%7D%5D%7D%2C%7B%22id%22%3A17%7D%2C%7B%22id%22%3A15%7D%2C%7B%22id%22%3A12%7D%5D

我能想到解决这个问题的唯一方法是使用php对其进行urldecode,然后使用str_replace删除' data ='位于前面,就像这样。

    $data = str_replace("data=","",urldecode($_POST['order']));

我怎么能让这个与AJAX一起工作,所以我没有urldecode呢?

我尝试过使用变量并将processData设置为false,但这似乎不起作用。

var order = $("#sitestructure-form").serialize();
$.ajax({
        type: 'POST',
        url: 'ajax-process.php',
        processData: false,
        data: {
            order: order,
            process: "sitemap-reordernavigation"
              },
        success: function(d){$("#structureupdate").html(d);}
                    });

我对AJAX / Jquery的了解非常有限,因此非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

这是因为你第一次向数据属性提供序列化文本字符串,而jQuery没有将它转换为序列化字符串。第二个是使用带有序列化文本字符串的“order”属性将对象分配给data属性,因此jQuery基本上对其进行双重编码。为了使它像您一样,您必须将表单转换为对象并将“order”属性分配给该对象。请参阅此帖子:Convert form data to JavaScript object with jQuery

// taking the example from the above link, you do this instead
order = $("#sitestructure-form"). serializeObject();

答案 1 :(得分:0)

通过执行以下操作修复:

 $.ajax({
        type: 'POST',
        url: 'ajax-process.php?',
        data: $("#sitestructure-form").serialize() + "&action=sitemap-reordernavigation", 
        success: function(d){$("#structureupdate").html(d);}
});