我有一个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脚本生成的脚本错误传递回调用。
答案 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);
谢谢。