Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么ajax有时会对序列化数据进行URL编码,有时则不会?_Php_Ajax_Serialization_Urldecode - Fatal编程技术网

Php 为什么ajax有时会对序列化数据进行URL编码,有时则不会?

Php 为什么ajax有时会对序列化数据进行URL编码,有时则不会?,php,ajax,serialization,urldecode,Php,Ajax,Serialization,Urldecode,当我使用ajax将序列化数据发送到PHP文件时,有时会根据我的方式对其进行URL编码 最初,我有以下代码,运行良好: $.ajax({ type: 'POST', url: 'ajax-process.php', data: $("#sitestructure-form").serialize(), success: function(d){$("#structureupdate").html(d);} }); 数据被发送到我的

当我使用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);}
                    });
 $.ajax({
        type: 'POST',
        url: 'ajax-process.php?',
        data: $("#sitestructure-form").serialize() + "&action=sitemap-reordernavigation", 
        success: function(d){$("#structureupdate").html(d);}
});
但是,当我检索按“顺序”发送的序列化数据时,输出如下所示:

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对其进行URL解码,然后使用str_replace删除前面的“data=”位,如下所示

    $data = str_replace("data=","",urldecode($_POST['order']));
但是我如何才能让它与AJAX一起工作,这样我就不必对它进行URL解码了

我尝试使用一个变量并将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的了解非常有限,因此非常感谢您的帮助。

这是因为您第一次将一个序列化文本字符串输入到数据属性,而Jquery不会将其转换为序列化字符串。第二步是将对象分配给数据属性,其中“order”属性具有序列化文本字符串,因此jQuery基本上对其进行双重编码。要使其按您的意愿运行,您必须将表单转换为对象,并将“order”属性指定给该对象。见此帖:


这是因为您第一次向数据属性提供了一个序列化文本字符串,而jQuery不会将其转换为序列化字符串。第二步是将对象分配给数据属性,其中“order”属性具有序列化文本字符串,因此jQuery基本上对其进行双重编码。要使其按您的意愿运行,您必须将表单转换为对象,并将“order”属性指定给该对象。见此帖:


通过执行以下操作进行修复:

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

通过执行以下操作进行修复:

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

这不是php的问题,而是在jquery中处理数据的方式的问题。首先将数据序列化为
order
键下的字符串,并添加到要传递到数据中的对象中。在内部,jquery获取
数据
参数,看到它是一个对象,再次序列化它,所有值都是url编码的。在订单的情况下,情况更是如此。我建议看看如何为序列化数据添加值。看到Adam的第二个答案。谢谢大家,我通过以下操作修复了它:$.ajax({type:'POST',url:'ajax process.php',data:$(“#sitestructure form”).serialize()+“&action=sitemap reordernavigation”,success:function(d){$(“#structureupdate”).html(d)});这不是php的问题,而是在jquery中处理数据的方式的问题。首先将数据序列化为
order
键下的字符串,并添加到要传递到数据中的对象中。在内部,jquery获取
数据
参数,看到它是一个对象,再次序列化它,所有值都是url编码的。在订单的情况下,情况更是如此。我建议看看如何为序列化数据添加值。看到Adam的第二个答案。谢谢大家,我通过以下操作修复了它:$.ajax({type:'POST',url:'ajax process.php',data:$(“#sitestructure form”).serialize()+“&action=sitemap reordernavigation”,success:function(d){$(“#structureupdate”).html(d)});好吧,我试着让我的大脑围绕这个lol,我试过这个,但它似乎根本不起作用。ajax({type:'POST',url:'ajax process.php',数据:{order:$(“#site structure form”).serializeObject(),进程:“sitemap reordernavigation”},成功:函数(d){$(“#structureupdate”).html(d);}好吧,我试着让我的大脑围绕这个lol,我试过这个,但它似乎根本不起作用。ajax({type:'POST',url:'ajax process.php',数据:{order:$(“#site structure form”).serializeObject(),进程:“sitemap reordernavigation”},成功:函数(d){$(“#structureupdate”).html(d);}这是可行的,但我不建议在所有情况下都这样做。因为您只是硬编码一个附加到数据的值,它很可能是好的(仍然不认为它是最佳实践,但它是有效的)。如果您以任何方式从另一个表单字段或用户输入中获取附加数据,那么您将希望对所附加的键和值进行URL编码。这就是为什么我建议使用另一个SO线程中的方法。这将正确地序列化数据,非常简单,只需在表单上使用jquery的serializeArray方法,添加您自己的条目并将其传递给
param
方法即可。这是可行的,但我不建议在所有情况下都这样做。因为您只是硬编码一个附加到数据的值,它很可能是好的(仍然不认为它是最佳实践,但它是有效的)。如果您以任何方式从另一个表单字段或用户输入中获取附加数据,那么您将希望对所附加的键和值进行URL编码。这就是为什么我建议使用另一个SO线程中的方法。这将正确地序列化数据,非常简单,只需在表单上使用jquery的serializeArray方法,添加您自己的条目并将其传递给
param
方法。