PHP PDO: ошибки и обработка ошибок

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

PHP PDO 参考手册Справочное руководство по PHP PDO

Другие расширения