Intereting Posts
Как передать значение атрибута объекта для формирования Symfony2? Как динамически использовать несколько баз данных для одной модели в CakePHP Отправить почту с помощью PHP как однозначно идентифицировать удаленный компьютер в php? _remap или URI Маршрутизация в кодеригенере Неустранимая ошибка: вызов неопределенной функции pg_connect WordPress url rewriting – хороший URL с именем от SugarCRM Одновременно загружая файлы на несколько ftp с помощью php? Неустранимая ошибка: уровень вложенности слишком глубокий – рекурсивная зависимость? Миграция Yii2 из Apache в Nginx – не удалось выполнить бэкэнд-приложение Преобразование числа с запятой в виде десятичной точки для плавания Loop, отдельный процесс для последней записи (простейшее решение) Facebook как ошибка сервера 500 Реализация длинного опроса с помощью jQuery и PHP Точка в многоугольнике с использованием geoPHP

Разбор PHP-ответа: Неактивный SyntaxError: Неожиданный токен <

Я использую AJAX для вызова сценария PHP. Единственное, что мне нужно проанализировать из ответа, – это случайный идентификатор, сгенерированный скриптом. Проблема в том, что PHP-скрипт вызывает множество ошибок. Ошибки на самом деле прекрасны и не мешают функциональности программы. Единственная проблема заключается в том, что когда я запускаю

$.parseJSON(response) 

Я получил:

 Uncaught SyntaxError: Unexpected token < 

Поскольку ответ PHP начинается с ошибки:

 <br /> <b>Warning</b>: 

Мне интересно, как изменить PHP или JS таким образом, чтобы он мог анализировать идентификатор, несмотря на ошибки.

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) В дополнение к предупреждениям есть «уведомления», которые вызывают одну и ту же проблему.

Почему бы не справиться с предупреждением и не устранить его, чтобы результат с сервера был на самом деле JSON?

Существует несколько способов решения этой проблемы (любой из них будет работать):

1. Исправьте свои предупреждения. :
PHP говорит что-то по какой-то причине.

2. Отключите отображение ошибок и отображение ошибок :
В верхней части файла укажите следующие

 error_reporting(false); ini_set('display_errors', false);<br/> 

3. Используйте выходной буфер :
В верхней части вашего файла

 ob_start(); 

Когда у вас есть массив данных и ваш готовый эхо к браузеру, очистите буфер всех предупреждений о предупреждениях и т. Д.

 ob_clean(); echo json_encode($returnData); ob_flush(); 

4. Установите собственный обработчик ошибок :

 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:
Отредактируйте свой ответ как массив 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']; } 

Как и все остальные, вы ДОЛЖНЫ исправить свои ошибки и обработать их соответственно.

Это нечто большее, чем при обстоятельствах, когда вы не будете контролировать и все же хотите обрабатывать ошибки соответственно:

 <?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(); 

Хотя это не решает более широкую проблему предупреждений, я использовал этот хак для анализа ответа:

 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

 <?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> - <!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);

  • или просто добавьте знак @ перед каждой строкой php-кода, на котором, как вы думаете, может появиться предупреждение

Счастливое кодирование !!

Сценарий, используемый в вызове Ajax, должен иметь совершенную конструкцию, не должен вызывать никаких предупреждений просто по удобству, для производства вы должны отключить erros, поэтому исправьте его в процессе разработки, отредактируйте вопрос с предупреждением, что phps givin мы помогаем вам напрямую смысл.

1-я альтернатива:

Решите проблему, вызвавшую предупреждение. Хорошая система PHP никогда не должна показывать уведомление, предупреждение или ошибку PHP. Это может вызвать критическую информацию.

Вторая альтернатива:

Просто отключите отчет об ошибках, установив

error_reporting(0);

Это будет работать, но спрячет даже вам любые ошибки.

Третья альтернатива:

Установите функцию обработчика ошибок, которая обрабатывает ошибку, и покажет сообщение об ошибке JSON, которое не вызывает никаких проблем.

Также я рекомендую вам регистрировать эти исключения. Это позволит вам отладить любые проблемы с системой.

Моя рекомендация?

Используйте 1-й и 3-й альтернативы вместе и будьте СЧАСТЛИВЫ!

Вы можете использовать конструкцию Try..Catch в коде функции javascript, как показано ниже.

 function returnReport(response) { try { var parsedResponse = $.parseJSON(response); console.log(parsedResponse); pdfID = parsedResponse['id']; } catch(err) { //Do something with the err } } 

Это будет работать, даже если ваш php-код генерирует отладочную информацию в ответ.

Если вы хотите увидеть ошибку в JavaScript, вы должны обработать ошибку на PHP с помощью «try catch» и «catch», чтобы сделать что-то вроде «echo json_enconde ($ error)»; на этом пути вы можете анализировать JavaScript.

Пример:

 try{ $returnData = array(); $returnData['id'] = $pdfID; echo json_encode($returnData); }catch (Exception $e) { echo json_encode($e); } 

Надеюсь, это поможет :)!