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するのがセオリーです。

今回、テスト環境側で思わぬエラーが出て四苦八苦しましたが、また一つ良い経験をいたしました。

今回のレポートは以上です。
読んでいただいてありがとうございました。


ホームページに関するお悩み事やご相談事がございましたら私どもまでご連絡ください。 鋭意ご対応申し上げます。
ホームページのご提案もさせていただいております