2013-03-26 41 views
4

我正在開發一個單頁腳本,即類別管理的category.php。Php Ajax調用相同的PHP腳本響應null

  1. 該腳本有一個輸入按鈕來調用AJAX調用。
<input type="button" id="btn" /> 
  1. jQuery代碼綁定點擊事件和呼叫阿賈克斯。我想要json響應。

    $(document).ready(function(e) { 
    $('#btn').click(function(e) { 
         id=1; 
         jQuery.ajax({ 
         type: 'post', 
         url: 'category.php', 
         success: function(data) { 
          if(data.rstatus==1){ 
          alert(data.text); 
         }else 
         alert(data); 
        }, 
         data:{'id':id} 
    
    
        }); 
        }); 
    }); 
    
  2. 用於招待AJAX​​電話的PHP代碼。

    if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && 
        strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
        $jsonResponse=array('rstatus'=>1,'id'=>$_POST['id']); 
        header("Content-type: application/json"); 
        json_encode($jsonResponse); 
        die(); 
    } 
    

問題:

這Ajax調用是無法產生螢火控制檯回調函數正確的反應,並導致錯誤。 類型錯誤:數據爲空

在Firebug頭如下:

Response Headers

> Cache-Control no-cache, must-revalidate Connection Keep-Alive 
> Content-Length 0 Content-Type application/json Date Tue, 26 Mar 2013 
> 12:45:52 GMT Expires Mon, 26 Jul 1997 05:00:00 GMT 
> Keep-Alive timeout=5, max=98 Last-Modified Tue, 26 Mar 2013 
> 12:45:52GMT Pragma no-cache Server Apache/2.4.3 (Win32) OpenSSL/1.0.1c 
> PHP/5.4.7 X-Powered-By PHP/5.4.7 

Request Headers

> > Accept */* Accept-Encoding gzip, deflate 
>  > Accept-Language en-US,en;q=0.5 Content-Length 4 
>  > Content-Type application/x-www-form-urlencoded; charset=UTF-8 
>  > Cookie __gads=ID=39701a3d85dce702:T=1350383638:S=ALNI_MY_rHGVQ-qNxH4UGmbY_G-IuVcDkA; 
>  > __utma=141011373.593047819.1350426838.1364292528.1364295112.314;PHPSESSID=1s73cho6ildjt80jtudt8nq0f5 Host abc.com Referer http://www.abc.com/category.php 
>  > User-Agent Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 
>  > Firefox/19.0 X-Requested-With XMLHttpRequest 
+0

一個良好問的問題 – 2013-03-26 13:04:14

+0

如說,忘了響應(使用echo) 也HTTP_X_REQUESTED_WITH是不檢測Ajax請求(最重要的是在jQuery的情況下) – vladkras 2013-03-26 13:19:40

回答

8

它看起來像你的迴應內容爲空。你忘了echo

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    $jsonResponse=array('rstatus'=>1,'id'=>$_POST['id']); 
    header("Content-type: application/json"); 
    echo json_encode($jsonResponse); 
    die(); 
} 

如果你想回應一個json,你必須把它放在響應內容中。在Php中,您只需使用echo即可在響應內容中添加內容。

+0

好抓的最好方法。當我重現這個代碼爲SO問題和真正的實現是複雜的,所以我認爲這只是一個錯字,我在原代碼中使用回聲,我會在接受原始代碼的一些測試後接受答案。或者尋求更多幫助。 – 2013-03-26 13:14:35

0

這不起作用,因爲$_SERVER不包含該信息。所有的請求標題都不是真的存儲在那裏。看看getallheadershttp://php.net/manual/en/function.getallheaders.php

編輯:哦,你也需要回應響應。 $ _SERVER可能包含您在這種情況下需要的信息,但它不可靠和便攜。我還是建議你使用getallheaders

+0

我在$ _SERVER ARRAY中找到了它。陣列 ( [HTTP_USER_AGENT] =>的Mozilla/5.0(Windows NT的5.1; RV:19.0)壁虎/ 20100101火狐/ 19.0 [HTTP_ACCEPT] => */* [HTTP_ACCEPT_LANGUAGE] =>的en-US,連接; Q = 0。5 [HTTP_ACCEPT_ENCODING] => gzip,deflate [CONTENT_TYPE] => application/x-www-form-urlencoded; charset = UTF-8 [HTTP_X_REQUESTED_WITH] => XMLHttpRequest 。和許多其他 ) – 2013-03-26 13:17:12

+0

也我使用jQuery,並確保它產生$ _SERVER ['HTTP_X_REQUESTED_WITH'] – 2013-03-26 13:18:25

+0

@Asadkamran沒有問這個問題的人沒有指定操作系統,但它不被認爲是一種好的做法從$ _SERVER讀取頭文件,因爲它取決於部署php的方式。 – Munim 2013-03-26 13:19:40

0

不使用HTTP_X_REQUESTED_WITH - 幾乎沒有工作在jQuery的 嘗試發送額外的變種,像

數據:{ 'ID':ID, '請求':「XMLHttpRequest的「}

+0

是的,我正在考慮使用某種令牌機制來驗證請求。 – 2013-03-26 13:30:56