我正在使用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);
}
});
答案 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/