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 * システムエンジニアを目指す初心者向けに簡潔に示します。
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() メソッドも直前のエラー情報を配列として返します。このメソッドは、エラーが発生した直後に呼び出さなければ期待する情報は得られません。取得したエラー情報は、システムのログ記録や管理者へのメール通知などに役立ちますが、メールで通知を行う際は内容に機密情報を含まないよう特に注意し、本番環境でユーザーに詳細なエラーメッセージを直接表示しないことがセキュリティ上の重要点です。

関連コンテンツ