我正在使用新的Ajax调用处理程序重写一些旧的JS / php函数。
“完成”和“始终”都可以;他们做了预期的事情。
问题(可能很愚蠢,对不起):如何测试“失败”部分?或者,以不同的方式询问何时激活此处理程序?
这是用于测试的JS函数:
$("#btn1").on('click',function(event) {
var ob=[];
$.get({
url: "php/test.php?code=5",
}).done(function (data, status, jqXHR) {
var response = JSON.parse(data);
var id=response[0];
ob = response[1];
}).fail(function (jqXHR,status,err) {
alert("Error in function");
}).always(function () {
alert ("Done!");
})
});
这是所谓的PHP函数:
<?php
$host = "localhost";
$username = "me";
$password = "mypass";
$db_name = "invalid"; //not existing DB
$code= $_GET['code'];
// Create connection
$db = new mysqli($host, $username, $password,$db_name); //here the error
$query = "SELECT * FROM Table WHERE Code='".$code."'";
$result = mysqli_query($db,$query);
$row = mysqli_fetch_array($result);
$id = $row[ID];
$list = [
"Name" => "John",
"Surname" => "Smith"
];
$res = array($id, $list);
echo json_encode($res);
?>
您会看到由于凭据错误而无法执行数据库访问,因此我希望收到一些错误,并被“失败”拦截
这不会发生,并且我得到一个null(ID)和列表。
我是否误解了“失败”的含义?
答案 0 :(得分:1)
您应该返回一个合适的HTTP code。您可以使用http_response_code
:
$db = new mysqli($host, $username, $password, $db_name);
if ($mysqli->connect_error) {
http_response_code(401);
die;
}
任何非200错误代码都应导致触发失败处理程序。
如果您想捕获代码可能产生的任何错误,可以使用set_error_handler
和set_exception_handler
:
set_error_handler(function (int $errno , string $errstr, string $errfile, int $errline, array $errcontext) {
// Log error...
http_response_code(500);
});
set_exception_handler(function (\Exception $exception) {
// Log error...
http_response_code(500);
});
我在示例中使用了500(内部服务器错误)代码,但是您可以根据所得到的错误/异常来计算更合适的错误代码。
答案 1 :(得分:0)
当您的服务器响应http代码不是200(例如500服务器错误或运行时异常)时,将触发失败。
要测试失败的情况,您可以简单地抛出一些异常并将其处理掉。
或者更复杂的选择可能是提琴手,它是一个调试代理,您可以覆盖对所需内容的响应。