1

好的,我在将 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:"第一张照片的标题。",keywords:"Keyword1, Keyword2, Keyword3", credit:"Joe Bloggs", credit_url:"www.a-domain.com"}, 12:{caption: “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 函数并且它起作用了。我不知道出了什么问题,但决定用一个非常基本的数据字符串测试我的 AJAX 函数,test=hello world发现无法从 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

4 回答 4

2

尝试:

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

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

于 2013-09-14T13:12:24.323 回答
0

尝试urldecoderawurldecode如下:

<?php
$decoded = json_decode(urldecode($_POST['data']), true);
print_r($decoded);
?>
于 2013-09-14T13:45:09.493 回答
0

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

dataType: "json",

您也不必使用 JSON.stringify() 。在您的 php 脚本中,您不必从 $_POST 变量中解码 [json_decode()] 数据。数据将很容易被您的 php 脚本读取。

于 2014-04-18T12:17:59.017 回答
0

我重写了我的 AJAX 函数,它现在可以工作了。我不知道出了什么问题,但决定用一个非常基本的数据字符串测试我的 AJAX 函数,test=hello world发现无法从 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);
    }
});
于 2013-09-14T22:37:34.547 回答