PHP — Вывести ошибки в нужное место шаблона?

Здравствуйте PHP-ориентированные хабралюди.


Возник серьезный вопрос, на который на не нашел решения.

Условия:

— Есть не ахти какой шаблон, есть не ахти какой код на пхп. Код кипит, варит, и приготавливает результат. Далее включается шаблонизатор и выводит этот результат. Все бы ничего если бы в процессе кипячения кода не возникали варнинги. Если они появляются, то они выводятся перед шаблоном, а шаблон имеет всякие стили и другие вещи, что эти варнинги превращаются в малозаметный пиксел сверху браузера (наверно встречали такую ситуацию).

— Если будет фатальная ошибка сам шаблон не будет выводиться и ошибка будет явно заметна, с этим проблем нету. С варнингами и замечаниями есть проблемы.

Задача:

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


Капал литературу вроде этой, stderr не дал результатов:
php.net/manual/en/wrappers.php.php
janicky.com/content/article_18.html

пхп запущен в режиме mod_php


=======

Не вижу способа, как через логи, но это костыль!


Давайте собирать консорциум, свой вклад уже дал. А у вас есть идеи?



=======


UPD:

Пасибо тем кто ответил на вопрос и подписал данный вопрос в избранное, судя по всему он лучший за последние 2 недели, я добавляю к данному вопросу свой ответ:


Иногда появляется проблема с тем что не плохобы сделать перехват ошибок с ООП для этого функция set_error_handler настраивается на МЕТОД так:

// Classes<br/>
class BaseCore implements IBaseCore<br/>
{<br/>
 const ERRROR_LAYOUT = true;<br/>
<br/>
public function __construct()<br/>
 {<br/>
 // Установка перехвадчика ошибок<br/>
 set_error_handler(array(&$this, 'error_handler'));<br/>
 }<br/>
 <br/>
 public function error_handler($errno, $errstr, $errfile, $errline, $errcontext)<br/>
 {<br/>
 return false; // функция отключена, использовать базовые установки<br/>
 }<br/>
 <br/>
 public function __call($method, $arg)<br/>
 {<br/>
 throw new ErrorFatalBaseException(self::ERRROR_LAYOUT, $method);<br/>
 }<br/>
}<br/>



Надеюсь помог, удачи вам
  • Вопрос задан
  • 5486 просмотров
Решения вопроса 1
Для отслеживания ошибок PHP:
// Устанавливаем обработчик ошибок (в рабочей версии закомментить)
set_error_handler('writeerror');

function writeerror($errno, $errstr, $errfile, $errline) {
// Вы водим ошибку. writelog - пользовательская функция. Используйте свою
writelog('php_error', date("y.m.d H:m:s")."\t".$errno."\t".$errstr."\t".$errfile."\t".$errline);
// Возвращаем true чтобы продолжить работу
return true;
}


Для отслеживания ошибок MySQL:
function sql_query($query) {
// Подключаем базу
dbconnect();
$return = mysql_query($query);
$error = mysql_error();
if ($error=='') {
return $return;
}
else {
writelog('sql_error', date("y.m.d H:m:s")."\t".$error);
return false;
};
}

Думаю принцип понятен.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@vvnick
Также не лишним будет проверить такие настройки PHP (в php.ini) как display_errors и error_reporting.
И убедиться что в продакшене ошибки просто не будут выводиться, а только обрабатываться Вашим errorHandlerom.
Ответ написан
powder96
@powder96
Все очень просто. Инициализируете переменную, в которую Вы будете складывать ошибки. Затем, ставите некую фнукцию как обработчик ошибок. После делаете так, чтобы функция складывала ошибку в переменную. Готово.

$errors = '';

set_error_handler('errorHandler'); // обязательно почитайте про это функцию на php.net

function errorHandler($errno, $errstr, $errfile, $errline) {
    global $errors;
    $errors .= 'An error occured. ' . $errstr . ' at ' . $errfile . ':' . $errline . '<br />'
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы