PDO は、アプリケーション開発のさまざまなスタイルに合わせて 3 つの異なるエラー処理モードを提供します:
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 スタイルの警告よりも明確に独自のエラー処理を構築できることです。また、サイレント モードで各データベース呼び出しの戻り値を明示的にチェックするのと比較して、例外モードでは必要なコードやネストが少なくなります。
PDO は SQL-92 SQLSTATE を使用してエラー コード文字列を標準化します。さまざまな PDO ドライバーがネイティブ コードを適切な SQLSTATE コードにマッピングします。 PDO::errorCode() メソッドは、単一の SQLSTATE コードを返します。このエラーに関する詳細情報が必要な場合、PDO には、SQLSTATE コード、特定のドライバー エラー コード、およびこのドライバーのエラー文字列を含む配列を返す PDO::errorInfo() メソッドも用意されています。
例 #1 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 例外をスローします。キャッチされない例外は致命的です。
例 #2 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