XAMPPで SQLSTATE[28000]: Invalid authorization specification: 1045 Access denied for user に対処
先日XAMPPでPHPでのプログラム制作を行っていたところ、不可思議なエラーがでました。
DATABESEエラーと出ていますが、パラメータ間違いや、PHPの文法エラーだと思ていたら、なにか違うことに気づきました。
なぜならば、文法もパラメータも合っていたからです。
なんだこれは!?
と思いぐぐりました。
でもよくわからない・・・。
さらにググる→試す→直らない。
さらにググる→試す→直らない。
・
・
こんなことを延々と繰り返してようやく対処できましたので、忘備録として記録いたします。
実際に発生したエラーはこちら
use: の後には「アカウント名」@localhost となっていました。
ぐぐって調べると、「アカウント名間違い」と出てきましたが、アカウント名は合っています。
いったい何がいけないのでしょう…?
ググっては直し、ググっては直しの連続
いろいろググってみると、PHPの問題ではなく、MYSQLアカウント権限の問題ということがわかってきました。
さらに、エクスポートしたSQLをインポートした場合に発生する事象ということもわかってきました。
要はCREATE DEFINER文で権限を指定したアカウントのみ接続できるけれど、そうでないアカウントからアクセスするとエラーになる。
という文に引っかかっているようでした。
そこで以下のことを試しましたが、改善しませんでした。
- xamppで、アカウントの権限を最大(全チェック)にする
- エクスポートSQLのDEFINER文を消去する
- DEFINER文の@localhost をローカルIPアドレスにする
エクスポートしたSQLデータをいろいろいじってもダメということが分かりました。
そもそも何がいけないの?
MYSQLアカウント権限の問題なのはわかりますが、アカウント名やパスワードはPHP側で正しく設定されており、DEFINER記述のないテーブルは問題なくアクセスできています。
アカウント名の記述ミスではありません。
ではなぜエラーになるのか?
その原因を調べたら、意外なことがわかりました。
先ほどのDEFINER文は以下のように記述します。
DEFINER=アカウント名 @ ホスト名
@ホスト名が曲者で、通常はlocalhost になっていますが、xamppはどうやら@localhostでは正しく動作しないようです。
しかし記述をIPアドレス変えてもダメだったので、違う方法で対応するしかありません。
xammpをいろいろいじくりまわしていたら、次の方法で現象が改善しました。
現象を改善させる設定方法
アカウントが動作するホスト名が、一致しないために発生する問題のため、ホスト名が一致するようにすればよいのです。
具体的には、アカウントのホスト名を「すべてのホスト」に変更してやればよいのです。
xammpのユーザーアカウント設定→該当のアカウントの「権限の編集」→ログイン情報を開くと、上記のような画面になります。
ホスト名をローカルホスト→すべてのホストへ変更し、保存すると権限エラーが発生しなくなりました。
xamppで環境を起こす際にはアカウントの権限にも注意を
今回は既存の環境改修のため、テスト環境を起こすためにデータベースをインポートして環境構築を行いました。
実機でテストすると、思わぬ事故が起きることがあります。
テスト環境で改修・動作確認を行い、実機へUPするのがセオリーです。
今回、テスト環境側で思わぬエラーが出て四苦八苦しましたが、また一つ良い経験をいたしました。