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

【PHP8.x】PDO::errorInfo()メソッドの使い方

errorInfoメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

errorInfoメソッドは、直近に発生したデータベース操作のエラーに関する拡張情報を取得するために実行するメソッドです。このメソッドは、PHPのPDOオブジェクトを通じて、例えばSQLクエリの実行やトランザクション処理など、データベースとのやり取りで何らかの問題が発生した場合に、その原因を特定しやすくするための情報を提供します。

具体的には、直前に実行されたPDO操作でエラーが発生した場合、このメソッドはエラーコードやエラーメッセージを含む配列を返します。返される配列には、最低でも3つの要素が含まれます。最初の要素は国際的に標準化されたSQLSTATEエラーコードであり、一般的なエラーの種類を示します。2番目と3番目の要素は、使用しているデータベースドライバ固有のエラーコードとエラーメッセージであり、より詳細な情報を提供します。

もし、直前のPDO操作が正常に完了し、エラーが発生していなかった場合は、SQLSTATEが「00000」である配列が返されます。このメソッドを利用することで、アプリケーションがデータベース関連のエラーに遭遇した際に、適切なエラーハンドリングやデバッグを行うための手助けとなります。

構文(syntax)

1<?php
2// PDOオブジェクトが既に存在すると仮定します。
3$pdo = new PDO('sqlite::memory:');
4
5// PDO操作が失敗した後のエラー情報を取得する構文
6$errorInformation = $pdo->errorInfo();
7?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

array

PDO::errorInfoメソッドは、直前に実行されたPDO操作のエラー情報を配列で返します。この配列には、SQLSTATE、ドライバー固有のエラーコード、およびエラーメッセージが含まれます。

サンプルコード

PHP PDO errorInfoでエラー情報を取得する

1<?php
2
3/**
4 * PDO::errorInfo() メソッドの使用例を示します。
5 *
6 * この関数は、PDOのエラーモードが PDO::ERRMODE_SILENT に設定されている場合に、
7 * SQLクエリの失敗からエラー情報を取得する方法を実演します。
8 * PDO::ERRMODE_SILENT では、SQLエラーが発生しても PDOException はスローされず、
9 * メソッド (例: query(), exec(), prepare()) は false を返すため、
10 * errorInfo() を使って詳細なエラー情報を取得する必要があります。
11 */
12function demonstratePdoErrorInfo(): void
13{
14    // データベース接続情報 (インメモリSQLiteを使用し、手軽に試せるようにします)
15    $dsn = 'sqlite::memory:';
16
17    try {
18        // 1. PDOインスタンスを作成し、データベースに接続します。
19        $pdo = new PDO($dsn);
20
21        // 2. PDOのエラーモードを PDO::ERRMODE_SILENT (サイレントモード) に設定します。
22        //    これにより、SQLエラーが発生してもPDOExceptionはスローされません。
23        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
24
25        echo "--- PDO::ERRMODE_SILENT モードでのエラー処理 ---" . PHP_EOL;
26        echo "存在しないテーブルに対するSQLクエリを実行して、意図的にエラーを発生させます。" . PHP_EOL . PHP_EOL;
27
28        // 3. 存在しないテーブルに対する不正なSQLクエリを実行し、エラーを発生させます。
29        //    query() メソッドは失敗した場合に false を返します。
30        $result = $pdo->query("SELECT * FROM non_existent_table");
31
32        if ($result === false) {
33            echo "SQLクエリの実行に失敗しました。" . PHP_EOL;
34
35            // 4. PDO::errorInfo() メソッドを呼び出し、直近のエラー情報を取得します。
36            //    このメソッドは、[SQLSTATEコード, ドライバ固有エラーコード, ドライバ固有エラーメッセージ]
37            //    の3つの要素を含む配列を返します。
38            $errorInfo = $pdo->errorInfo();
39
40            echo PHP_EOL . "--- PDO::errorInfo() の結果 ---" . PHP_EOL;
41            echo "SQLSTATE エラーコード: " . ($errorInfo[0] ?? 'N/A') . PHP_EOL;
42            echo "ドライバ固有のエラーコード: " . ($errorInfo[1] ?? 'N/A') . PHP_EOL;
43            echo "ドライバ固有のエラーメッセージ: " . ($errorInfo[2] ?? 'N/A') . PHP_EOL;
44            echo "----------------------------------" . PHP_EOL;
45        } else {
46            echo "SQLクエリはエラーなく実行されました。(この例では期待しない結果です)" . PHP_EOL;
47        }
48
49    } catch (PDOException $e) {
50        // PDOの接続自体に問題があった場合など、予期せぬ例外をキャッチします。
51        echo "データベース接続エラーが発生しました: " . $e->getMessage() . PHP_EOL;
52    } catch (Exception $e) {
53        // その他の一般的なエラーをキャッチします。
54        echo "予期せぬエラーが発生しました: " . $e->getMessage() . PHP_EOL;
55    }
56}
57
58// 関数を実行して、PDO::errorInfo() の動作を確認します。
59demonstratePdoErrorInfo();

