PDO::ERRMODE_SILENT
これがデフォルトのモードです。 PDO はエラー コードを設定するだけで、ステートメントとデータベース オブジェクトの PDO::errorCode() メソッドと PDO::errorInfo() メソッドを使用して確認できます。ステートメント オブジェクトの呼び出しによってエラーが発生した場合は、そのオブジェクトの PDOStatement::errorCode() メソッドまたは PDOStatement::errorInfo() メソッドを呼び出すことができます。データベース オブジェクトの呼び出しによってエラーが発生した場合は、データベース オブジェクトに対して上記の 2 つのメソッドを呼び出すことができます。
PDO::ERRMODE_WARNING
エラー コードの設定に加えて、PDO は従来の E_WARNING メッセージも送信します。この設定は、デバッグ/テスト中に、アプリケーションのフローを中断せずに何が問題なのかだけを確認したい場合に便利です。
PDO::ERRMODE_EXCEPTION
エラー コードの設定に加えて、PDO は PDOException 例外クラスもスローし、エラー コードとエラー情報を反映するようにそのプロパティを設定します。この設定は、スクリプト内のエラーが発生した箇所に効果的にズームインするため、デバッグ中にも非常に便利です。これにより、コード内の潜在的な問題のある領域を迅速に特定できるようになります (例外によりスクリプトが終了した場合、トランザクションは自動的にロールバックされます)。
例外モードのもう 1 つの非常に便利な点は、従来の PHP スタイルの警告よりも明確に独自のエラー処理を構築でき、サイレント モードよりも必要なコードが少なく、ネストされた各データベース呼び出しの戻り値を明示的にチェックできることです。
<?php$dsn = 'mysql:dbname=testdb;host=127.0.0.1';$user = 'dbuser';$password = 'dbpass';try { $dbh = 新しい PDO($dsn, $user, $password ); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);} キャッチ(PDOException $e) { echo '接続に失敗しました: ' $e->getMessage();}?>
注: PDO::ATTR_ERRMODE が現在設定されているかどうかに関係なく、接続が失敗すると、PDO::__construct() は常に PDOException をスローします。キャッチされない例外は致命的です。
<?php$dsn = 'mysql:dbname=test;host=127.0.0.1';$user = 'googleguy';$password = 'googleguy';/* ERRMODE が設定されている場合でも、コンストラクターの周囲での try/catch の使用は引き続き機能します。接続が失敗すると、PDO::__construct は常に PDOException をスローするため、警告します。 */try { $dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));} catch (PDOException $e) { echo '接続に失敗しました: ' $ e->getMessage(); exit;}//これにより、PDO は E_WARNING をスローします例外ではなくレベルのエラー (データテーブルが存在しない場合) $dbh->query("SELECT lowercolumn FROM lowertable");?>
上記のルーチンは次を出力します。
警告: PDO::query(): SQLSTATE[42S02]: ベース テーブルまたはビューが見つかりません: 1146 テーブル 'test.wrongtable' が /tmp/pdo_test.php の 18 行目に存在しません メモを追加 メモを追加