PDOで接続エラーが出たときの原因とチェックリスト
はじめに
PHPでデータベース(MySQL)に接続しようとして、こんなエラーが出たことはありませんか?
PDOException: SQLSTATE[HY000] [1045] Access denied for user
または
could not find driver
はじめのうちは
- 何が間違っているのか分からない
- エラーメッセージが怖い
- どこを直せばいいのか見当がつかない
という状態になりがちです。
でも安心してください。
PDOの接続エラーは、ほぼ決まった原因パターンがあります。
この記事では、初心者向けに「上から順番に確認すれば解決できるチェックリスト」をまとめました。
まず確認するべきチェックリスト
1.DSNの書き方は正しいか?
PDO接続の基本の書き方はこちらです。
$db = new PDO(
'mysql:dbname=test;host=127.0.0.1;charset=utf8',
'root',
''
);
よくあるミスでは下記のものがあります。
- dbnameのスペルミス
- hostの書き忘れ
- ;(セミコロン)を忘れている
- 全角文字が混ざっている
- データベース名が間違っている
- 不要なスペースが混ざっている
特に初心者に多いのが「データベース名が間違っている」です。
参考書などを見ながら内容を理解せずにプログラムを書いているとデータベース名が実際の名前と異なってしまうことがあります。データベースを開いて実際の名前を確認して正しい名前を書くようにしましょう。
2.ユーザー名・パスワードは正しいか?
考えられる原因は下記のものがあります。
- パスワードが違う
- rootにパスワードが設定されている
- そもそもそのユーザーに権限がない
ローカル環境の場合、初期状態では
- ユーザー名:root
- パスワード:空文字('')
であることが多いです。
もし自分でパスワードを変更しているなら、必ず合わせましょう。
3.MySQLは起動しているか?
意外と多いのがこれです。MySQLが「Running」になっているかもう一度確認しましょう。
停止している場合は当然接続できません。
4.「could not find driver」と表示される場合
このエラーは PHP側の設定ミス です。「pdo_mysql」が有効になっていない場合があります。
1.確認方法
2.php.ini を開く
3.以下の行を探す
;extension=pdo_mysql
4.先頭の ;(セミコロン) を削除する
これで解決することがほとんどです。
エラーメッセージ別まとめ
| エラー内容 | 主な原因 | 対処方法 |
|---|---|---|
| Access denied | 認証失敗 | ユーザー名・パスワード確認 |
| could not find driver | 拡張未有効 | php.ini確認 |
| No such file or directory | ソケット問題 | hostを127.0.0.1に変更 |
| Unknown database | DB名間違い | dbname確認 |
エラーは怖いものではなく、「ヒント」です。
メッセージをちゃんと読めば、ほぼ原因が書いてあります。
エラー内容を表示させる
プログラムでは必ず try-catch を使い、エラー内容を確認できるようにしましょう。
try {
$db = new PDO(
'mysql:dbname=test;host=127.0.0.1;charset=utf8',
'root',
''
);
echo "接続成功";
} catch (PDOException $e) {
echo "接続エラー:" . $e->getMessage();
}
エラーメッセージは英語で表示されるので苦手意識を持つことも多いかもしれませんが
翻訳機能などを使用して、どこでどのようなエラーが出ているかよく見てみましょう。
それでも解決しない場合
以下をもう一度確認しましょう。
- コピペではなく手入力していないか
- 不要なスペースが入っていないか
- 全角と半角が混ざっていないか
実は、エラーの原因は単純なミスが9割です。
まとめ
PDOの接続エラーは、ほとんどが次の4パターンです。
- DSNの書き間違い
- 認証情報の間違い
- MySQLが起動していない
- pdo_mysqlが有効になっていない
焦らず、上から順番にチェックすれば必ず解決できます。
エラーは「失敗」ではなく「原因を教えてくれているメッセージ」です。
落ち着いて一つずつ潰していきましょう。
