Я программирую PHP в течение некоторого времени.
Я использую Windows XP SP3 с PHP 5.4 , SQlite 3 , Apache 2.4 в качестве среды разработки. Удаленный хост-сервер (не мой) – это Windows Server 2008 с PHP 5.3 , Apache 2.2 , IIS 7.0 и SQL Server 2008 .
Мой редактор – простой и замечательный EditPlus .
Что касается Javascript, то это хорошо из-за Firefox плюс отличный добавочный FireBug , который позволяет полностью отлаживать HTML + CSS + Javascript.
Моя проблема заключается в управлении ошибками PHP в моей среде разработки (моя персональная машина).
Ошибки синтаксиса PHP обычно выглядят нормально с номером строки и т. Д., Что позволяет легко исправить ошибки. Также есть онлайн-инструменты для синтаксиса проверки (например, pilliap ) и других онлайн-инструментов для проверки выполнения фрагментов PHP (например, writecodeonline.com )
Однако мое проклятие – это ошибки времени выполнения (например, неинициализированная переменная $ _SESSION ). Иногда он отображается правильно, но в других случаях сообщение об ошибке (включая номер правой строки!) Внедряется в исходный код внутри ложных тегов HTML. Простые тесты не представляют проблем. но мой реальный код вообще делает.
Это не то, что мешает мне двигаться вперед, но это неприятно.
Я не нашел в Интернете никаких намеков об этом странном поведении, и мне очень любопытно, сможет ли кто-нибудь понять это.
Мой вопрос: как может иногда возникать ошибка времени выполнения PHP в браузере (по желанию в среде разработки), иногда она появляется внутри исходного кода JavaScript и HTML вместе с ложными тегами HTML?
PS: Это не вопрос о файлах журнала PHP или Display Error в файле PHP.Ini.
PS2: То же самое происходит с установленным XDebug или без него.
Используйте функцию php error_log()
чтобы показать информацию о ваших ошибках так, как вы хотите.
Кроме того, посмотрите файл конфигурации php.ini
. Существует множество переменных ( html_errors
, error_log
, display_errors
, error_reporting
…), чтобы настроить вывод ошибок так, как вы хотите, чтобы они не испортили вывод html.
Это то, что для log_errors
и файла журнала ошибок. Просто прочитайте их, и все ваши ошибки хорошо перечислены.
EDIT: вы также можете перетащить все ошибки на странице, чтобы они отображались следующим образом:
Сначала установите error_prepend_string
и error_append_string
на что-то заметное. Например, вы можете использовать <phperrormessage>
и </phperrormessage>
. Просто все, что вряд ли появится в вашем законном выпуске.
Затем поместите это в начало вашего кода:
ob_start(function($c) { if( preg_match_all("(<phperrormessage>(.*?)</phperrormessage>)is",$c,$matches)) { $c = preg_replace("(<phperrormessage>(.*?)<phperrormessage>)is","",$c); $c = str_replace( "</body>", "<div id=\"phperrors\">".implode("<hr />",$matches[1])."</div></body>", $c); } return $c; });
Форумы и Q & A сайты действительно отличный ресурс для обучения! Спасибо Kolink и StackOverflow.com .
С наконечника Kolink я немного исследовал, а затем создал новый способ укротить подавляющее большинство ошибок времени выполнения в PHP.
Я не понял точно, что происходит, но я обнаружил мощный способ не использовать обработку ошибок PHP по умолчанию и вместо этого собирать все сообщения об ошибках во время выполнения в одном и том же месте.
Обратите внимание, что ошибки компиляции PHP не являются проблемой для меня, потому что любой синтаксический анализатор решает ее, включая PHP.exe.
Предположим, у меня есть исходный код PHP со многими потенциальными ошибками во время выполнения. Поэтому я помещаю свой код в следующие строки внутри тега HTML, например, в исходной позиции, где мне нужен PHP-код.
<script type="text/javascript"> var nerrors = 0; // PHP Errors count in Javascript function PHPErrors() { // Javascript Function that wraps the PHP Code <?php // MyErrorHandler is my function that my custom error handler // uses with error parameters in that given order. function myErrorHandler($errno, $errstr, $errfile, $errline) { echo "document.getElementById('PHPErro').innerHTML += " . "\"$errno: $errstr ($errline)<br>\";\r\n"; echo "nerrors = nerrors + 1;\r\n"; return true; } // That's the line the set my custom new error-handling // disabling the default error handling $old_error_handler = set_error_handler("myErrorHandler"); // Below random PHP code full of errors $b = $a; // PHP Error 1 $c = $a +1; // PHP Error 2 $d = $a + 1; // PHP Error 3 $e = $_SESSION['glove']; // PHP Error 4 ?> // No PHP runtime error deserves a nice messagen if (nerrors===0) { document.getElementById('PHPError').innerHTML = "Well done! PHP without errors."; } } // End Javascript Function
После этого кода можно свободно добавлять Javascript и PHP.
Наконец, я разместил свое место внутри части тела HTML в этих двух строках.
<p id="PHPError"> </p> <button onclick="PHPErrors()">Show me all PHP runtime errors</button>
Когда я просматриваю эту страницу PHP, я могу увидеть эту кнопку. Поэтому я нажимаю на него, и я вижу все сообщения об ошибках времени выполнения PHP или приятное сообщение «Хорошо сделано …» .
Наконец, я обнаружил, что происходит с PHP.
По умолчанию обработка ошибок PHP генерирует ошибки в разделе тела. С XDebug сообщение более подробно, но такая же ситуация происходит.
Поэтому, когда я добавляю PHP-код внутри JS-функции, перед разделом BODY это поведение не работает, потому что теги HTML перед блоком BODY генерируют мусор.
Ошибки синтаксиса различны, поскольку это предыдущая фаза от интерпретатора PHP, которая выполняется до запуска кода PHP + HTML.
Поэтому, чтобы можно было рассмотреть ошибку, в этом случае вам нужно посмотреть исходный код. Будут ложные теги с сообщением об ошибке.
Поэтому мой код в других Q & A, которые я опубликовал в StackOverflow, касается этой ситуации.
У меня такая же проблема.
Я пробовал ваше решение с ограниченным успехом. Мне действительно нравится мой первоначальный обработчик ошибок – он отправляет электронное письмо. Когда я использовал для создания страниц только с php, я обнаружил, что мне не нужно было отправлять электронное письмо, поскольку ошибка просто проявилась бы красиво. Теперь, когда я перехожу к javascript-рендерингу html, ошибка не появляется или скрыта. Журналирование является болезненным для навигации, источник страницы лучше, но мой адрес электронной почты всегда открыт. Он создает сообщение об ошибке и отправляет его по электронной почте, а также echo
сообщения, но, как мы знаем, это сбрасывается на источник страницы, а не появляется или иногда появляется в битах.
function pos_error_handler ($e_number, $e_message, $e_file, $e_line, $e_vars) { $includes = get_included_files(); //var_dump( $includes); //echo 'WTF'; // Build the error message. $message = "<p>Nice Job moron: A pos error occurred in script '$e_file' on line $e_line: $e_message\n<br />"; // Add the date and time: $message .= "Date/Time: " . date('njY H:i:s') . "\n<br />"; // Append $e_vars to the $message: $message .= "<pre>Error Variables:<br />" . print_r ($e_vars, 1) . "</pre>\n</p>"; // what is the url? $message .= "<p><pre>URL: " .getPageURL() . "</pre>\n</p>"; $message .= '<pre>Session variables:<br />' . print_r($_SESSION,1). "</pre>\n</p>"; $message .= '<pre>Bactrace:<br />' . print_r(debug_backtrace(),1). "</pre>\n</p>"; if (!LIVE) { // Send an email to the admin: mail(SUPPORT_EMAIL, 'TEST Site Error!', $message, 'From: ' . SUPPORT_EMAIL); // Development (print the error). echo '<div class="error">' . $message . '</div><br />'; } else { // Send an email to the admin: mail(SUPPORT_EMAIL, 'Site Error!', $message, 'From: ' . SUPPORT_EMAIL); // Only print an error message if the error isn't a notice: include(HEADER_FILE); if ($e_number != E_NOTICE) { echo '<div class="error">A system error occurred. We apologize for the inconvenience.</div><br />'; } echo '<div class="error">An Error has occurred and has been emailed to the administrator. Please note the conditions that caused this error and send a note to the administrator</div><br />'; } //include(FOOTER_FILE); exit(); }
вfunction pos_error_handler ($e_number, $e_message, $e_file, $e_line, $e_vars) { $includes = get_included_files(); //var_dump( $includes); //echo 'WTF'; // Build the error message. $message = "<p>Nice Job moron: A pos error occurred in script '$e_file' on line $e_line: $e_message\n<br />"; // Add the date and time: $message .= "Date/Time: " . date('njY H:i:s') . "\n<br />"; // Append $e_vars to the $message: $message .= "<pre>Error Variables:<br />" . print_r ($e_vars, 1) . "</pre>\n</p>"; // what is the url? $message .= "<p><pre>URL: " .getPageURL() . "</pre>\n</p>"; $message .= '<pre>Session variables:<br />' . print_r($_SESSION,1). "</pre>\n</p>"; $message .= '<pre>Bactrace:<br />' . print_r(debug_backtrace(),1). "</pre>\n</p>"; if (!LIVE) { // Send an email to the admin: mail(SUPPORT_EMAIL, 'TEST Site Error!', $message, 'From: ' . SUPPORT_EMAIL); // Development (print the error). echo '<div class="error">' . $message . '</div><br />'; } else { // Send an email to the admin: mail(SUPPORT_EMAIL, 'Site Error!', $message, 'From: ' . SUPPORT_EMAIL); // Only print an error message if the error isn't a notice: include(HEADER_FILE); if ($e_number != E_NOTICE) { echo '<div class="error">A system error occurred. We apologize for the inconvenience.</div><br />'; } echo '<div class="error">An Error has occurred and has been emailed to the administrator. Please note the conditions that caused this error and send a note to the administrator</div><br />'; } //include(FOOTER_FILE); exit(); }