【PHP】PDOでエラー内容を表示できるerrorInfoの使い方【MySQL】

2020年1月9日

PDOオブジェクトで直近のMySQLエラー内容を取得するメソッド、errorInfo()の使い方を解説します。

errorInfo()とは

errorInfo()とは、直近で問い合わせたSQLクエリのエラー内容を取得することが出来ます。

//エラーが出るクエリ test_flgというカラムはない
$sql = "SELECT test_id, test_name, test_flg FROM test_table";
$pdo -> query($sql);
print_r($pdo -> errorInfo());
Array
(
    [0] => 42S22
    [1] => 1054
    [2] => Unknown column ‘test_flg’ in ‘field list’
)

prepareを使用する場合は、PDOステートメントオブジェクトから実行する

prepare()メソッドで発行されるPDOステートメントオブジェクトでも、errorInfoメソッドが使用できます。

execute()されたクエリのエラー内容を取得できます。

prepare()でプレースホルダを使用してクエリを実行する場合、その時実体化させたPDOオブジェクトでないと、エラー内容を取得できないのでご注意ください。
(下記のソースコードの場合、$sthでメソッドを実行できる)

$sql = "SELECT test_id, test_name, test_flg FROM test_table";
$sth = $pdo -> preapre($sql);
$sth -> execute();
print_r($sth -> errorInfo()); //$sthで実行化 $pdoでは取得できない

errorInfoで取得できる配列の中身

エラー内容は0~2の添え字の配列で取得できます。

0 SQLSTATE
正しいクエリは’00000’が返ってくる
1 エラーコード
2 エラー内容

エラー内容は英語で表示されますが、エラーコードでググると大体の問題は把握できると思います。

よくあるエラー集

pdoのerrorInfoでよく見かけるエラーをまとめてみました。

【1146】Table ‘(データベース名.テーブル名)’ doesn’t exist

存在しないテーブル名がクエリに書かれている時に起きるエラーです。
クエリ名が間違っていないか見直しましょう。

【1054】Unknown column ‘(カラム名)’ in ‘field list’

存在しないカラム名がクエリに書かれている時に起きるエラーです。
正しいカラムが指定されているか確認してみましょう。

【1064】You have an error in your SQL syntax;~

全文は、
「check the manual that corresponds to your MySQL server version for the right syntax to use near ‘(SQL文)’ at line (行数)」

SQLの構文エラーです。
スペルミスや、使用できない文法を使用している、などが考えられます。

「use near~」以降に書かれたテキストがエラー発生個所なので、周辺の記述をチェックしましょう。

【1062】Duplicate entry ‘(挿入しようとした値)’ for key ‘PRIMARY’

INSERT文で、重複する主キーを挿入しようとした時に起きるエラーです。
制約を見直す他、「INSERT IGNORE~」とすると、ユニーク制約に引っかかる場合は挿入を無視をする、という挙動を取ることが出来ます。

【1052】Column ‘(カラム名)’ in field list is ambiguous

JOIN句などで結合した際、同名のカラムがありどちらのテーブルのカラムか判断できない場合に起きるエラーです。

table_aとtable_bを結合し、どちらにもuser_idというカラムが存在する場合、どちらのデータを見るの?という明示がないと起きます。

table_a.user_idなどでしっかり元テーブルを指定しましょう。

【1222】The used SELECT statements have a different number of columns

UNION句で、結合するテーブルの列数が異なる場合に起きるエラーです。

以上、PDOでエラー内容を表示できるerrorInfoの使い方、でした。

PHP