Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】PDO::ATTR_ERRMODE定数の使い方

ATTR_ERRMODE定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

ATTR_ERRMODE定数は、PHPのデータベースアクセス抽象化レイヤーであるPDOにおけるエラー処理モードを表す定数です。この定数は、データベース操作中に発生したエラーをPDOがどのように扱うかを指定するために用いられます。

通常、PDOクラスのインスタンスを生成した後、PDO::setAttribute()メソッドを使用してこの定数を設定します。例えば、$pdo->setAttribute(PDO::ATTR_ERRMODE, 設定したいエラーモード定数);のように記述することで、エラーの挙動を制御できます。

設定可能な主なエラーモードには、以下の三種類があります。

  1. PDO::ERRMODE_SILENT: これはPDOのデフォルトモードです。エラーが発生してもPDOは特に何もせず、開発者が明示的にPDO::errorCode()PDO::errorInfo()メソッドを呼び出してエラー情報を取得する必要があります。エラーの見落としにつながりやすいため、積極的に選択することは稀です。
  2. PDO::ERRMODE_WARNING: エラーが発生した場合、PHPの警告(E_WARNING)が発行されます。スクリプトの実行は継続されますが、開発中にエラー発生箇所を特定しやすくなります。
  3. PDO::ERRMODE_EXCEPTION: このモードは最も推奨されるエラー処理モードです。データベース操作でエラーが発生すると、PDOExceptionオブジェクトがスローされます。これにより、try-catchブロックを利用した堅牢な例外処理を実装でき、エラー発生時にアプリケーションが適切に対応できるようになります。

適切なエラーモードを選択することは、データベースを利用するアプリケーションの信頼性と安定性を高める上で非常に重要です。特に本番環境では、予期せぬデータベースエラーに対処できるよう、PDO::ERRMODE_EXCEPTIONを設定して例外処理によるエラーハンドリングを行うことが強く推奨されます。

構文(syntax)

1$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
2$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP PDO ATTR_ERRMODE でエラー処理する

1<?php
2
3/**
4 * PDO::ATTR_ERRMODE 定数の使用方法を初心者向けに示します。
5 * この定数は、PDOがSQLエラーをどのように報告するかを制御するために使われます。
6 *
7 * このサンプルでは、SQLiteのインメモリデータベースを使用しており、
8 * ファイルシステムに何も作成せずに単体で動作します。
9 */
10function demonstratePdoErrMode(): void
11{
12    // データベース接続設定(SQLiteのインメモリデータベース)
13    // SQLiteではユーザー名とパスワードは通常不要です。
14    $dsn = 'sqlite::memory:';
15    $username = null;
16    $password = null;
17
18    try {
19        // 1. PDOオブジェクトのインスタンスを作成し、データベースに接続します。
20        //    まだエラーモードを設定する前の状態です。
21        $pdo = new PDO($dsn, $username, $password);
22
23        // 2. PDO::setAttribute() メソッドを使用して、PDO::ATTR_ERRMODE を設定します。
24        //    ここでは PDO::ERRMODE_EXCEPTION を指定し、SQLエラーが発生した場合に
25        //    PDOException がスローされるように設定しています。
26        //    これがこのサンプルコードの主要な目的であり、推奨されるエラーハンドリング方法です。
27        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
28
29        echo "データベース接続に成功し、エラーモードを '例外' に設定しました。\n";
30
31        // 3. サンプルテーブルを作成します。
32        //    PDO::exec() はSQLステートメントを実行し、影響を受けた行数を返します。
33        $pdo->exec("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
34        echo "テーブル 'users' を作成しました。\n";
35
36        // 4. 意図的に失敗するSQLクエリを実行して、エラーハンドリングをテストします。
37        //    'non_existent_table' というテーブルは存在しないため、SQLエラーが発生します。
38        echo "意図的に失敗するSQLクエリを実行します...\n";
39        $pdo->exec("INSERT INTO non_existent_table (column1) VALUES ('test')");
40
41        // 上の行でエラーが発生するため、このメッセージは表示されません。
42        echo "このメッセージが表示される場合、エラーハンドリングが機能していません。\n";
43
44    } catch (PDOException $e) {
45        // 5. PDOException がキャッチされた場合、SQLエラーが発生したことを意味します。
46        //    PDO::ATTR_ERRMODE が PDO::ERRMODE_EXCEPTION に設定されているため、
47        //    エラーは例外として捕捉され、プログラムが予期せず終了するのを防ぎます。
48        echo "データベースエラーが発生しました: " . $e->getMessage() . "\n";
49        echo "これは、PDO::ATTR_ERRMODE が PDO::ERRMODE_EXCEPTION に設定されているため、\n";
50        echo "SQLエラーが PDOException として適切に捕捉されたことを示しています。\n";
51    } catch (Exception $e) {
52        // 6. PDOException以外の、予期せぬ一般的なエラーを捕捉します。
53        echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n";
54    } finally {
55        // 7. データベース接続はスクリプト終了時に自動的に閉じられますが、
56        //    明示的にnullを設定して接続を閉じることも可能です。
57        $pdo = null;
58        echo "データベース接続を閉じました。\n";
59    }
60}
61
62// 関数を実行して、PDO::ATTR_ERRMODE の動作を確認します。
63demonstratePdoErrMode();
64

PHPのPDO::ATTR_ERRMODEは、データベース接続を扱うPDO拡張機能に属する定数です。この定数は、PDOがデータベースからのSQLエラーをどのように報告するかを制御するために使用されます。定数であるため引数はありませんし、値を返す戻り値もありません。

サンプルコードでは、まずnew PDO()でデータベースに接続した後、$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);という形で使用されています。ここでPDO::ERRMODE_EXCEPTIONを指定することで、SQLクエリ実行中にエラーが発生した場合にPDOExceptionがスローされるように設定しています。これは、エラーが発生した際にプログラムの処理を中断し、try-catchブロックでエラーを捕捉して適切に処理することを可能にする、推奨されるエラーハンドリング方法です。

実際にサンプルコードでは、存在しないテーブルへの挿入を試みることで意図的にSQLエラーを発生させています。この設定のおかげで、エラーはcatch (PDOException $e)ブロックで捕捉され、「データベースエラーが発生しました」というメッセージが表示されます。これにより、エラーによってプログラムが突然停止することなく、開発者がエラーの内容を把握し、それに応じた対応を実装できるようになります。PDO::ATTR_ERRMODEを設定することは、堅牢なデータベースアプリケーションを構築する上で非常に重要です。

PDO::ATTR_ERRMODEは、PDOがSQLエラーをどのように報告するかを制御する重要な設定です。サンプルコードのようにPDO::ERRMODE_EXCEPTIONに設定すると、SQLエラーが発生した場合にPDOExceptionがスローされ、try-catchブロックで安全にエラーを捕捉し処理できるため、実運用環境で強く推奨されます。この設定により、エラーを見逃さずにプログラムの安定性を保つことができます。デフォルトのPDO::ERRMODE_SILENTはエラーが見過ごされやすいため、使用は避けてください。DSN(データソース名)はデータベースの種類によって記述が異なるため、ご利用のデータベースに合わせて正しく記述してください。また、$pdo = null;とすることで、データベース接続を明示的に閉じることが可能です。

関連コンテンツ