Регистрация отладочной информации и ошибок

Задача
Необходимо получить доступ к информации, помогающей в устранении проблем. Например, если запрос завершен неудачно, то требуется просмотреть сообщения об ошибках, возвращенных базой данных.

Решение
Для исследования результатов одиночного запроса применяется метод DB::isError():

$sth = $dbh->query("SELECT aroma FROM zodiac WHERE element LIKE 'fire'");
DB::isError($sth) and print 'Database Error: '.$sth->getMessage();

Метод DB::setErrorHandling() позволяет предусмотреть автоматическое
реагирование на любую ошибку базы данных:

$dbh->setErrorHandling(PEAR_ERROR_PRINT);
$sth = $dbh->query("SELECT aroma FROM zodiac WHERE element LIKE 'fire'");

Обсуждение
Большинство методов PEAR DB, столкнувшись с ошибкой, возвращают объект DB_Error. Метод DB::isError() возвращает значение true, если ему передан объект DB_Error, поэтому его можно использовать для тестирования результатов отдельных запросов. Класс DB_Error является дочерним классом класса PEAR::Error, поэтому для отображения информации об ошибке можно применять такие методы, как getMessage(). Все содержимое объекта Error можно вывести при помощи функции print_r():

$sth = $dbh->query('SELECT aroma FROM zodiac WHERE element LIKE 'fire'");
if (DB::isError($sth)) {
print_r($sth);
}

В таблице zodiac нет столбца aroma, поэтому в результате будет напечатано:

db_error Object
(
[error_message_prefix] =>
[mode] => 1
[level] => 1024
[code] => -19
[message] => DB Error: no such field
[userinfo] => SELECT aroma FROM zodiac WHERE element LIKE 'fire' \
[nativecode=1054 ** Unknown column 'aroma' in 'field list']
[callback] =>
)

Применение функции setErrorHandling() позволяет определить действия, автоматически выполняемые всякий раз, когда возникает ошибка базы данных.


Укажите функции setErrorHandling() образ действий, передав ей константу PEAR_ERROR. Константа PEAR_ERROR_PRINT инициирует печать сообщения об ошибке, но выполнение программы продолжается:

$dbh->setErrorHandling(PEAR_ERROR_PRINT);
$sth = $dbh->query("SELECT aroma FROM zodiac WHERE element LIKE 'fire'");

В результате будет напечатано:

DB Error: no such field

Для того чтобы напечатать сообщение об ошибке и выйти из программы, используйте константу PEAR_ERROR_DIE. Или константу PEAR_ERROR_CALLBACK для запуска пользовательской функции при возникновении ошибки. Такая пользовательская функция может напечатать даже более подробную информацию:

function pc_log_error($error_obj) {
error_log(sprintf("%s (%s)",$error_obj->message,$error_obj->userinfo));
}
$dbh->setErrorHandling(PEAR_ERROR_CALLBACK,'pc_log_error');
$sth = $dbh->query("SELECT aroma FROM zodiac WHERE element LIKE 'fire'");

Когда некорректный SQL-оператор в методе $dbh->query() становится причиной ошибки, то вызывается функция pc_log_error() с переданным ей в качестве аргумента объектом DB_Error. Функция обратного вызова pc_log_error() использует свойства объекта DB_Error для вывода более полного сообщения в журнал ошибок:

DB Error: no such field (SELECT aroma FROM zodiac WHERE element
LIKE 'fire' [nativecode=Unknown column 'aroma' in 'field list'])

Для сбора всей информации из объекта ошибки и записи ее в журнал ошибок применяют функцию print_r() и буферизацию вывода при обработке ошибки:

function pc_log_error($error_obj) {
ob_start();
print_r($error_obj);
$dump = ob_get_contents();
ob_end_clean();
error_log('Database Error: '.$dump);
}
$dbh->setErrorHandling(PEAR_ERROR_CALLBACK,'pc_log_error');
$sth = $dbh->query("SELECT aroma FROM zodiac WHERE element LIKE 'fire'");

Следующий фрагмент включает все поля объекта ошибки в журнал сообщений об ошибках:
Database Error:

db_error Object
(
[error_message_prefix] =>
[mode] => 16
[level] => 1024
[code] => -19
[message] => DB Error: no such field
[userinfo] => SELECT aroma FROM zodiac WHERE element LIKE 'fire' \
[nativecode=1054 ** Unknown column 'aroma' in 'field list']
[callback] => pc_log_error
)

С помощью константы PEAR_ERROR_TRIGGER можно также заставить объект DB_Error генерировать внутреннюю ошибку PHP:

$dbh->setErrorHandling(PEAR_ERROR_TRIGGER);
$sth = $dbh->query("SELECT aroma FROM zodiac WHERE element LIKE 'fire'");

С константой PEAR_ERROR_TRIGGER функция setErrorHandling() для генерации внутренней ошибки использует функцию PHP trigger_error().


К этой ошибке применяется обработчик ошибок PHP по умолчанию или определенный пользователем обработчик, назначенный функцией set_error_handler(). По умолчанию внутренней ошибкой является E_USER_NOTICE:



Notice: DB Error: no such field in /usr/local/lib/php/PEAR.php
\
on line 593


Ошибки E_USER_WARNING или E_USER_ERROR воспроизводятся с помощью передачи второго аргумента функции setErrorHandling():

$dbh->setErrorHandling(PEAR_ERROR_TRIGGER,E_USER_ERROR);
$sth = $dbh->query("SELECT aroma FROM zodiac WHERE element LIKE 'fire'");

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



Fatal error: DB Error: no such field in /usr/local/lib/php/
PEAR.php

on line 593
.



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Автоматическое присваивание уникальных значений идентификаторов
Выполнение запросов к базе данных SQL
Извлечение строк без цикла
Кэширование запросов и результатов
Модификация данных в базе данных SQL

Вернуться в раздел: PHP / 10. Доступ к базам данных