2011-04-12 63 views
6

我正在構建一個Web應用程序,並想知道如何處理AJAX調用中的錯誤。例如,如果用戶輸入某些無效的數據(錯誤的電子郵件地址,用戶已經存在),我希望能夠從PHP中引發錯誤。爲AJAX調用定製PHP錯誤

我在這裏看到http://php4every1.com/tutorials/jquery-ajax-tutorial/您可以使用JSON對象並處理來自JQuery成功函數的錯誤報告,但這似乎不是正確的方式。當出現錯誤時,應該使用jQuery的錯誤函數對我來說是有意義的。我想我是那種事的堅持者。

下面是我現在正在做的事情。

//In my PHP file called from JQuery 
function error($msg) { 
    header("HTTP/1.0 555 ".$msg); 
    die(); 
} 
//Then that error is handled accordingly from JQuery 

所以我創造的555未被定義爲錯誤代碼什麼和套結對我自己的自定義錯誤消息。這是做到這一點的正確方法嗎?我應該只使用JSON嗎?有一個標準的方式來發送這樣的錯誤信息,對吧?

如果您需要查看更多我的代碼以獲得更好的想法,整個項目在github上:https://github.com/josephwegner/fileDrop。有問題的文件是config/phpFuncts.php

+1

沒有理由爲此創造一個新的狀態碼,如果它是一個用戶輸入驗證錯誤400會做的罰款。它可以被認爲是一個糟糕的請求(如在他們的請求主體 - 他們的用戶輸入 - 是畸形的)。 – Fleep 2012-06-06 18:54:23

回答

6

我只是使用一個JSON對象和一個200頭的HTTP頭。請求本身並沒有錯,而且你的服務器按照它應該的那樣運行 - 錯誤位於抽象的不同層上。

2

400HTTP status codes系列表明請求存在問題。我會將響應代碼設置爲400,並將響應正文中的錯誤消息列表包含爲JSON。

+0

同意。對於用戶可以糾正的錯誤,使用400錯誤請求(如錯誤,他們有驗證錯誤等)。對於數據庫故障等服務器異常,致命錯誤等使用500級別的狀態代碼。 – Fleep 2012-06-06 18:53:15

+0

@Fleep Yup多數民衆贊成在 – Michael 2012-06-06 19:18:25

2

我討厭使用HTTP狀態碼來表示失敗。 HTTP代碼應該保留用於實際的HTTP級錯誤,並且與AJAX請求相關的錯誤應該通過JSON結構發回。

例如

$data = array() 
if (some big ugly computation fails) { 
    $data['errorcode'] = -123; 
    $data['error'] = true; 
    $data['success'] = false; 
    $data['errormessage'] = 'some helpful error message'; 
} else { 
    $data['success'] = true; 
    $data['error'] = false; 
    $data['response'] = 'whatever you wanted to send back....'; 
} 
echo json_encode($data); 

然後在客戶端

if (data.error) { 
    alert('Request blew up: ' + data.errormessage); 
} 
+1

我不同意「HTTP代碼應保留爲實際的HTTP級錯誤」。 HTTP是一種協議,其中的狀態代碼反映了服務的響應。 4xx響應代碼應該用於客戶負責的問題,5xx響應代碼應該用於服務器負責的問題 – Fleep 2012-06-06 18:52:27

+2

如果我開車去商店,他們沒有我想要的東西,不要把這次旅行叫做失敗 - 這輛車運轉正常,我停下來,我回到家裏 - 空手而歸。 AJAX服務本身的錯誤應該在服務響應文本中發出,而不是在HTTP層。在「失敗」的ajax調用上返回404應該意味着「嘿,服務文件丟失」,而不是「抱歉,數據庫中的記錄不存在」。 – 2012-06-06 18:59:57

+0

HTTP狀態代碼旨在以這種方式使用。 「400錯誤請求」並不意味着HTTP失敗。如果HTTP失敗,你根本得不到錯誤響應。 HTTP不報告它自己的性能。 – Fleep 2012-06-06 19:37:18