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

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

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

作成日: 更新日:

基本的な使い方

errorInfoメソッドは、PDOStatementオブジェクトに関連付けられた直近のエラー情報を配列として取得するメソッドです。このメソッドは、データベースに対するSQL文の実行、例えばPDOStatement::execute()メソッドの呼び出しなどが失敗した場合に、その失敗の原因や詳細を調べるために使用されます。

返される配列には通常3つの要素が含まれています。最初の要素は、SQLSTATEエラーコードと呼ばれるものです。これは国際標準によって定義された5文字の英数字コードで、エラーの一般的なカテゴリを示します。2番目の要素は、使用しているデータベースドライバーに固有のエラーコードであり、より具体的なエラーの種類を特定するのに役立ちます。3番目の要素は、ドライバー固有のエラーメッセージで、エラーの内容を人間が読んで理解しやすいテキストで説明してくれます。

システムエンジニアを目指す方にとって、データベース操作は重要なスキルの一つですが、SQL文の構文エラーやデータの不整合など、様々な問題が発生する可能性があります。errorInfoメソッドは、そのような予期せぬ問題が発生した際に、具体的に何が起こったのかを正確に把握し、プログラムのデバッグや適切なエラー処理を実装するために不可欠なツールとなります。

注意点として、データベースへの接続自体が失敗した場合など、PDOオブジェクト全体に関連するエラー情報を取得する際には、PDO::errorInfoメソッドを使用します。このPDOStatement::errorInfoメソッドは、特定のプリペアドステートメントの実行段階で発生したエラーに焦点を当てています。

構文(syntax)

1<?php
2$pdoStatementInstance = new class extends PDOStatement {};
3$errorInfo = $pdoStatementInstance->errorInfo();
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

array

PDOStatement::errorInfoメソッドは、実行されたSQLステートメントに関するエラー情報を格納した連想配列を返します。この配列には、SQLSTATEコード、ドライバー固有のエラーコード、およびドライバー固有のエラーメッセージが含まれます。

サンプルコード

PDOStatement::errorInfo() でエラー情報を取得する

