2011-06-02 123 views
5

我使用JQuery,PHP和PostgreSQL編寫簡單的登錄/註冊功能。以下代碼來自處理登錄的PHP文件。它在登錄名/密碼組合錯誤時引發異常。服務器拋出異常,客戶端誤解爲成功

$username = $_POST['username']; 
$password = $_POST['password']; 

$query = "SELECT * FROM users WHERE username='$username' AND password='$password'"; 
$result = pg_query($query) or die('Query failed: ' . pg_last_error()); 
$numResults = pg_num_rows($result); 

if ($numResults == 0) { 
    throw new Exception("Incorrect combination of username and password."); 
    //die('Incorrect combination of username and password.'); 
} 

然而,在客戶端jQuery的文件成功功能即使服務器拋出一個異常執行。

 $.ajax({ 
     type: "POST", 
     url:"login.php", 
     data: dataString, 
     success: function() { 
//THIS FUNCTION IS EXECUTED.... 
      $('#errorMsg').html('Login is successful!'); 
      $('#errorMsg').show(); 
      $('#usernameTxtBx').val(""); 
      $('#passwordTxtBx').val(""); 
     }, 
     error:function (xhr, ajaxOptions, thrownError){ 
      window.alert(xhr.status); 
      window.alert(thrownError); 
     } 
     }); 
+0

當你取消對模具會發生什麼()調用? – barfoon 2011-06-02 19:08:05

+0

那麼,HTTP請求*成功了。除了重點之外,PHP層引發了一個異常。 Apache運行,從PHP獲得了一些輸出(這是錯誤輸出,但是很好),併成功地將其交付給客戶端。如果郵遞員給你發信說你最後一次反對謀殺罪的上訴被拒絕了,那真的很糟糕,但這封信仍然可以傳送。 – 2011-06-02 19:45:39

+0

@Tomalak:是的,但這裏的情況有所不同。根據你的比喻,這將是這樣的。你發了一封信,詢問你最後一次對定罪的上訴是否成功,並且可以說一個正面的信息總是包裹在一個綠色的信封裏,一個負面的信息包裹在一個紅色的信封裏,然後你會得到一個綠色信封,沒有成功。錯誤不一定總是發生在HTTP服務器級別上。 Imho一個未捕獲的異常應該總是生成某種類型的HTTP錯誤代碼,因爲它畢竟是一個錯誤。 – fresskoma 2011-06-02 20:47:28

回答

4

首先:請看SQL Injections,因爲你很容易...;)

的問題是, HTTP response code未設置爲拋出PHP異常時被解釋爲錯誤的內容。你可以做這樣的事情來解決此:

function exception_handler($exception) { 
    header("HTTP/1.1 400 Bad Request"); 
    echo "Uncaught exception: " , $exception->getMessage(), "\n"; 
} 

set_exception_handler('exception_handler'); 

這將設置exception handler爲自己需要的功能,這在退出之前設置正確的HTTP標頭。這樣,jQuery現在會發生錯誤,並調用錯誤處理程序而不是成功。

我選擇了400錯誤請求作爲狀態碼,因爲這種情況下的錯誤似乎是由錯誤的輸入引起的。我建議subclass your own exception爲了檢查它是否實際上是一個客戶端相關的異常,如果不是,請發送一個通用的500內部服務器錯誤。

錯誤處理程序會是這個樣子(如果你命名的子類UserErrorException):

function exception_handler($exception) { 
    if($exception instanceof UserErrorException) { 
     header("HTTP/1.1 400 Bad Request"); 
    } else { 
     header("HTTP/1.1 500 Internal Server Error"); 
    } 
    echo "Uncaught exception: " , $exception->getMessage(), "\n"; 
} 

set_exception_handler('exception_handler'); 
3

PHP異常不能被Javascript捕獲。這些語言在完全不同的時間執行。 JS只會看到你的異常MESSAGE遇到線路。除非您的PHP端異常採取措施發送「200 OK」以外的HTTP狀態代碼,否則JS會將傳入的文本和200 OK代碼解釋爲AJAX請求已成功完成。

相關問題