SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【php】PDO::errorInfo()の動きの確認

問題

PDO::errorInfo() で、ドライバ固有のエラーコードを見るようにしてたら何かおかしい。

答え

PDOを使うようになったらSQLSTATE(戻り値の配列の1つ目の値)を見るのがオススメのようですね。

SQLのエラーの詳細は mysql_errno()などを利用していたソースをPDOに移行するときなどは、ドライバ固有のエラーコードを見ると簡単そうだと考えてしまいますが、MySQLでPDO::errorInfo()を使ったら以下のような動きでした。

$db = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
//例えば重複エラーが発生するSQL
var_dump($db->exec('insert into t (id) values (1)'));
var_dump($db->errorInfo());
//例えばエラーの発生しないSQL
var_dump($db->exec('insert into t (id) values (123)'));
var_dump($db->errorInfo());
# 失敗SQLのexecの戻り値
bool(false)
# 失敗SQLのexecの後のerrorInfo
array(3) {
  [0]=>
  string(5) "23000" # ← ここはエラーを示しており
  [1]=>
  int(1062) # ← MySQL固有のエラーコード
  [2]=>
  string(37) "Duplicate entry '1' for key 'PRIMARY'"
}
# 成功SQLのexecの戻り値(影響を受けた行数)
int(1)
# 成功SQLのexecの後のerrorInfo
array(3) {
  [0]=>
  string(5) "00000" # ← ここは成功を示しているが
  [1]=>
  int(1062) # ← MySQL固有のエラーコードだけど、こちらは前回のSQLの?
  [2]=>
  string(37) "Duplicate entry '1' for key 'PRIMARY'"
}

関連するメモ

コメント