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/>



Надеюсь помог, удачи вам
  • Вопрос задан
  • 5087 просмотров
Решения вопроса 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 />'
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Zelo Москва
от 130 000 руб.
Amigoweb Магнитогорск
от 40 000 до 60 000 руб.
Digital Clouds Новосибирск
от 60 000 руб.