1<?php
2
3/**
4 * PDOStatement::errorInfo() メソッドの使用例を示します。
5 * このメソッドは、PDOStatement オブジェクトで発生した最新のエラーに関する情報を取得します。
6 * 主に PDO::ATTR_ERRMODE が PDO::ERRMODE_SILENT または PDO::ERRMODE_WARNING に設定されている場合に、
7 * SQL ステートメントの実行エラーの詳細を手動で確認するために使用されます。
8 *
9 * キーワード: php exception errorinfo
10 * - errorInfo: PDOStatement::errorInfo() メソッドの直接的な使用例。
11 * - exception: エラーモードの選択と try-catch ブロックの関連性についてコメントで補足します。
12 */
13function demonstratePdoStatementErrorInfo(): void
14{
15    // SQLiteのインメモリデータベースを使用。これにより、データベースサーバーのセットアップなしで単体動作可能です。
16    $dsn = 'sqlite::memory:';
17    $username = null; // SQLiteインメモリでは不要
18    $password = null; // SQLiteインメモリでは不要
19    $pdo = null; // PDOオブジェクトを初期化
20
21    try {
22        // データベースに接続
23        // PDO::ATTR_ERRMODE を PDO::ERRMODE_SILENT に設定します。
24        // これにより、SQLエラーが発生しても PDOException はスローされず、
25        // PDOStatement::execute() は false を返します。
26        // その後、PDOStatement::errorInfo() を呼び出してエラーの詳細を取得します。
27        $pdo = new PDO($dsn, $username, $password, [
28            PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT,
29            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
30            // エラー情報の精度を向上させるため、プリペアドステートメントのエミュレーションを無効にします。
31            // これにより、SQL構文エラーなどがデータベース側で正確に検出されやすくなります。
32            PDO::ATTR_EMULATE_PREPARES => false,
33        ]);
34        echo "データベース接続に成功しました。\n\n";
35
36        // 成功するSQLクエリの例: テーブル作成
37        $createTableSql = "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)";
38        echo "テーブル 'users' を作成します...\n";
39        $pdo->exec($createTableSql); // exec()は主にSELECT以外のクエリで、結果セットを返さない場合に使われる
40        echo "テーブル 'users' の作成に成功しました。\n\n";
41
42        // 意図的にエラーを発生させるSQLクエリの例
43        // 'age' というカラムは存在しないため、INSERT時にエラーが発生します。
44        $insertErrorSql = "INSERT INTO users (name, age) VALUES (:name, :age)";
45        echo "不正なSQLクエリを準備します: '{$insertErrorSql}'\n";
46        $stmt = $pdo->prepare($insertErrorSql);
47
48        // prepare() が失敗した場合のチェック
49        // (例: SQL構文エラーが prepare 時に検出された場合など)
50        if ($stmt === false) {
51            // prepare() 自体のエラーは PDO オブジェクトから取得します。
52            $errorInfo = $pdo->errorInfo();
53            echo "エラー: SQLの準備に失敗しました。\n";
54            echo "SQLSTATE エラーコード: {$errorInfo[0]}\n";
55            echo "ドライバー固有のエラーコード: {$errorInfo[1]}\n";
56            echo "エラーメッセージ: {$errorInfo[2]}\n";
57            return; // 処理を終了
58        }
59
60        $params = [
61            ':name' => 'Alice',
62            ':age' => 30 // 存在しないカラム 'age' への値
63        ];
64
65        echo "不正なクエリを実行します...\n";
66        $executionResult = $stmt->execute($params);
67
68        // execute() が失敗したかチェック
69        if ($executionResult === false) {
70            // PDOStatement::errorInfo() を使って実行エラーの詳細を取得
71            // 返される配列には、以下の3つの要素が含まれます。
72            // [0] SQLSTATEエラーコード (ANSI SQL標準のエラーコード)
73            // [1] ドライバー固有のエラーコード (データベースシステム独自のエラーコード)
74            // [2] エラーメッセージ
75            $errorInfo = $stmt->errorInfo();
76            echo "エラー: SQLの実行に失敗しました。\n";
77            echo "SQLSTATE エラーコード: {$errorInfo[0]} (これはSQL標準のエラーコードです)\n";
78            echo "ドライバー固有のエラーコード: {$errorInfo[1]} (これはデータベースシステム独自のエラーコードです)\n";
79            echo "エラーメッセージ: {$errorInfo[2]}\n";
80        } else {
81            echo "SQLクエリの実行に成功しました。(この例では不正なクエリのため、ここには到達しません)\n";
82        }
83
84    } catch (PDOException $e) {
85        // この try-catch ブロックは、主にデータベース接続自体が失敗した場合や、
86        // PDO::ATTR_ERRMODE が PDO::ERRMODE_EXCEPTION に設定されている場合に発生する
87        // PDOException をキャッチするために存在します。
88        // 今回の例では PDO::ATTR_ERRMODE は PDO::ERRMODE_SILENT なので、
89        // SQL実行エラーではここには到達しません。
90        echo "予期せぬデータベース例外が発生しました: " . $e->getMessage() . "\n";
91        // 必要であれば、$e->getCode() や $e->errorInfo を使用して、
92        // 例外から追加のエラー情報を取得することも可能です。
93    } finally {
94        // データベース接続を閉じる (PHPではスクリプト終了時に自動的に閉じられますが、明示的にnullを設定することも可能)
95        $pdo = null;
96        echo "\nデータベース接続を閉じました。\n";
97    }
98}
99
100// 関数の実行
101demonstratePdoStatementErrorInfo();
102

PDOStatement::errorInfo()メソッドは、PHPのデータベース操作拡張であるPDOにおいて、SQLステートメントの実行時に発生した最新のエラーに関する詳細情報を取得するために使用されます。

このメソッドは引数を取らず、戻り値として常に配列を返します。返される配列には、SQLSTATEエラーコード、データベースドライバー固有のエラーコード、およびエラーメッセージの3つの要素が含まれており、これにより問題の原因を具体的に特定できます。

