2014-04-02 103 views
1

JavaScript代码发送的数据:PHP无法读取jQuery.ajax POST

var data = {"hiSO": "my very complex - nested objects/arrays - data object"}; 

var j = jQuery.noConflict(); 
j.ajax({ 
    type: "POST", 
    url: "postTestingResult.php", 
    contentType: "application/json; charset=utf-8", 
    data: {"data": JSON.stringify(data)}, 
    dataType: "json", 
    success: ajaxSuccess, 
    error: ajaxError 
}); 

PHP代码:

header('Content-Type: application/json'); 

if(!empty($_POST['data'])) { 
    $data = json_decode($_POST['data']); 

    //do things with data 

    echo json_encode(array("success" => "thanks for the info!")); 
} else { 
    echo json_encode(array("error" => "'data' is not set or is NULL")); 
} 

无论我如何组织数据,$ _ POST [ '数据' ]似乎总是空的(具体来说,未定义)。如果您需要我正在使用的数据对象的完整副本,请查看this JSFiddle。感谢帮助,谢谢!

回答

6

您已经告诉服务器您要发送JSON(通过contentType: "application/json; charset=utf-8"),但是您没有发送JSON,而是发送了URI编码的数据。这是因为您已经为jQuery提供了data选项的对象(一个对象具有一个属性,其值为JSON字符串)。

您的PHP代码需要URI编码数据,因此要修复它只是删除contentType选项,以便jQuery使用其默认值。

如果你真的想送JSON,而不是(这可能需要改变你的PHP),改变

data: {"data": JSON.stringify(data)}, 

data: JSON.stringify(data), 

data: JSON.stringify({data: data}), 
+0

谢谢!我不确定我会永远那样!我编辑我的问题,包括var j = jQuery.noConflict();以消除对他人的困惑。 –

+0

作为后续问题,我有什么理由不应该将它作为JSON发送?我可以简单地发送它吗?我一直认为它必须采用某种格式,JSON和XML是两种最流行的格式。 –

+0

@MatthewHerbst:您必须以* some *格式发送数据。 *发送*到服务器的最流行的格式是URI编码(技术上,'application/x-www-form-urlencoded; charset = UTF-8'),这就是你在外层使用的POST包含一个URI编码的字段“data”;该字段的值是一个JSON字符串)。从服务器发送数据到客户端的流行格式是JSON和XML。为了将复杂的数据发送到服务器,JSON-over-URI编码(你所做的)看起来很好,我过去也用过它。 –