服务器抛出异常,客户端误解为成功

时间:2011-06-02 19:05:39

标签: php jquery postgresql

我正在使用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文件的客户端,即使服务器抛出异常,也会执行success函数。

      $.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);
        }
      });

3 个答案:

答案 0 :(得分: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 Bad Request作为状态代码,因为这种情况下的错误似乎是由错误的输入引起的。我建议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');

答案 1 :(得分:3)

Javascript捕获不能捕获PHP异常。语言在完全不同的时间执行。 JS只会看到您的异常MESSAGE遇到问题。除非您的PHP端异常采取措施发送除“200 OK”之外的HTTP状态代码,否则JS将解释传入的文本和200 ok代码,这意味着AJAX请求已成功完成。

答案 2 :(得分:1)

如果您希望JQuery知道存在错误,则必须在PHP脚本的响应中设置正确的标头。

可以在此处找到标题错误代码列表:http://www.jqueryphp.com/http-header-codes/2011/01/