如何让jQueryajax执行错误函数


How to get jQuery ajax to execute error function

我已经四处查看并遵循了这篇文章中的说明,但我仍然无法执行error函数。我想做的是让我的PHP脚本返回errorsuccess以及一条消息。最终,它将是从数据库返回的数据,该数据库将被放入div中,但目前我只需要让错误处理工作起来。我希望这里有人能帮我解决这个问题。我在下面包含了我的代码。

这显然是我的AJAX请求。

function getProductInfo() {
    if($("#serialNumber").val() != '') {
        serialNumber = $("#serialNumber").serialize();
        $.ajax({
            type: "POST",
            url: 'post.php',
            data: serialNumber + "&getSerialNumber=" + 1,
            dataType: 'json',
            success: function(data, textStatus, jqXHR) {
                console.log("SUCCESS");
            },
            error: function(jqXHR, textStatus, errorThrown) {
                console.log("ERROR");
            }
        });
    }
}

这是我的php函数,它将以JSON 的形式返回错误和消息

function getSerialNumber() {
    $serial = $_POST['serial'];
    $product = new Inventory;
    if($product->GetSerial($serial)) {
        $productInfo = $product->GetSerial($serial)->first();
        echo '{"error": false, "message": "Successfully got serial number"}';
    } else {
        echo '{"error": true, "message": "failed to get serial number"}';
    }
}

就目前的代码而言,无论它是否真的有错误,它都只会继续输出SUCCESS

您需要发送除200:之外的http状态代码

if($product->GetSerial($serial)) {
    $productInfo = $product->GetSerial($serial)->first();
    header('Content-Type: application/json', true, 200);
    die(json_encode(["error"=> false, "message"=> "Successfully got serial number"]));
} else {
    header('Content-Type: application/json', true, 400);
    die(json_encode(["error"=> true, "message"=> "failed to get serial number"]));
}

此外,在发送json时,请相应地设置内容类型,不要尝试手动构建json字符串,而是使用内置的json_encode函数,最好使用die()exit()而不是echo,以避免任何意外的额外输出

也就是说,尽管发送适当的状态代码似乎是个好主意,但您可能会发现,总是返回200并解析响应,并保留意外错误的错误处理程序

要容易得多

一个选项是在后端设置错误。另一个是在成功时注意您的逻辑错误的ajax方法。

success: function(data, textStatus, jqXHR) {
                if ( data.error == 'false' ) 
                    console.log('success');
                else
                    console.log('error');
            },

因此,如果不更改后端,整个功能可能看起来像:

function getProductInfo() {
    var result;
    if($("#serialNumber").val() != '') {
        serialNumber = $("#serialNumber").serialize();
        $.ajax({
            type: "POST",
            url: 'post.php',
            data: serialNumber + "&getSerialNumber=" + 1,
            dataType: 'json',
    success: function(data, textStatus, jqXHR) {
                    if ( data.error == 'false' ) 
                        {
                            console.log('success');
                            result = data.message;
                         }
                    else
                        {
                            console.log('error');
                            result = data.message;
                         }
                },
            error: function(jqXHR, textStatus, errorThrown) {
                console.log("ERROR");
            }
        });
    }
    return result;
}