在JSON中传递PHP分析器错误?

时间:2019-02-28 13:34:40

标签: php jquery ajax

我有一个HTML页面,该页面将JQuery Ajax调用发送到PHP页面,并且期望JSON响应。如果PHP出现解析器错误,则会将该错误返回给调用,但不会以JSON格式返回,因此最终会在Ajax端引发“ JSON.parse:意外字符”错误。

有没有办法让PHP以JSON友好格式发送错误消息? (是的,它会将错误发送到PHP文件目录中的event.log,但我不想每次脚本有问题时都​​不必经过访问它的麻烦。)

编辑:有人要求输入代码-我的意思是,像这样:

首先,“糟糕的” PHP脚本oops.php:

<?php
    $x = "There's no terminating semicolon"
    echo json_encode($x);
?>

现在,调用它的HTML页面oops.html:

<html>
<head><title>OOPS</title></head>
<body>
<div id="text_goes_here"></div>
</body>

<script>
var $outputText = "Text goes here";

$.ajax({
    url:"oops.php",
    type:"GET",
    data: {},
    success:function(data) {
        outputText = "Success:<br />";
        for (var d in data) {
            outputText += (data[d] + "<br />");
        }
        document.getElementById("text_goes_here").innerHTML = outputText;
    }, 
    error:function(xhr, status, message) {
        outputText = "Error:<br />";
                   + "Status: " + status + "<br />"
                   + "Message: " + message + <br />";
        document.getElementById("text_goes_here").innerHTML = outputText;
    },
    dataType:"json"
});
</script>
</html>

问题似乎是,PHP返回了一条错误消息,但不是JSON格式,因此.ajax调用的JSON解析器不了解它是什么,并引发了自己的错误。我希望能够以调用可以读取的格式将PHP脚本生成的脚本错误传递回调用。

1 个答案:

答案 0 :(得分:1)

使用try-catch块。

This article显示了如何编写带有已处理异常的AJAX处理程序。

这是PHP代码。

<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/inc/ajax.inc.php'; 
try { 
    if ($_SERVER['REQUEST_METHOD'] !== "POST") {
        throw new Exception('Invalid Request', 2000);
    } else {
        // status is true if everything is fine
        exit(json_encode(
            array(
                'status' => true
            )
        ));
    }
} catch(Exception $e) {

    echo json_encode(
        array(
            'status' => false,
            'error' => $e -> getMessage(),
            'error_code' => $e -> getCode()
        )
    );
    exit;
}

然后,JS代码:

function jsonParse() {
    try {
        var json = JSON.parse(text);
    } 
    catch(e) {
        return false;
    }
    return json;
}

var http = new XMLHttpRequest();
var data = "username=" + name + '&email=' + email;

http.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        var json = jsonParse(this.responseText);

        if (!json || json.status !== true) {
            console.log(json.error || 'Something Bad Happened');
            return;
        }    

        alert('Everything is Fine!');

    }
}

http.open('ajax.php', 'POST', true);
http.send(data);

谢谢。