将JSON字符串发布到PHP页面

时间:2013-09-14 13:08:29

标签: javascript php jquery ajax json

好的,我在将一个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);
    }
});

4 个答案:

答案 0 :(得分:2)

尝试:

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

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

答案 1 :(得分:0)

尝试urldecoderawurldecode,如下所示:

<?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)

在你的ajax调用中

尝试将dataType重置为json

dataType: "json",

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