エラー処理とPHPのPDOのエラー
- PDO :: ERRMODE_SILENT
これがデフォルトのモードです。 PDOは単にステートメントおよびデータベース・オブジェクトをチェックするためにPDO :: errorCode()およびPDO :: errorInfo()メソッドを使用して、エラーコードを設定します。 エラーがcallステートメントのオブジェクトが生成さに起因している場合は、そのオブジェクトの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 :: __構築物は、()は常に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