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

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

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

作成日: 更新日:

基本的な使い方

PDO::errorCodeメソッドは、PHPのPDO(PHP Data Objects)拡張機能において、直近に実行されたデータベース操作で発生したSQLSTATEエラーコードを取得するメソッドです。このメソッドは、国際標準であるSQLSTATE規格に準拠した5文字の英数字コードを返します。このコードは、データベース操作が失敗した具体的な理由やエラーの種類を一意に識別するために用いられます。エラーが全く発生しなかった場合には、成功を示す特別なコードである'00000'を返します。システム開発においてデータベース操作のエラーハンドリングは非常に重要であり、このメソッドで取得したエラーコードを用いることで、アプリケーション側で適切なエラー処理やデバッグを行うことができます。例えば、データベース接続の失敗やSQL文の構文エラーなど、PDOオブジェクト自体に関連するエラーを特定する際に役立ちます。これにより、開発者はデータベース操作の結果を詳細に把握し、堅牢なシステムを構築することが可能になります。

構文(syntax)

1$sqlStateCode = $pdo->errorCode();

引数(parameters)

引数なし

引数はありません

戻り値(return)

string|null

PDO::errorCodeメソッドは、実行されたSQLステートメントで発生した直近のエラーコードを文字列で返します。エラーが発生していない場合はnullを返します。

サンプルコード

PHP PDO::errorCode() によるエラーコード取得

1<?php
2
3/**
4 * PDO::errorCode() の使用例をデモンストレーションします。
5 * このメソッドは、直前のデータベース操作に関するSQLSTATEエラーコードを返します。
6 *
7 * システムエンジニアを目指す初心者向けに、エラー発生時と非発生時の動作を示します。
8 */
9function demonstratePdoErrorCode(): void
10{
11    // インメモリのSQLiteデータベースに接続します。
12    // 外部データベースの設定が不要なため、手軽に試せます。
13    $dsn = 'sqlite::memory:';
14
15    try {
16        $pdo = new PDO($dsn);
17
18        // PDO::ERRMODE_WARNING を設定することで、SQLエラーが発生しても例外をスローせず、
19        // 警告として扱い、PDO::errorCode() でエラーコードを取得できる状態にします。
20        // デフォルトの PDO::ERRMODE_SILENT も同様に errorCode() を使用できますが、
21        // エラーに気づきにくいため、ここでは警告モードを使用します。
22        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
23
24        echo "--- PDO::errorCode() のデモンストレーション ---" . PHP_EOL;
25        echo PHP_EOL;
26
27        // --- PDOStatement を使ったエラー発生時の例 ---
28        echo "【PDOStatementを使用したエラー発生時の例】" . PHP_EOL;
29        echo "存在しないテーブル 'non_existent_table' からデータを選択しようとします..." . PHP_EOL;
30
31        // 存在しないテーブルに対するクエリを実行
32        // prepare() と execute() を利用する一般的な方法
33        $stmt = $pdo->prepare("SELECT * FROM non_existent_table");
34        $success = $stmt->execute();
35
36        if (!$success) {
37            echo "  クエリの実行に失敗しました。" . PHP_EOL;
38
39            // PDOオブジェクトから直近の操作のエラーコードを取得します。
40            // Statementに関するエラーの場合でも、PDO::errorCode()はドライバレベルのエラーを示すことがあります。
41            $pdoErrorCode = $pdo->errorCode();
42
43            // '00000' はエラーがないことを示すSQLSTATEです。
44            if ($pdoErrorCode !== '00000') {
45                echo "    PDO::errorCode() で取得したSQLSTATEエラーコード: " . $pdoErrorCode . PHP_EOL;
46            } else {
47                // PDO::errorCode()が'00000'でも、PDOStatementレベルでエラーが発生している可能性があります。
48                echo "    PDO::errorCode() は '00000' を返しましたが、クエリは失敗しました。" . PHP_EOL;
49                echo "    より詳細なエラー情報は PDOStatement::errorCode() や PDOStatement::errorInfo() で確認できます。" . PHP_EOL;
50                echo "      PDOStatement::errorCode(): " . ($stmt->errorCode() ?? 'null') . PHP_EOL;
51                echo "      PDOStatement::errorInfo(): " . print_r($stmt->errorInfo(), true) . PHP_EOL;
52            }
53        } else {
54            echo "  クエリは予期せず成功しました。(このデモではエラーを期待しています)" . PHP_EOL;
55        }
56
57        echo PHP_EOL;
58
59        // --- PDO::exec() を使ったエラー発生時の例(構文エラーなど) ---
60        echo "【PDO::exec() を使用した構文エラー発生時の例】" . PHP_EOL;
61        echo "意図的に構文エラーのあるSQL (CREATE TABLE IF non_existent_table...) を実行しようとします..." . PHP_EOL;
62
63        // 構文エラーを意図的に作成 ("IF" の後に "EXISTS" が不足)
64        $result = $pdo->exec("CREATE TABLE IF non_existent_table (id INTEGER PRIMARY KEY)");
65
66        // exec() は失敗した場合に false を返します。
67        if ($result === false) {
68            echo "  SQLの実行に失敗しました。" . PHP_EOL;
69
70            // PDO::exec() によるエラーの場合、PDO::errorCode() が直接的なエラー情報を提供します。
71            $pdoErrorCodeSyntax = $pdo->errorCode();
72
73            if ($pdoErrorCodeSyntax !== '00000') {
74                echo "    PDO::errorCode() で取得したSQLSTATEエラーコード: " . $pdoErrorCodeSyntax . PHP_EOL;
75            } else {
76                echo "    PDO::errorCode() は '00000' を返しました。これはドライバ固有の挙動である可能性があります。" . PHP_EOL;
77                // PDO::errorInfo() も確認すると、エラーメッセージなどの詳細が得られます。
78                echo "    PDO::errorInfo(): " . print_r($pdo->errorInfo(), true) . PHP_EOL;
79            }
80        } else {
81            echo "  SQLは予期せず成功しました。(このデモではエラーを期待しています)" . PHP_EOL;
82        }
83
84        echo PHP_EOL;
85
86        // --- 正常な操作時の例 ---
87        echo "【正常な操作時の例】" . PHP_EOL;
88        echo "新しいテーブル 'my_valid_table' を作成します..." . PHP_EOL;
89
90        // 正常なSQLクエリを実行
91        $pdo->exec("CREATE TABLE my_valid_table (id INTEGER PRIMARY KEY, name TEXT)");
92        echo "  テーブル 'my_valid_table' の作成が成功しました。" . PHP_EOL;
93
94        // 正常な操作後のエラーコードを取得
95        $pdoErrorCodeNormal = $pdo->errorCode();
96        echo "  正常な操作後の PDO::errorCode(): " . ($pdoErrorCodeNormal ?? 'null') . PHP_EOL;
97        // 正常な操作の場合、'00000' (エラーなし) が返されるはずです。
98
99    } catch (PDOException $e) {
100        // PDO::ERRMODE_EXCEPTION が設定されている場合に発生する例外をキャッチします。
101        // 今回のデモでは PDO::ERRMODE_WARNING を使用しているため、通常このブロックは実行されません。
102        echo "データベース操作中に例外が発生しました: " . $e->getMessage() . PHP_EOL;
103    }
104}
105
106// 関数を実行してデモンストレーションを開始します。
107demonstratePdoErrorCode();

