将JSON字符串发布到PHP页面

好的,我在将一个JSON字符串发布到PHP页面时遇到了一些自杀问题。 我确实已经通过谷歌的十大结果以及与我的问题相关的大量问题,但仍然无法弄清楚我做错了什么。

我在页面上有多个表单,并希望收集所有表单字段,将它们转换为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:{标题:“第一张照片的标题。”,关键字:“关键字1,关键字2,关键字3”,信用:“Joe Bloggs”,credit_url:“www.a-domain.com”},12:{标题: “Lady Gaga的标题。”,关键字:“Keyword3,Keyword4”,信用:“John Doe”,credit_url:“www.another-domain.com”}})

然后我需要将此作为字符串/ JSON POST到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页面上,我有这个:

  

现在,这不是我尝试过的唯一一件事。 我试图从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); } }); 

尝试:

  $.ajax({ // ... data: { data: JSON.stringify(photo_annotations) }, // ... }); 

如果你只是将“data”属性设置为一个字符串,那么jQuery认为你想将它用作实际的查询字符串,当它是一个JSON的blob时,这显然是行不通的。 当您传递jQuery一个对象时 ,如上所述,它将对属性名称和值(您的JSON blob)进行适当的URL编码,并为您创建查询字符串。 您应该在服务器上获得一个“data”参数,它的值将是JSON字符串。

尝试urldecode或rawurldecode如下:

  

我重写了我的AJAXfunction,它现在有效。 我不知道出了什么问题,但决定用一个非常基本的数据字符串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); } }); 

在你的ajax调用中尝试将dataType重置为json

 dataType: "json", 

您也不必使用JSON.stringify()。 在您的PHP脚本中,您不必解码[json_decode()]来自$ _POST变量的数据。 您的php脚本可以轻松读取数据。