2011-06-02 121 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请求已成功完成。

相关问题