解析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代码中不应有多个echoprint用于打印响应。
  • 必须正确包含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); } 

我希望这有帮助 :)!