主に、PDO::ATTR_ERRMODEがPDO::ERRMODE_SILENT(エラーが発生しても例外を投げずにfalseを返す)やPDO::ERRMODE_WARNING(警告としてエラーを通知する)に設定されている場合に活用されます。これらのモードでは、SQL実行エラーが発生してもPDOExceptionがスローされないため、PDOStatement::execute()の戻り値をチェックし、失敗時にerrorInfo()を呼び出してエラー詳細を確認する流れが一般的です。一方、PDO::ERRMODE_EXCEPTIONが設定されている場合は、エラーが発生するとPDOExceptionがスローされるため、このメソッドを直接使う機会は少なくなります。

提供されたサンプルコードでは、PDO::ATTR_ERRMODEPDO::ERRMODE_SILENTに設定し、存在しないカラムにデータを挿入しようとすることで、意図的にSQL実行エラーを発生させています。PDOStatement::execute()が失敗した後、$stmt->errorInfo()を呼び出すことで、SQLSTATE、ドライバー固有のエラーコード、そしてエラーメッセージといった具体的なエラー情報を取得し、コンソールに出力する様子が示されています。これにより、システムエンジニアを目指す方が、プログラム上でどのようにSQL実行時のエラー詳細を取得し、処理すべきかを理解できるでしょう。try-catchブロックは、データベース接続自体が失敗した場合や、PDO::ERRMODE_EXCEPTION設定時の例外を捕捉するために存在します。

このサンプルコードでは、エラーモードをPDO::ERRMODE_SILENTに設定しているため、SQL実行エラーが発生してもPDOExceptionはスローされません。その代わり、execute()falseを返すため、手動で戻り値をチェックし、PDOStatement::errorInfo()を使ってエラーの詳細(SQLSTATE、ドライバー固有コード、メッセージ)を取得する必要があります。もしprepare()の段階でエラーが発生した場合は、PDOオブジェクトのerrorInfo()を使用します。一般的には、PDO::ERRMODE_EXCEPTIONを設定し、try-catchブロックで例外を処理する方が、より堅牢で簡潔なエラーハンドリングが可能です。また、PDO::ATTR_EMULATE_PREPARESfalseに設定することで、データベースからの正確なエラー情報を得やすくなりますので推奨します。

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

