好的,我在将一个JSON字符串发布到PHP页面时遇到了一些自杀问题。我真的已经通过谷歌的十大结果以及与我的问题相关的大量SO问题,但仍然无法弄清楚我做错了什么。
我在页面上有多个表单,并希望收集所有表单字段,将它们转换为JSON字符串并将它们发布到PHP页面,其中脚本迭代每个项目并更新相关的数据库表。
这是我的jQuery / JS脚本,用于从所有表单中收集数据:
var photo_annotations = {};
$('form').each(function(i) {
var id = $(this).attr('id');
photo_annotations[id] = {
caption: $('#'+id+'_caption').val(),
keywords: $('#'+id+'_keywords').val(),
credit: $('#'+id+'_credit').val(),
credit_url: $('#'+id+'_credit_url').val()
};
});
如果我console.log
我的photo_annotations对象,这是基于两个表单示例生成的内容:
({11:{caption:“第一张照片的标题。”,关键字:“Keyword1, Keyword2,Keyword3“,credit:”Joe Bloggs“, credit_url:“www.a-domain.com”},12:{标题:“Lady Gaga的标题。”, 关键字:“Keyword3,Keyword4”,信用:“John Doe”, credit_url: “www.another-domain.com”}})
然后我需要将它作为字符串/ JSON发布到PHP页面,所以我已经这样做了:
$.ajax({
type: 'POST',
dataType: 'html',
url: 'ajax/save-annotations.php',
data: { data: JSON.stringify(photo_annotations) },
contentType: "application/json; charset=utf-8",
success: function(data) {
if (data) {
$('#form_results').html(data);
} else {
alert("No data");
}
}
});
在我的PHP页面上,我有这个:
<?php
//print_r($_POST['data']);
$decoded = json_decode($_POST['data'],true);
print_r($decoded);
?>
现在,这不是我尝试过的唯一一件事。我试图从AJAX脚本中删除所有JSON设置,以便只发送一个纯字符串。我已经尝试删除contentType和JSON.stringify但仍然不会去。我的PHP页面无法获取我正在发送的数据。
请帮我推动正确的方向。我已经到了无法记住我尝试的所有变化的地步,这个小脚本现在是第2天!
管理以修复
我重写了我的AJAX功能并且它有效。我不知道出了什么问题,但决定用一个非常基本的数据字符串test=hello world
来测试我的AJAX函数,并发现从PHP页面中无法读取POST数据,即使Firebug说该页面实际上是这样的接收匹配我发送的帖子数据。很奇怪。无论如何,这是修改后的AJAX脚本:
var the_obj = JSON.stringify(photo_annotations);
var post_data = "annotations="+the_obj;
$.ajax({
url: 'ajax/save-annotations',
type: 'POST',
data: post_data,
dataType: 'html',
success: function(data) {
$('#form_results').html(data);
}
});
答案 0 :(得分:2)
尝试:
$.ajax({
// ...
data: { data: JSON.stringify(photo_annotations) },
// ...
});
如果你只是将“data”属性设置为一个字符串,那么jQuery认为你想将它用作实际的查询字符串,当它是一个JSON的blob时,这显然是行不通的。当你传递jQuery一个对象时,如上所述,它将对属性名称和值(你的JSON blob)进行适当的URL编码,并为你创建查询字符串。您应该在服务器上获得一个“data”参数,它的值将是JSON字符串。
答案 1 :(得分:0)
尝试urldecode或rawurldecode,如下所示:
<?php
$decoded = json_decode(urldecode($_POST['data']), true);
print_r($decoded);
?>
答案 2 :(得分:0)
我重写了我的AJAX功能,它现在有效。我不知道出了什么问题,但决定用一个非常基本的数据字符串test=hello world
来测试我的AJAX函数,并发现从PHP页面中无法读取POST数据,即使Firebug说该页面实际上是这样的接收匹配我发送的帖子数据。很奇怪。无论如何,这是修改后的AJAX脚本:
var the_obj = JSON.stringify(photo_annotations);
var post_data = "annotations="+the_obj;
$.ajax({
url: 'ajax/save-annotations',
type: 'POST',
data: post_data,
dataType: 'html',
success: function(data) {
$('#form_results').html(data);
}
});
我唯一能想到的是AJAX设置的顺序需要按特定顺序排列。这是我的旧AJAX脚本,它不会成功发送POST数据 - 它确实发送,但无法读取!!
var the_obj = JSON.stringify(photo_annotations);
var data_str = "annotations="+the_obj;
$.ajax({
type: 'POST',
dataType: 'html',
data: data_str,
url: 'ajax/save-annotations.php',
success: function(data) {
$('#form_results').html(data);
}
});
答案 3 :(得分:0)
尝试将dataType重置为json
dataType: "json",
您也不必使用JSON.stringify()。在您的PHP脚本上,您不必解码[json_decode()]来自$ _POST变量的数据。您的php脚本可以轻松读取数据。