PDO::errorCode()は、直前のデータベース操作で発生したSQLSTATEエラーコードを取得するためのメソッドです。引数はなく、エラーコードを示す文字列(例: '23000')またはエラーがないことを示す'00000'を返します。エラーが発生しなかった場合や、特定の条件下ではnullを返すこともあります。

このサンプルコードでは、まず手軽に試せるインメモリのSQLiteデータベースに接続しています。エラーが発生した際に例外をスローせず、警告として処理しつつエラーコードを取得できるように、PDO::ERRMODE_WARNINGを設定しています。

コードは主に三つのシナリオを示しています。一つ目は、存在しないテーブルにアクセスしようとした際のエラーです。この場合、PDO::errorCode()はドライバレベルのエラーコードを返しますが、PDOStatementレベルのエラー(例: 存在しないテーブル)については、より詳細な情報がPDOStatement::errorCode()PDOStatement::errorInfo()で得られる場合があることを示しています。

二つ目の例では、意図的に構文エラーのあるSQLを実行しています。この時、PDO::errorCode()は構文エラーを示すSQLSTATEコードを返し、どの種類の問題が発生したかを教えてくれます。

最後に、正常にテーブルを作成する操作を行い、その後にPDO::errorCode()を呼び出すと、エラーがないことを示す'00000'が返されることを確認できます。これにより、エラー発生時と非発生時の戻り値の違いを理解できます。このメソッドは、データベース操作の成否を判断し、エラー原因を特定する上で非常に役立ちます。

PDO::errorCode()は、直前のPDOオブジェクトに対する操作のSQLSTATEエラーコードを返します。エラーがない場合は「00000」を返しますので、この値以外の場合にエラーと判断してください。特にPDOStatementを使った操作では、PDO::errorCode()が「00000」を返しても、PDOStatement::errorCode()にはエラーコードが存在する場合があります。そのため、ステートメント関連のエラーを正確に捕捉するにはPDOStatement::errorCode()も確認することが重要です。より詳細なエラーメッセージやドライバ固有のコードは、PDO::errorInfo()やPDOStatement::errorInfo()で取得できますので、これらと組み合わせてエラー調査を行うと良いでしょう。PDO::ERRMODE_EXCEPTIONが設定されている場合は例外がスローされるため、errorCode()を明示的に呼び出す必要はほとんどありません。

関連コンテンツ