解析PHP响应:未捕获的SyntaxError:意外的令牌<
我正在使用AJAX来调用PHP脚本。 我需要从响应中解析的唯一内容是脚本生成的随机ID。 问题是PHP脚本会引发许多错误。 错误实际上很好,不会妨碍程序function。 唯一的问题是我跑的时候
$.parseJSON(response)
我明白了:
Uncaught SyntaxError: Unexpected token <
由于PHP响应以错误开头:
Warning:
我想知道如何更改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'];
我知道警告应该得到解决,但警告对于现在而言更重要的是function不重要
1)即使这些警告得到解决,新的警告也可能出现在线上,JSON仍应正确解析
2)除警告外,还有“通知”导致同样的问题。
为什么不处理并消除警告,以便服务器的结果实际上是JSON?
有几种方法可以解决(其中任何一种都可以):
1.修正你的警告。 :
PHP正在说一些原因。
2.关闭错误报告和错误显示 :
在文件的顶部放置以下内容
error_reporting(false); ini_set('display_errors', false);
3.使用输出缓冲区 :
位于文件顶部
ob_start();
当您拥有数据arrays并准备回显浏览器时,请清除所有通知警告的缓冲区等。
ob_clean(); echo json_encode($returnData); ob_flush();
4.设置自定义error handling程序 :
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']; }
就像其他人说过的那样,你应该真正修复你的错误并相应地处理它们。
在您无法控制但又想要相应处理错误的情况下,这是更多的事情:
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();
虽然这不能解决更广泛的警告问题,但我使用这个hack来解析响应:
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; }
我知道每个人都建议你修复错误,我同意,但如果你不想,那么还有另一个解决方案。
如果您收到许多警告并且预计会出现新警告,只需禁用警告和通知的报告:
error_reporting(E_ALL ^ (E_NOTICE | E_WARNING));
如果启用了ob
ob_end_clean(); ob_start(); echo json_encode($returnData);
或者,在您的文件顶部
error_reporting(0);
我确信你的PHP代码会有一些错误,因为错误来了,请检查一些事情:
- 确保php代码中不应有多个
echo
或print
用于打印响应。 - 必须正确包含jQuery。
- 并检查您的函数/页面中的其他php代码,它们不会产生任何运行时错误/警告,因为它也会产生同样的问题。
我这样说是因为我已经尝试过你的代码并且它对我来说很好,你也可以检查一下:
PHP文件:myContentPage.php
HTML文件:
Demo Example
为了处理警告,你可以这样做:
-
要跳过警告消息,您可以使用以下内容:
error_reporting(E_ERROR | E_PARSE);
- 或者只是在每行php代码之前添加@符号,你认为警告可以来了
快乐编码!!
在Ajax调用中使用的脚本必须具有完美的构造,不应仅仅为了方便而抛出任何警告,对于生产你应该禁用错误,所以将其修复到开发中,编辑问题的警告是我们直接帮助你的phps givin关键点。
第一种选择:
解决导致警告的问题。 一个好的PHP系统永远不应该显示PHP通知,警告或错误。 这可能会暴露一些关键信息。
第二种选择:
只需通过设置禁用错误报告
error_reporting(0);
这将有效,但会隐藏任何错误。
第三种选择:
设置error handling程序函数,该函数处理错误并显示不会导致任何问题的JSON友好错误消息。
另外,我建议您记录此例外情况。 它将允许您调试任何系统故障。
我的推荐?
一起使用第一和第三种选择,并且快乐!
您可以在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代码生成调试信息作为响应,这将工作。
如果你想在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); }
我希望这有帮助 :)!