PHP PDO: ошибки и обработка ошибок
Справочное руководство по PHP PDO
-
PDO::ERRMODE_SILENT
Это режим по умолчанию. PDO просто устанавливает код ошибки, а вы можете использовать методы PDO::errorCode() и PDO::errorInfo() для проверки объекта запроса и объекта базы данных. Если ошибка вызвана вызовом метода объекта запроса, вы можете вызвать методы PDOStatement::errorCode() или PDOStatement::errorInfo() этого объекта. Если ошибка вызвана вызовом метода объекта базы данных, вы можете вызвать вышеуказанные два метода у объекта базы данных.
-
PDO::ERRMODE_WARNING
Помимо установки кода ошибки, PDO также выдаст традиционное сообщение E_WARNING. Если вы просто хотите увидеть, что пошло не так, не прерывая поток приложения, эта настройка очень полезна при отладке/тестировании.
-
PDO::ERRMODE_EXCEPTION
Помимо установки кода ошибки, PDO также выбросит класс исключения PDOException и установит его свойства в соответствии с кодом ошибки и сообщением об ошибке. Эта настройка также очень полезна при отладке, поскольку она эффективно усиливает место в скрипте, где произошла ошибка, позволяя быстро определить потенциально проблемные участки кода (помните: если исключение приводит к завершению скрипта, транзакция автоматически откатывается).
Ещё один очень полезный аспект режима исключений заключается в том, что по сравнению с традиционными предупреждениями в стиле PHP вы можете более ясно построить собственную обработку ошибок, а по сравнению с тихим режимом и явной проверкой возвращаемого значения каждого вызова базы данных режим исключений требует меньше кода/вложенности.
Создание экземпляра PDO и установка режима ошибок
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
?>
Примечание:Независимо от того, установлен ли в данный момент PDO::ATTR_ERRMODE, если соединение не удаётся, PDO::__construct() всегда выбросит PDOException. Неперехваченное исключение является фатальным.
Создание экземпляра PDO и установка режима ошибок в конструкторе
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';
/*
使用 try/catch 围绕构造函数仍然有效,即使设置了 ERRMODE 为 WARNING,
因为如果连接失败,PDO::__construct 将总是抛出一个 PDOException 异常。
*/
try {
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
exit;
}
// 这里将导致 PDO 抛出一个 E_WARNING 级别的错误,而不是 一个异常 (当数据表不存在时)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
Приведённый выше пример выведет:
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in /tmp/pdo_test.php on line 18 add a note add a note
Другие расширения