1<?php
2
3/**
4 * Demonstrates the usage of PDOStatement::errorInfo() method.
5 *
6 * This function connects to an in-memory SQLite database,
7 * intentionally prepares and executes a faulty SQL statement,
8 * and then retrieves and displays the detailed error information
9 * using the PDOStatement::errorInfo() method.
10 *
11 * The PDO error mode is set to PDO::ERRMODE_SILENT for this demonstration
12 * to show how to manually check for errors after execution using errorInfo()
13 * when exceptions are not automatically thrown.
14 */
15function demonstratePdoStatementErrorInfo(): void
16{
17    echo "--- PDOStatement::errorInfo() Demonstration ---\n\n";
18
19    // Use an in-memory SQLite database for simplicity, requiring no external setup.
20    $dsn = 'sqlite::memory:';
21    $username = null; // No username for in-memory SQLite.
22    $password = null; // No password for in-memory SQLite.
23
24    try {
25        // Establish a PDO connection.
26        // Set ATTR_ERRMODE to SILENT so PDOStatement::execute() returns false on error
27        // instead of throwing an exception, allowing us to use errorInfo().
28        $pdo = new PDO($dsn, $username, $password);
29        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
30        $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
31
32        echo "Successfully connected to an in-memory SQLite database with PDO::ERRMODE_SILENT.\n\n";
33
34        // Step 1: Prepare an SQL statement that is designed to cause an error during execution.
35        // 'non_existent_table' does not exist, so the INSERT operation will fail.
36        $sql = "INSERT INTO non_existent_table (id, name) VALUES (?, ?)";
37        echo "Preparing statement: \"$sql\"\n";
38        $stmt = $pdo->prepare($sql);
39
40        // Check if statement preparation itself failed.
41        if ($stmt === false) {
42            // For errors during prepare, PDO::errorInfo() is used on the PDO object itself.
43            $prepareErrorInfo = $pdo->errorInfo();
44            echo "ERROR: Failed to prepare statement. PDO error: " . implode(" | ", $prepareErrorInfo) . "\n";
45            return; // Exit if preparation failed.
46        }
47
48        // Step 2: Attempt to execute the faulty statement.
49        $data = [1, 'Alice'];
50        echo "Attempting to execute statement with data: " . implode(", ", $data) . "\n";
51        $success = $stmt->execute($data);
52
53        // Step 3: Check the execution result and retrieve error information if it failed.
54        if ($success === false) {
55            echo "Statement execution failed as expected.\n\n";
56
57            // Retrieve the detailed error information from the PDOStatement object.
58            // PDOStatement::errorInfo() returns an array containing:
59            // [0] => SQLSTATE error code (string)
60            // [1] => Driver-specific error code (integer or string)
61            // [2] => Driver-specific error message (string)
62            $errorInfo = $stmt->errorInfo();
63
64            echo "--- Error Information (from PDOStatement::errorInfo()) ---\n";
65            echo "SQLSTATE Error Code  : " . ($errorInfo[0] ?? 'N/A') . "\n";
66            echo "Driver Error Code    : " . ($errorInfo[1] ?? 'N/A') . "\n";
67            echo "Driver Error Message : " . ($errorInfo[2] ?? 'N/A') . "\n";
68            echo "Full errorInfo array :\n";
69            print_r($errorInfo);
70            echo "-----------------------------------------------------\n";
71        } else {
72            // This block should ideally not be reached in this specific example.
73            echo "Statement executed successfully. (This was not expected in this demonstration).\n";
74        }
75
76    } catch (PDOException $e) {
77        // This catch block will primarily handle errors during the PDO connection process,
78        // as statement execution errors are handled by checking $success and errorInfo()
79        // when PDO::ERRMODE_SILENT is active.
80        echo "ERROR: PDO Connection Error: " . $e->getMessage() . "\n";
81    }
82
83    echo "\n--- End of Demonstration ---\n";
84}
85
86// Execute the demonstration function.
87demonstratePdoStatementErrorInfo();
88
89?>

PHPのPDOStatement::errorInfo()メソッドは、データベースに対するプリペアドステートメントの実行中に発生したエラーの詳細情報を取得するために利用されます。このメソッドは引数を必要とせず、エラーに関する3つの情報を含む配列を戻り値として返します。具体的には、SQLSTATEエラーコード、ドライバー固有のエラーコード、そしてドライバー固有のエラーメッセージがこの配列に含まれています。

特に、PDOの接続設定でエラーモードがPDO::ERRMODE_SILENTに設定されている場合、SQL文の実行失敗時に例外が自動的にスローされず、PDOStatement::execute()メソッドがfalseを返します。このような状況下で、errorInfo()メソッドを用いることで、手動で具体的なエラーの原因や詳細な内容を確認し、適切なエラー処理やデバッグを行うことが可能になります。

提示されたサンプルコードでは、インメモリのSQLiteデータベースに接続し、エラーモードをPDO::ERRMODE_SILENTに設定しています。そして、存在しないテーブルへのINSERT文を意図的に実行することでエラーを発生させます。$stmt->execute()が失敗した後に$stmt->errorInfo()を呼び出すことで、その失敗の具体的な理由(SQLSTATE、ドライバーエラーコード、エラーメッセージ)を取得し、表示しています。これにより、エラー発生時の具体的な情報を取得し、問題解決に役立てることができます。

PDOStatement::errorInfo()は、データベース操作でSQL文の実行エラーが発生した際に、その詳細な情報を取得するメソッドです。主にPDO::ERRMODE_SILENTを設定し、execute()falseを返した場合に、エラー原因の特定に利用します。返り値は、SQLSTATEコード、ドライバ固有のエラーコード、エラーメッセージを含む配列です。SQL文の準備(prepare)でエラーが発生した場合は、PDOオブジェクトのerrorInfo()を使う必要がある点に注意してください。例外モード(PDO::ERRMODE_EXCEPTION)の場合は、例外でエラーが捕捉されるため、通常、このメソッドを直接呼び出すことはありません。

関連コンテンツ