Я использую 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-коде будут ошибки, из-за ошибки, пожалуйста, проверьте несколько вещей:
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>
-<!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);
Счастливое кодирование !!
Сценарий, используемый в вызове 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); }
Надеюсь, это поможет :)!