2009-07-22 102 views
1

我對應用程序使用Kohana PHP框架。現在我遇到了一個問題,當jQuery對某個文件執行AJAX請求時,它確實有效,但是當該文件引發PHP異常時,jQuery將失敗並且不顯示該文件的輸出。jQuery AJAX請求在PHP異常上失敗

一個小例子,這是一段JavaScript代碼:

$.post($('#' + e.currentTarget.id).attr('action'), $('#' + e.currentTarget.id).serialize(), function (data) 
{ 
    alert (data); 
}/*, 'json' */); 

現在,當PHP文件,這是否(警告框彈出),其工作原理:

<?php echo 'Test'; ?> 

但當某處PHP文件發生這種情況:

<?php throw new Exception ('Test'); ?> 

jQuery失敗並且不顯示輸出的HTML錯誤,a LSO存在PHP頭差(由PHP生成?):

隨着PHP的echo(好):

. Connection:Keep-Alive 
. Content-Encoding:gzip 
. Content-Length:544 
. Content-Type:text/html; charset=UTF-8 
. Date:Wed, 22 Jul 2009 14:22:43 GMT 
. Keep-Alive:timeout=15, max=100 
. Server:Apache/2.0.59 (Unix) PHP/5.2.6 DAV/2 
. Vary:Accept-Encoding 
. X-Powered-By:PHP/5.2.6 

隨着PHP異常(失敗):

. Connection:close 
. Content-Encoding:gzip 
. Content-Length:1896 
. Content-Type:text/html; charset=UTF-8 
. Date:Wed, 22 Jul 2009 14:23:11 GMT 
. Server:Apache/2.0.59 (Unix) PHP/5.2.6 DAV/2 
. Vary:Accept-Encoding 
. X-Powered-By:PHP/5.2.6 

現在我真的沒有看到任何問題,PHP都會迴應一些HTML。之前有人遇到過這個問題,你是怎麼解決這個問題的?

感謝您的幫助!

+0

什麼是你的error_reporting水平PHP設定?如果它沒有設置爲顯示異常(儘管它應該是),那麼你將看不到任何輸出。 – inkedmn 2009-07-22 15:07:20

+0

它會顯示錯誤,當引發異常時,它會輸出整個回溯(HTML)作爲錯誤消息。如果PHP不顯示錯誤(它確實是這樣),從邏輯上看,Javascript應該彈出一個空的警告框? – Stefan 2009-07-22 15:16:44

回答

2

要顯示錯誤是什麼,您可以在ajax調用中執行此操作。

jQuery.ajax({ 
    type: "POST", 
    ... 
    error: function(xhr, desc, e) { 
     alert(xhr.responseText); 
    } 
}); 

這應該與相同的HTML拋出一個PHP異常會給你一個正常的網頁上提醒您。

1

如果你想保持當前的錯誤報告級別,但仍然給jQuery一個不錯的錯誤信息,你可以將你的代碼包裝在try-catch塊中。

try { 
    // your code 
} catch(Exception $e) { 
    echo $e->getMessage(); // formatted nicely or a generic message or something. 
} 
+0

我認爲Kohana是這樣做的,當發生異常時,Kohana會將整個回溯作爲錯誤消息(HTML)返回。只有標題不同。 – Stefan 2009-07-22 15:14:53

+0

儘管如果你自己做,它可能不會一路泡到頂端,並導致Kohana更改標題?只是拋出那裏。 – 2009-07-22 15:17:41

0

+1與Brian。 如果你想知道原因,這裏是:jQuery期望接收JSON數據。當PHP輸出它的錯誤時,它輸出不包含在引號內的HTML和純文本,並且這不是有效的JSON,所以jQuery失敗。

如果你註釋掉'json'參數,那麼如果沒有任何反應,那是因爲你的服務器發送了一個代表錯誤(任何法定代碼> 500)的statut代碼。如果您可以向我們提供這些信息,那會很好。

+0

但是當JSON被註釋掉(就像我的例子和實時版本),它只會顯示整個HTML輸出? – Stefan 2009-07-22 15:18:33

+0

它應該,除非你的服務器發送了一個statut代碼500. – FWH 2009-07-22 15:36:58

0

我會鼓勵你試用Firefox的Firebug插件。 Firebug將很容易讓你查看AJAX請求並查看應用程序返回的數據。

0

由於少數人已經猜到,Kohana的默認異常處理程序將HTTP響應狀態設置爲「500 Internal Server Error」。如果您想將錯誤返回給JavaScript,您需要手動捕獲異常並輸出錯誤消息。

0

解決方案感謝goreckm:

$.ajax({ 
    type : 'POST', 
    url  : $('#' + e.currentTarget.id).attr('action'), // http://www.... 
    dataType: 'json', 
    data : $('#' + e.currentTarget.id).serialize(), // Data to be sent 
    success : function (data) 
    { 
     alert (data); 
    }, 
    error : function (ajax_response) 
    { 
     alert (ajax_response.responseText); 
    } 
});