今回は、PHPを使ってSQLエラー別の条件分岐処理の方法について紹介します。
この処理を行うことで、ユーザーに対して適切なエラーメッセージを表示したり、エラー原因の追求を素早く行うことが出来ます。
目次
【PHP】SQLエラー別の条件分岐処理の書き方
SQL文を実行する際に、try-catch構文を使用して例外処理を行う必要があります。
catch内にてSQLSTATEを取得することで、分岐することが出来ます。
} catch (PDOException $e) {
// エラーメッセージの取得
$errorMessage = $e->getMessage();
// エラー内容に応じた条件分岐
if (strpos($errorMessage, "SQLSTATE[42S02]") !== false) {
// テーブルが存在しない場合の処理
// ...
}
}
全体的なコード
try {
// SQL文の実行
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
} catch (PDOException $e) {
// エラーメッセージの取得
$errorMessage = $e->getMessage();
// エラー内容に応じた条件分岐
if (strpos($errorMessage, "SQLSTATE[42S02]") !== false) {
// テーブルが存在しない場合の処理
// ...
} elseif (strpos($errorMessage, "SQLSTATE[23000]") !== false) {
// 一意制約違反などのエラーが発生した場合の処理
// ...
} else {
// その他のエラーが発生した場合の処理
// ...
}
}
よくあるエラーメッセージ
23000
エラーコード:1062
SQLSTATE:23000
エラーメッセージ例:Duplicate entry '値' for key '主キー'
原因:主キーが重複するデータを登録しようとしている。
42S02
エラーコード:1146
SQLSTATE:42S02
エラーメッセージ例:Table 'データベース名.テーブル名' doesn't exist
原因:指定したテーブル名が解決できない。
42S22
エラーコード:1054
SQLSTATE:42S22
エラーメッセージ例:Unknown column 'カラム名' in 'field list'
原因:指定したカラムが見つからない。
28000
エラーコード:1045
SQLSTATE:28000
エラーメッセージ例:Access denied for user 'ユーザ名'@'ホスト名' (using password: [YES/NO])
原因:
(YESの場合)権限などのユーザ設定が間違えている。
(NOの場合)ログイン時にパスワードを入力していない、または、入力したパスワードが間違えている。