如何让jQuery ajax执行错误功能

时间:2015-03-03 14:28:44

标签: javascript php jquery ajax

我环顾四周并按照this post上的说明操作,但我仍然无法执行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

2 个答案:

答案 0 :(得分:4)

您需要发送除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并解析响应更容易,并保留错误处理程序以防止意外错误

答案 1 :(得分:1)

一种选择是在后端设置错误。 另一个是关注你的逻辑错误的成功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;
}