↑ PHP5, PDO - PHP Data Objects | ||||
Урок - Режимы обработки ошибок в PDO | ||||
← Предыдущий урок Урок - Методы обработки ошибок в PDO
|
Следующий урок → Урок - Расширение возможностей PDO.
|
Режимы обработки ошибок
PDO предлагает выбор из 3 различных стратегий обработки ошибок, для соответствия вашему стилю разработки приложений.
- PDO::ERRMODE_SILENT - Это режим по умолчанию. PDO просто установит код ошибки.
- PDO::ERRMODE_WARNING - В дополнение к установке кода ошибки, PDO будет выдавать традиционное сообщение E_WARNING.
- PDO::ERRMODE_EXCEPTION - В дополнение к установке кода ошибки, PDO будет выбрасывать исключение PDOException и задаст его свойства, чтобы отразить код ошибки и саму ошибку.
Изменение режима обработки ошибок:
При создании соединения:
$pdoAttributes = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING, ); $pdo = new PDO( PDO_DSN, PDO_USERNAME, PDO_PASSWORD, $pdoAttributes);
В созданном соединении:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
Режим обработки ошибок PDO::ERRMODE_SILENT
PDO::ERRMODE_SILENT - Это режим по умолчанию. PDO просто установит код ошибки, чтобы проверить используя методы PDO::errorCode() и PDO::errorInfo() или PDOStatement::errorCode() и PDOStatement::errorInfo().
Если ошибка произошла в результате вызова запроса, вы должны использовать методы PDOStatement::errorCode() или PDOStatement::errorInfo() для объекта запроса.
$sql = $pdo->prepare("SELECT * FROM `unknown_table`"); $sql->execute(); echo "PDOStatement::errorCode(): "; print $sql->errorCode();
Результат:
PDOStatement::errorCode(): 42S02
Если ошибка произошла в результате вызова объекта базы данных, вы должны вызвать методы объекта базы данных PDO::errorCode() и PDO::errorInfo().
$sql = $pdo->exec("SELECT * FROM `unknown_table`"); echo "PDO::errorCode(): "; print $pdo->errorCode();
Результат:
PDO::errorCode(): 42S02
Важный момент!!
При возникновении ошибки на этапе создания соединения PDO выбрасывает исключение PDOException, а не ошибку или сообщение E_WARNING:
define('PDO_DSN', 'mysql:dbname=test;host=127.0.0.1'); define('PDO_USERNAME', 'root'); define('PDO_PASSWORD', 'не правильный пароль'); $pdo = new PDO( PDO_DSN, PDO_USERNAME, PDO_PASSWORD);
Таким образом, что бы обработать ошибку соединения необходимо заключить вызов в оператор try..catch:
try{ $pdo = new PDO( PDO_DSN, PDO_USERNAME, PDO_PASSWORD); // код }catch(Exception $e){ echo 'Error!'; }
Результат:
Error!
PDO использует стандарт SQL-92 SQLSTATE строк кода ошибки; отдельные драйверы PDO отвечают за отображение в родном коде в соответствующие коды SQLSTATE. PDO::errorCode() возвращает только код SQLSTATE. Если вам нужна более конкретная информация об ошибке, PDO используйте метод PDO::errorInfo() который возвращает массив, содержащий код SQLSTATE, внутренний код драйвера и текстовое сообщение об ошибке.
Режим обработки ошибок PDO::ERRMODE_WARNING
PDO::ERRMODE_WARNING - В дополнение к установке кода ошибки, PDO будет выдавать традиционное сообщение E_WARNING. Этот параметр полезен во время отладки/тестирования, если вы просто хотите увидеть, какие проблемы возникли, не прерывая при этом поток приложения.
define('PDO_DSN', 'mysql:dbname=test;host=127.0.0.1'); define('PDO_USERNAME', 'root'); define('PDO_PASSWORD', 'root'); define('DEBUG_MODE', TRUE); $pdoAttributes = array(); if(DEBUG_MODE){ $pdoAttributes[PDO::ATTR_ERRMODE] = PDO::ERRMODE_WARNING; } $pdo = new PDO( PDO_DSN, PDO_USERNAME, PDO_PASSWORD, $pdoAttributes); // ошибка в PDO $sql = $pdo->exec("SELECT * FROM `unknown_table`"); // ошибка в PDOStatement $sql = $pdo->prepare("SELECT * FROM `unknown_table`"); $sql->execute();
Результат:
Warning: PDO::exec() [pdo.exec]: SQLSTATE[42S02]: Base table or view not found: 1146
Table 'test.unknown_table' doesn't exist in ...
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42S02]:
Base table or view not found: 1146 Table 'test.unknown_table' doesn't exist in ...
Режим обработки ошибок PDO::ERRMODE_EXCEPTION
PDO::ERRMODE_EXCEPTION - В дополнение к установке кода ошибки, PDO будет выбрасывать исключение PDOException и задаст его свойства, чтобы отразить код ошибки и саму ошибку. Этот параметр также полезен во время отладки, так как это будет эффективно "взрывать" сценарий в точке ошибки, очень быстро указывая пальцем на потенциальные проблемы в коде (помните: имеет место автоматический откатоперации, если есть исключений the script to terminate(сценарий прекратить).
Режим PDO::ERRMODE_EXCEPTION также полезен, потому что вы можете структурировать обработку ошибок более четко, чем в традиционном PHP-стиле предупреждений, и с меньшим количеством вложенности кода, чем работа в автоматическом режиме и явно проверить возвращаемые значения каждого вызова базы данных.
Пример без обработки исключения:
$sql = $pdo->prepare("SELECT * FROM `unknown_table`"); $sql->execute(); echo "PDOStatement::errorCode(): "; print $sql->errorCode();
Результат:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.unknown_table' doesn't exist' in ...
Пример с обработкой исключения:
try{ $sql = $pdo->prepare("SELECT * FROM `unknown_table`"); $sql->execute(); // код до "}" будет пропущен, так как вызвано исключение echo "PDOStatement::errorCode(): "; print $sql->errorCode(); }catch( PDOException $e){ // будет выполнен echo 'PDOException: '.$e->getMessage(); }catch( Exception $e){ // будет пропущен echo 'Unknown error: '.$e->getMessage(); }
Результат:
PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.unknown_table' doesn't exist
Не зависимо от того в каком из объектов PDO или PDOStatement произошла ошибка - обработка идентична:
try{ $sql = $pdo->exec("SELECT * FROM `unknown_table`"); echo "PDO::errorCode(): "; print $pdo->errorCode(); }catch( PDOException $e){ // будет выполнен echo 'PDOException: '.$e->getMessage()."<br>\n"; }catch( Exception $e){ // будет пропущен echo 'Unknown error: '.$e->getMessage()."<br>\n"; } try{ $sql = $pdo->prepare("SELECT * FROM `unknown_table`"); $sql->execute(); // код до "}" будет пропущен, так как вызвано исключение echo "PDOStatement::errorCode(): "; print $sql->errorCode(); }catch( PDOException $e){ // будет выполнен echo 'PDOException: '.$e->getMessage()."<br>\n"; }catch( Exception $e){ // будет пропущен echo 'Unknown error: '.$e->getMessage()."<br>\n"; }
Результат:
PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.unknown_table' doesn't exist PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.unknown_table' doesn't exist
↑ PHP5, PDO - PHP Data Objects | ||||
Урок - Режимы обработки ошибок в PDO | ||||
← Предыдущий урок Урок - Методы обработки ошибок в PDO
|
Следующий урок → Урок - Расширение возможностей PDO.
|