PHPのPDO::errorInfo()メソッドは、データベース操作中に発生した直近のエラーに関する詳細な情報を取得するために使用されます。このメソッドは引数を必要とせず、エラー情報を格納した配列を戻り値として返します。返される配列には、SQLSTATEエラーコード、ドライバ固有のエラーコード、ドライバ固有のエラーメッセージの3つの要素が含まれており、エラーの原因を特定するのに役立ちます。

特に、PDOのエラーモードがPDO::ERRMODE_SILENT(サイレントモード)に設定されている場合にこのメソッドが重要となります。このモードでは、SQLクエリの実行に失敗してもPDOExceptionはスローされず、クエリメソッド(例: query(), exec())はfalseを返します。そのため、クエリが失敗した際にerrorInfo()を呼び出すことで、具体的なエラーの内容を詳細に把握し、適切なエラー処理を行うことが可能になります。

サンプルコードでは、PDO::ERRMODE_SILENTモードでPDOを初期化し、存在しないテーブルへのSQLクエリを実行することで意図的にエラーを発生させています。クエリがfalseを返して失敗したことを確認した後、PDO::errorInfo()を呼び出し、その結果として得られるSQLSTATEコードやドライバ固有のエラーメッセージを画面に出力しています。このようにして、エラー発生時の具体的な情報を取得し、デバッグやエラーハンドリングに活用します。

PDO::errorInfo()は、主にPDOのエラーモードがPDO::ERRMODE_SILENTに設定されており、SQL実行メソッドがエラー時にfalseを返した場合に、詳細なエラー情報を取得するために利用します。エラー発生直後に呼び出さないと、他のPDO操作によって情報が上書きされ、期待する結果が得られない可能性があるため注意が必要です。このメソッドは、SQLSTATEコード、ドライバ固有のエラーコード、エラーメッセージの3要素を持つ配列を返します。取得したエラーメッセージは、セキュリティ上の理由から、本番環境で直接ユーザーに表示せず、ログに記録することをお勧めします。通常はPDO::ERRMODE_EXCEPTIONモードを使用し、PDOExceptionをキャッチしてエラー処理を行う方が、エラーハンドリングが統一され簡潔になります。

PHP PDO errorInfo でエラー情報を取得する

