Передача ошибок парсера PHP обратно в JSON? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть HTML-страница, которая отправляет вызов JQuery Ajax на страницу PHP и ожидает ответа JSON.Если PHP имеет ошибку синтаксического анализатора, ошибка возвращается к вызову, но не в формате JSON, поэтому в конечном итоге выдается ошибка «JSON.parse: неожиданный символ» на стороне Ajax.

Есть лиспособ заставить PHP отправить сообщение об ошибке обратно в формате JSON?(Да, он отправляет сообщение об ошибке в файл event.log в каталоге PHP-файла, но я бы предпочел не перепрыгивать через циклы доступа к нему каждый раз, когда возникает проблема со сценарием.)

Редактировать:Кто-то спросил код - я имею в виду, что-то вроде этого:

Во-первых, «плохой» PHP-скрипт, oops.php:

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

Теперь HTML-страница, которая вызываетit, 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, поэтому анализатор JSON вызова .ajax не понимает, что это такое, ивыдает ошибку самостоятельно.Я хочу иметь возможность передать ошибку сценария, сгенерированную сценарием PHP, обратно в вызов в формате, который вызов может прочитать.

1 Ответ

0 голосов
/ 28 февраля 2019

Используйте блок try-catch.

В этой статье показано, как написать обработчик 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);

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...