我使用AJAX来调用PHP脚本。我需要从响应中解析的唯一内容是脚本生成的随机ID。问题是PHP脚本会抛出许多错误。这些错误实际上很好,并且不会妨碍程序功能。唯一的问题是我跑的时候
$.parseJSON(response)
我明白了:
Uncaught SyntaxError: Unexpected token <
由于PHP响应以错误开头:
<br />
<b>Warning</b>:
我想知道如何更改PHP或JS,以便它可以解析ID,尽管有错误。
PHP:
$returnData = array();
$returnData['id'] = $pdfID;
echo json_encode($returnData);
...
JS:
function returnReport(response) {
var parsedResponse = $.parseJSON(response);
console.log(parsedResponse);
pdfID = parsedResponse['id'];
我知道警告应该得到解决,但警告对于现在来说并不重要,更重要的是
1)即使解决了这些警告,也可能会出现新的警告,并且JSON仍然应该正确解析并且
2)除了警告之外,还有通知&#39;导致同样的问题。
答案 0 :(得分:14)
为什么不处理并消除警告,以便服务器的结果实际上是JSON?
答案 1 :(得分:5)
有几种方法可以解决(其中任何一种方法都有效):
<强> 1。修正你的警告。 :
由于某种原因,PHP正在说些什么
2。关闭error reporting&amp; error display:
在文件顶部放置以下内容
error_reporting(false);
ini_set('display_errors', false);<br/>
3。使用output buffer:
位于文件顶部
ob_start();
当您拥有数据阵列并准备回显浏览器时,请清除所有通知警告的缓冲区等。
ob_clean();
echo json_encode($returnData);
ob_flush();
4. 设置custom error handler:
set_error_handler("myCustomErrorHandler");
function myCustomErrorHandler($errno, $errstr, $errfile, $errline){
//handle error via log-to-file etc.
return true; //Don't execute PHP internal error handler
}
5。可选择在JavaScript中:
Sanitse你的回应是一个JSON数组:
function returnReport(response) {
response = response.substring(response.indexOf("{") - 1); //pull out all data before the start of the json array
response = response.substring(0, response.lastIndexOf("}") + 1); //pull out all data after the end of the json array
var parsedResponse = $.parseJSON(response);
console.log(parsedResponse);
pdfID = parsedResponse['id'];
}
答案 2 :(得分:1)
就像其他人所说的那样,你应该真正修复你的错误并相应地处理它们。
在您无法控制但又想要相应处理错误的情况下,这是更多的事情:
<?php
//Change it to 'production' or something like that
//so that you don't send debug data on production
define('ENVIRONMENT', 'testing');
//Set your error handler globally
set_error_handler('handle_error');
function handle_error($errno, $errstr, $errfile, $errline, array $errcontext )
{
//Set your headers to send a different than 200 so you can
//catch it on error on jQuery
header($_SERVER["SERVER_PROTOCOL"].' 500 Internal Server Error');
//Set output as json
header('Content-Type: application/json');
//Create some sort of response object
$response = new stdClass;
$response->message = "Application error details";
//You dont want to give debug details unless you are not on prod
if(ENVIRONMENT == 'testing') {
$severity = get_err_severity($errno);
$response->error_detail = "({$severity}) [{$errfile}@L{$errline}]: {$errstr}";
$response->context_vars = $errcontext;
}
//Return the json encoded error detail and exit script
$json = json_encode($response);
exit($json);
}
function get_err_severity($severity)
{
switch($severity) {
case E_ERROR:
return 'E_ERROR';
case E_WARNING:
return 'E_WARNING';
case E_PARSE:
return 'E_PARSE';
case E_NOTICE:
return 'E_NOTICE';
case E_CORE_ERROR:
return 'E_CORE_ERROR';
case E_CORE_WARNING:
return 'E_CORE_WARNING';
case E_COMPILE_ERROR:
return 'E_COMPILE_ERROR';
case E_COMPILE_WARNING:
return 'E_COMPILE_WARNING';
case E_USER_ERROR:
return 'E_USER_ERROR';
case E_USER_WARNING:
return 'E_USER_WARNING';
case E_USER_NOTICE:
return 'E_USER_NOTICE';
case E_STRICT:
return 'E_STRICT';
case E_RECOVERABLE_ERROR:
return 'E_RECOVERABLE_ERROR';
case E_DEPRECATED:
return 'E_DEPRECATED';
case E_USER_DEPRECATED:
return 'E_USER_DEPRECATED';
}
}
function test_error()
{
$test = array('foo'=>'bar');
$baz = $test['baz'];
echo $baz;
}
test_error();
答案 3 :(得分:0)
虽然这并没有解决更广泛的警告问题,但我使用这个黑客来解析响应:
function returnReport(response) {
var pdfID = parseID(response);
...
}
function parseID(response) {
var responseIndex = response.indexOf('{"id');
var start = responseIndex + 7;
var pdfID = response.slice(start, start + 6);
return pdfID;
}
答案 4 :(得分:0)
我知道每个人都建议你修复错误,我同意,但如果你不想那么还有另一个解决方案。
如果您收到许多警告并且预计会出现新警告,只需禁用警告和通知的报告:
error_reporting(E_ALL ^ (E_NOTICE | E_WARNING));
答案 5 :(得分:0)
如果启用了ob
ob_end_clean();
ob_start();
echo json_encode($returnData);
或者,在您的文件顶部
error_reporting(0);
答案 6 :(得分:0)
我确信您的PHP代码会出现一些错误,因为错误即将来临请查看以下内容:
echo
或print
用于打印回复。 我之所以这样说是因为我已经尝试过您的代码并且它对我很好,您也可以检查:
PHP文件:myContentPage.php
<?php
$returnData = array();
$returnData['id'] = 123;
echo json_encode($returnData);
?>
HTML文件:
<!DOCTYPE html>
<html>
<head>
<script type='text/javascript' src='js/jquery.js'></script>
</head>
<body>
<h1>Demo Example</h1>
<script>
function loadResponse() {
var dataString={};
$.ajax({
url:"myContentPage.php",
type: 'POST',
cache:false,
data: dataString,
beforeSend: function() {},
timeout:10000000,
error: function() { },
success: function(response) {
var parsedResponse = $.parseJSON(response);
pdfID = parsedResponse['id'];
console.log(pdfID);
alert(pdfID);
}
});
}
loadResponse();
</script>
</body>
</html>
要处理警告,您可以执行以下操作:
要跳过警告消息,您可以使用以下内容:
error_reporting(E_ERROR | E_PARSE);
快乐编码!!
答案 7 :(得分:0)
Ajax调用中使用的脚本必须具有完美的构造,不能仅仅为了方便而抛出任何警告,对于生产你应该禁用错误,所以将其修复为开发,编辑问题并发出警告,我们会帮助你直接点上。
答案 8 :(得分:0)
第一种选择:
解决导致警告的问题。一个好的PHP系统永远不应该显示PHP通知,警告或错误。这可能会暴露一些重要信息。
第二种选择:
只需设置
即可停用错误报告 error_reporting(0);
这会有效,但会隐藏任何错误。
第三种选择:
设置错误处理函数,该函数处理错误并显示不会导致任何问题的JSON友好错误消息。
另外,我建议您记录此例外情况。它将允许您调试任何系统故障。
我的推荐?
一起使用第一和第三种选择,并且快乐!
答案 9 :(得分:0)
您可以在javascript函数代码中使用Try..Catch构造,如下所示。
function returnReport(response) {
try
{
var parsedResponse = $.parseJSON(response);
console.log(parsedResponse);
pdfID = parsedResponse['id'];
}
catch(err)
{
//Do something with the err
}
}
即使你的php代码生成调试信息作为响应,这也会有效。
答案 10 :(得分:0)
如果你想在JavaScript中看到错误,你应该使用“try catch”处理PHP上的错误,并使用“catch”来执行类似“echo json_enconde($ error);”的操作。通过这种方式,您可以从JavaScript解析。
示例:
try{
$returnData = array();
$returnData['id'] = $pdfID;
echo json_encode($returnData);
}catch (Exception $e) {
echo json_encode($e);
}
我希望这会有所帮助:)!