1<?php
2
3/**
4 * PDO::errorInfo() メソッドの使用例を示します。
5 * データベース操作中に発生したエラー情報を取得する方法を、
6 * システムエンジニアを目指す初心者向けに簡潔に示します。
7 */
8function demonstratePDOErrorInfo(): void
9{
10    // データベース接続情報 (SQLite のインメモリデータベースを使用)
11    // これにより、追加の設定なしで単体で動作します。
12    // MySQL などの他のデータベースに接続する場合は、以下のように変更します:
13    // $dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
14    // $username = 'your_user';
15    // $password = 'your_password';
16    $dsn = 'sqlite::memory:';
17    $username = null; // SQLite のインメモリデータベースでは通常不要
18    $password = null; // SQLite のインメモリデータベースでは通常不要
19
20    $pdo = null;
21
22    try {
23        // PDO オブジェクトを作成し、データベースに接続します。
24        // PDO::ATTR_ERRMODE を PDO::ERRMODE_EXCEPTION に設定することで、
25        // SQL エラーが発生した際に PDOException をスローさせます。
26        $pdo = new PDO($dsn, $username, $password, [
27            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
28            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
29        ]);
30        echo "データベースに接続しました。\n\n";
31
32        // 意図的にエラーを起こすための操作を行います。
33        // ここでは存在しないテーブルに対して SELECT クエリを実行し、SQL エラーを発生させます。
34        echo "存在しないテーブル 'non_existent_table' に対するクエリを実行します...\n";
35        // PDO::ERRMODE_EXCEPTION が設定されているため、この行で PDOException がスローされます。
36        $stmt = $pdo->query("SELECT id, name FROM non_existent_table");
37        
38        // 上記でエラーが発生するため、通常以下の行は実行されません。
39        // $result = $stmt->fetchAll();
40        // print_r($result);
41
42    } catch (PDOException $e) {
43        // PDOException が発生した場合、エラーを捕捉し処理します。
44        echo "PDOException が発生しました: " . $e->getMessage() . "\n";
45        echo "エラーコード: " . $e->getCode() . "\n\n";
46
47        // PDOException オブジェクトには、errorInfo プロパティが含まれており、
48        // これが PDO::errorInfo() と同じ詳細なエラー情報を提供します。
49        if (isset($e->errorInfo) && is_array($e->errorInfo)) {
50            echo "PDOException の errorInfo (詳細情報):\n";
51            print_r($e->errorInfo);
52            echo "\n";
53        }
54
55        // PDO::errorInfo() メソッドを呼び出し、直前のエラーに関する情報を取得します。
56        // PDO::ERRMODE_EXCEPTION の場合でも、PDOオブジェクトから直接エラー情報を
57        // 取得できることを示すために、ここで呼び出します。
58        // (通常は $e->errorInfo で十分ですが、デバッグや特定のケースで有用です)
59        if ($pdo instanceof PDO) { // $pdo が有効な PDO オブジェクトであるか確認
60            echo "PDO::errorInfo() メソッドからの出力:\n";
61            $errorInfo = $pdo->errorInfo();
62            print_r($errorInfo);
63
64            // errorInfo 配列の各要素の意味:
65            echo "\n取得されたエラー情報 (PDO::errorInfo) の内容:\n";
66            echo " - [0]: SQLSTATE エラーコード (5文字の標準SQLエラーコード)\n";
67            echo " - [1]: ドライバー固有のエラーコード (データベースによって異なる)\n";
68            echo " - [2]: ドライバー固有のエラーメッセージ (より詳細な説明)\n";
69
70            // 例: このエラー情報をログファイルに記録したり、
71            // 管理者にメールで通知したりすることで、システムの監視に役立てることができます。
72            // mail("admin@example.com", "Database Error Notification", implode(" | ", $errorInfo));
73        } else {
74            echo "データベース接続自体に失敗したため、PDO::errorInfo() を呼び出せません。\n";
75        }
76
77    } catch (Exception $e) {
78        // PDOException 以外の予期せぬエラーが発生した場合
79        echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n";
80    } finally {
81        // 処理の終了時に、データベース接続を閉じます。
82        // PHPではスクリプト終了時に自動的に閉じられることが多いですが、
83        // 長期実行プロセスなどでは明示的にnullを代入することも有効です。
84        $pdo = null;
85        echo "\nデータベース接続を閉じました。\n";
86    }
87}
88
89// 関数を実行して、PDO::errorInfo() の動作を確認します。
90demonstratePDOErrorInfo();

PHPのPDO::errorInfo()メソッドは、データベース操作中にエラーが発生した際にその詳細な情報を取得します。このサンプルコードでは、まずPDOを用いてデータベースに接続し、存在しないテーブルへのクエリを意図的に実行することでSQLエラーを発生させています。エラーがPDOExceptionとして捕捉された際に、PDO::errorInfo()メソッドを呼び出し、直前のエラーに関する詳細な情報を取得します。

このメソッドは引数なしで実行され、エラーコードやメッセージを含む配列を返します。戻り値の配列は通常3つの要素で構成されており、最初の要素[0]には標準SQLSTATEコード、次の要素[1]にはデータベースドライバー固有のエラーコード、そして3番目の要素[2]にはドライバー固有の詳細なエラーメッセージが格納されています。取得したエラー情報は、エラーの原因特定や、システム管理者へのメール通知、ログ記録などに活用でき、データベースシステムの安定運用に貢献します。

このコードは、データベース操作中に発生したエラーの詳細情報を取得する PDO::errorInfo() メソッドの使い方を示しています。PDO::ERRMODE_EXCEPTION が設定されている場合、SQLエラーは PDOException として捕捉され、その例外オブジェクトの $e->errorInfo プロパティから詳細なエラー情報を確認できます。通常はこちらのプロパティを利用しますが、$pdo->errorInfo() メソッドも直前のエラー情報を配列として返します。このメソッドは、エラーが発生した直後に呼び出さなければ期待する情報は得られません。取得したエラー情報は、システムのログ記録や管理者へのメール通知などに役立ちますが、メールで通知を行う際は内容に機密情報を含まないよう特に注意し、本番環境でユーザーに詳細なエラーメッセージを直接表示しないことがセキュリティ上の重要点です。

関連コンテンツ

【PHP8.x】PDO::errorInfo()メソッドの使い方 | いっしー@Webエンジニア