2014-04-02 36 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編碼(你所做的)看起來很好,我過去也用過它。 –