Необходимо получить доступ к информации, помогающей в устранении проблем. Например, если запрос завершен неудачно, то требуется просмотреть сообщения об ошибках, возвращенных базой данных.
Для исследования результатов одиночного запроса применяется метод 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:
<br />
<b>Notice</b>: DB Error: no such field in <b>/usr/local/lib/php/PEAR.php</b>
\
on line <b>593</b><br />
Ошибки 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 выполнение программы прекращается после выдачи следующего сообщения об ошибке:
<br />
<b>Fatal error</b>: DB Error: no such field in <b>/usr/local/lib/php/
PEAR.php</b>
on line <b>593</b><br />