2013-07-11 135 views
1

a.php只會JSON返回空值後POST

$(document).ready(function() { 
    $("#submit_form").on("click",function(){ 
     var json_hist = <?php echo $json_history; ?>; 
     $.ajax({ 
      type: "POST", 
      url: "b.php", 
      data: "hist_json="+JSON.stringify(json_hist), 
      //contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function(data){alert(data);}, 
      failure: function(errMsg) { 
       alert(errMsg); 
      } 
     }); 
    }); 
}) 

b.php

$obj=json_decode($_POST["hist_json"]); 
var_dump($_POST); 

如果我評論 contentType: "application/json; charset=utf-8" 一切都工作正常,但如果取消註釋此。 var轉儲將返回null。

+0

不需要在php文件中給出'json_decode'。 –

+0

爲什麼使用dataType:「json」?嘗試刪除它,因爲b.php的輸出不是json – 2013-07-11 07:42:24

+0

謝謝,但即使我不解碼在PHP文件。它在var轉儲返回null。 「$ history = json_encode($ pro_hist);」 「var json = <?php echo $ history;?>;」我編碼爲json類型。但爲什麼我不需要使用數據鍵入json?謝謝 – hehetest

回答

0

當您在ajax中設置contentType時,您正在設置請求的contentType而不是響應。

由於您要發送的數據是鍵/值格式化的數據(缺少編碼),因此數據與contentType不匹配,因此它失敗並顯示JSON contentType。 JSON contentType標頭用於發送沒有標識符的原始JSON,但在您的情況下,您的標識爲hist_json=

我建議改爲:

data: { hist_json : JSON.stringify(json_hist) }, 

使用與hits_json鍵的對象將意味着jQuery將安全URL encode的JSON和將允許PHP與$_POST['hits_json']把它撿起來。


如果你想使用JSON的contentType,那麼你將不得不改變了Ajax:

data: { JSON.stringify(json_hist) }, // <-- no identifier 

和PHP:

$obj = json_decode($HTTP_RAW_POST_DATA); 
var_dump($obj); 
+0

data:{hits_json:JSON.stringify(json_hist)}, contentType:「application/json; charset = utf-8」, dataType:「json」,在firebug中,post data hits_json =%7B%22history_done_task% 22%3A150%2C%22history_morale%22%3A150%2C%22history_date%22%3A150%2C%22history_skill_lv%22%3A150%7D和b.php var dump返回null。請幫忙 – hehetest

+0

不,你使用'hist_json'標識符,所以不要包含JSON contentType。如果你想使用標題看到答案,你需要改變ajax和PHP。 – MrCode

+0

這意味着我每次發送json時都不會設置內容類型?我想學習最正確的方法。再次感謝您的幫助 – hehetest

0

註釋掉該行正試圖在Content-type:標題更改爲application/json。當您發送的數據爲JSON格式時,數據將作爲HTTP POST請求傳輸,因此您需要使用內容類型application/x-www-form-urlencoded;,這是默認設置。這就是爲什麼它與刪除的行一起工作。

+0

是不是意味着發送json最正確的方式不需要設置內容類型? – hehetest

+0

對於您要在此處執行的操作,請勿設置內容類型。 – 2013-07-11 07:54:25

+0

在這種情況下,我應該設置內容類型?謝謝 – hehetest