🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

2回答

12539閲覧

mysqlにログインができDBも存在しているのにSQLSTATE[HY000] [1045] Access denied for userと表示される

Ms.yy

総合スコア83

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

1クリップ

投稿2019/11/16 13:14

編集2019/11/27 11:53

前提・実現したいこと

laravelを用いて
http://localhost:8000/folders/1/tasksのURLにアクセスするとエラーが表示されてしまいます。
攻略方法がわからずお力を貸して頂きたいです。

発生している問題・エラーメッセージ

 SQLSTATE[HY000] [1045] Access denied for user 'test_user'@'localhost' (using password: YES) (SQL: select * from folders)

.env

DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=test DB_USERNAME=test_user DB_PASSWORD=pass

試したこと

・test_userを作成
※mysql -u test_user -p passでmysqlログイン可能

grant all on test.* to test_user@localhost identified by 'pass';

127.0.0.1権限&ユーザー作成

grant all privileges on *.* to 'test_user'@'127.0.0.1' identified by 'pass' with grant option;

host[127.0.0.1]で作成したユーザーでmysql ログイン

$ mysql -u test_user -ppass

ログイン後、エラーメッセージ

Warning: Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'test_user'@'localhost' (using password: YES)

#rootログイン後 grants確認

mysql> show grants; +---------------------------------------------------------------------+ | Grants for root@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+

###SHOW GRANTS for 'test_user'@'127.0.0.1';

-----------------------------------+ | Grants for test_user@127.0.0.1 | +------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'test_user'@'127.0.0.1' IDENTIFIED BY PASSWORD '*4C9BE1AC4D3087CFB5E7D1DC8458031A6464B7C0' | | GRANT ALL PRIVILEGES ON `test`.* TO 'test_user'@'127.0.0.1' | +------------------------------------------------------------------------------------------------------------------+

###SHOW GRANTS for 'test_user'@'localhost';

-----------------------------------+ | Grants for test_user@localhost | +------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'test_user'@'localhost' IDENTIFIED BY PASSWORD '*4C9BE1AC4D3087CFB5E7D1DC8458031A6464B7C0' | | GRANT ALL PRIVILEGES ON `test`.* TO 'test_user'@'localhost' | +------------------------------------------------------------------------------------------------------------------+

SHOW GRANTS for 'test_user'@'127.0.0.1';(1行エラー)

+---------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for test_user@127.0.0.1 | +---------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'test_user'@'127.0.0.1' IDENTIFIED BY PASSWORD '*196BDEDE2AE4F84CA44C47D54D78478C7E2BD7B7' WITH GRANT OPTION | +---------------------------------------------------------------------------------------------------------------------------------------------+

###.envのDB_CONNECTION~DB_PASSWORDの行を試しに全て消してみた

SQLSTATE[HY000] [1045] Access denied for user 'forge'@'localhost' (using password: NO) (SQL: select * from `folders`)

###homestead VM

イメージ説明

###select version()

select version() -> ; +-----------+ | version() | +-----------+ | 5.6.43 | +-----------+

補足情報(FW/ツールのバージョンなど)

OS:mac
homestead使用
DBにtestは存在しております。


![イメージ説明

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

test_user@localhost で権限を作成しているので、DB_HOSTもlocalhostで記載するか、test_user@127.0.0.1 の権限を作成する必要があります。


追記:

ユーザだけあって権限がなかったりすると設定が127.0.0.1なのに@localhost見に行ったりしちゃうみたいです。
一度削除してから権限を振り直してみてください。

sql

1DROP USER IF EXISTS 'test_user'@'localhost'; 2DROP USER IF EXISTS 'test_user'@'127.0.0.1'; 3GRANT ALL PRIVILEGES ON *.* TO 'test_user'@'127.0.0.1' IDENTIFIED by 'pass' WITH GRANT OPTION;

投稿2019/11/16 15:05

編集2019/11/18 12:07
Eggpan

総合スコア3205

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ms.yy

2019/11/16 22:55

ありがとうございます やってみます^^
Ms.yy

2019/11/17 06:10

DB_HOSTもlocalhostにしましたが、同じエラーとなりました。 もう一つのtest_user@127.0.0.1でユーザーを作成したのですが、今度はログインがエラーとなり先に進むことができません。
Eggpan

2019/11/17 06:55

mysqlコマンドで接続ホストを省略した場合、localhostになります。127.0.0.1でありません。 権限がどうなっているかこちらではわからないので、rootでログインして show grants; の結果を追記ください。 どのhostの権限を作成しているかで適用される権限も変わってきます。 リファレンスについても確認してみてください。 https://dev.mysql.com/doc/refman/5.6/ja/adding-users.html
Ms.yy

2019/11/17 07:25

mysql -u rootログイン後grants添付させて頂きました。 宜しくお願いします。
Eggpan

2019/11/17 07:42

show grants だけだとログインユーザ分しかでませんね・・。コマンド誤ってました。失礼しました。 SHOW GRANTS FOR 'test_user'@'127.0.0.1'; SHOW GRANTS FOR 'test_user'@'localhost'; を実行して、想定通りの権限になっているか確認してみてください。
Ms.yy

2019/11/17 09:16

確認しました。 その後「$ mysql -h127.0.0.1 -u test_user -ppass」でログインすることができました! ありがとうございます^^ hsot指定できるなんて知りませんでした。
Ms.yy

2019/11/17 11:02

ログインはできましたが、タイトル通りのエラーが変わらずです???? 何か他の原因の心当たりあったりしますでしょうか? .envは変わらずです。
Eggpan

2019/11/17 11:31

質問にDB_HOST=127.0.0.1とありますがコメントで「DB_HOSTもlocalhostにしました」とあります。「変わらずです」とありますが今どちらですか? 同じ使い方するのであればtest_user@localhostとtest_user@127.0.0.1に同じ権限をつけたほうがよいかと思います。いまlocalhostだけ権限足りてない状態なんじゃないでしょうか。
Eggpan

2019/11/17 11:42

mysqlコマンドで-h未指定の場合はlocalhostのユーザを使いますが、これはTCP接続ではなくてUnixドメインソケット接続なのでちょっと特殊です。PHPからはTCP接続しかできません。 管理上どうしてもそうしたいとかでなければ、ややこしくなるので同一ユーザで複数ホストの権限は割り振らないほうがいいと思います。 DBアクセス用のユーザを作るのであれば、 ・'test_user'@'%' だけ権限を作って 'test_user'@'localhost' はつくらない ・mysqlコマンドでtest_userユーザで入る場合は -h 127.0.0.1 指定で入る としたほうが良いと思います。
Ms.yy

2019/11/18 10:15

失礼しました。変わらずは質問させて頂きました.envの内容です。(DB_HOST=127.0.0.1) test_user@localhostとtest_user@127.0.0.1もDBのtestだけ権限を与えたみました。 実行コードも添付させて頂きます。 これでも問題であるエラーが解決されません(T . T)
Eggpan

2019/11/18 10:55

test_user@localhost の権限を消してみてください REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'test_user'@'localhost'; FLUSH PRIVILEGES; @localhost はUnixドメインソケット接続でちょっと特殊なので、mysqlコマンドでローカル接続するユーザにしかつけないほうがいいです。
hentaiman

2019/11/18 11:02

質問内容とは関係無いですが、オールインワンで完結する場合はソケット接続以外いらないのでlocalhostだけにした方が速度的にもよろしいかなと思います。cnfで切ってしまっても。
Eggpan

2019/11/18 11:18

確かに無駄な通信おきませんし、ソケット接続の方が早そうですね・・。 コンフィグでmysql.sockのパス指定すればLaravelからでも接続できるみたいですね。
hentaiman

2019/11/18 11:26

パス指定しなくても.envでDB_HOST=localhostにするだけで大丈夫です my.cnfにskip-networkingを設定する事でmysqldがTCP/IPを無視するので、その状態でLaravel動かすことで接続の確認が出来ます
Ms.yy

2019/11/18 11:44 編集

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'test_user'@'localhost'; 実行後 FLUSH PRIVILEGES; を行いましたが変わらずエラーです。^^; エラー内容は質問に最後に添付した黒い画像と全く同じです(;_;) ちなみに、.envのDB_HOST=localhostにしても同じエラーです。 SHOW GRANTS for 'test_user'@'localhost';の確認をしましたが、しっかり権限は消えております。。。
Eggpan

2019/11/18 12:21

>Ms.yyさん 再作成のやりかた追記しましたので試してみてください。 @127.0.0.1に権限をふっていても、@localhostのユーザがあると@localhostでつなぎにいってしまうようです。 >hentaimanさん 細かな設定は不要なのですね。ローカルのソケット接続で利用したことがなかったので、勉強になりました。ありがとうございます。
Ms.yy

2019/11/18 12:41

DROP USER IF EXISTS 'test_user'@'localhost'; DROP USER IF EXISTS 'test_user'@'127.0.0.1'; これらはエラーが出たので、 drop user 'test_user'@'localhost'; drop user 'test_user'@'127.0.0.1’: を実行ししっかり消えてることを確認。 その後 GRANT ALL PRIVILEGES ON *.* TO 'test_user'@'127.0.0.1' IDENTIFIED by 'pass' WITH GRANT OPTION; を実行後、ページを更新しましたがエラー内容変わらずでした^^;
Eggpan

2019/11/18 12:45

DROP文がエラーでるのは私のhomesteadと環境違うってことですかね・・? 「しっかり消えてること」はどうやって確認されましたか?
Ms.yy

2019/11/18 13:02 編集

削除後、 select user, host from mysql.user;を行って「test_user'@'127.0.0.1」と「test_user'@'localhost'」が無いことを確認しました。 DROP USER IF EXIST〜のエラーはこちらです。 「ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS 'test_user'@'localhost'' at line 1」 ちなみに今回のエラー発生原因であるURL:http://localhost:8000/folders/1/tasksにアクセスしたからエラーってのは関係無いでしょうか? 試しにhttp://localhost:8000でアクセスしたら通常通り表示されました。 よろしくお願いします。
Eggpan

2019/11/18 13:18

モデルやDBクラスで何かしら実行して、SQLが流れる際にエラーが出ているのかと思います。 SQLSTATE[HY000] [1045] Access denied for user 'test_user'@'localhost' これは test_user@localhost でつなぎにいったけど権限がないからエラーになった、というエラーです。 トップページでDBへの接続がないのであればエラーは出ないです。 追記の手順は'test_user'@'127.0.0.1'だけ作り直すものなので、手順をおこなったあと SELCT user, host FROM mysql.user; →'test_user'@'127.0.0.1'がある、'test_user'@'localhost'が無い SHOW GRANTS for 'test_user'@'127.0.0.1'; →1行権限が表示される SHOW GRANTS for 'test_user'@'localhost'; →権限が見つからないエラーが出る となるかどうか、今一度確認してみてください。 'test_user'@'localhost' のユーザが存在せず、DB_HOSTも127.0.0.1なのにエラーが@localhostのまま、というのは考えられにくいです
Ms.yy

2019/11/18 21:42 編集

回答して頂きました手順通り行ったところ全て「→」の結果となりました。 おっしゃる通り、.env側でDB_HOSTも127.0.0.1なのにエラーは@localhostのままです(^_^;) ページを更新してますが反映がされていないということですかね。 ただ、.envのDB_CONNECTION~DB_PASSWORDの行を試しに全て消してみてmysqlからログアウトし「php artisan config:cache」でキャッシュのクリアをしたら当たり前ですがエラー内容が変わりました。 質問の最後に上記エラーは新しく添付させて頂きました。
Eggpan

2019/11/24 01:24

キャッシュのクリアは artisan config:clear です。config:cacheすると.envの内容がすぐには反映されなくなるので、開発時には使わないほうがいいです。 少し前のSQLがエラーになる事から環境違うのではと思っているのですが select version() の結果はどうなりますか? homestead使用ですよね。元からあるhomesteadスキーマはdropしたのでしょうか。 ひょっとしてhomestead VM内のlocalhostとホストマシンのlocalhostと間違えてないでしょうか
Ms.yy

2019/11/27 11:50

キャッシュのクリアは artisan config:clearですね。 ありがとうございます。 間違って使ってたみたいですね???? homestead使用しております。 すみません、スキーマのdropって何でしょうか? homestead VM内のlocalhostとホストマシンのlocalhostもイマイチどこをみていいか分かりません???? VMは画像添付させて頂きました。 ※centOSを起動していたので一時的に一時停止にしております。 select version()の結果も記載させて頂きます。
Eggpan

2019/11/30 14:32

スキーマとはMySQL内にCREATE DATABASEで作成したデータベースの事です。 画像みて私は何を答えれいいのでしょうか。わからない所を記載ください。 localhost自体は「いまアクセスしているマシンそのもの」を指すので、MacOSのターミナル上での話ならMacOSの事です。 Homesteadに入ったあとのlocalhostはHomesteadが入っているUbuntuのVMの事になります。 MacOSホストマシン上にインストールしたMySQLとHomestead(Ubuntu)の中に入っているMySQLと区別がついてないんじゃないでしょうか。 VirtualBoxで仮想マシンを作る方法からやったほうがいいんじゃないでしょうか・・。 Homesteadは最初から空のデータベースがありますので、それを使うほうがよさそうです。 データベース作成などの難しい事はまだ早いのではないかと思います。
Ms.yy

2019/12/01 05:00

localhostは自分のpcということは把握していたのですが、 homesteadとmacosのmysqlのおっしゃる通り区別がついておりませんでした。
Ms.yy

2019/12/01 05:02

作品を作りたくて急いでおりました。 申し訳ございません・・・・
Eggpan

2019/12/09 15:00

Homesteadを使っている、ということはOSのVirtualBox内でHomestead用のマシンを動かす、ということです。 普段操作しているMacOSと、vagrant sshで入った先のHomestead boxは別のマシンです。 Homestead box内でlocalhostを指定すればHomestead boxのマシンを指しますし、MacOS上でlocalhostを指定すればMacOSを指します。 どこでプログラムが動いているかを考えながらやってみてください。 Homestead自体は初期設定が最初からされてますのでコーディングがすくできますが、仮想マシンの仕組みを全く知らずに使えるものではないです。
Ms.yy

2019/12/10 12:39

つまり、mysqlへのログインの方法は以下2種類があるということでしょうか?」 ・vagrant ssh ・ユーザー名noMacbook:~ ユーザー名$
Eggpan

2019/12/14 14:59

2種類あるというか、それぞれのコマンドは「別のMySQL」に接続されるかと思います。 まず前提として、「MacOS」と「vagrantコマンドで起動したHomesterad仮想マシン」は違うアドレスを持ち、それぞれでMySQLを起動することができます。 Laravel公式サイトの通り作成していれば、このアドレスは MacOS: 192.168.10.1 Homesterad: 192.168.10.10 となるはずです。 ユーザー名noMacbook:~ ユーザー名$ というのはMac上でターミナルを単に開いた状態かと思いますが、これは「MacOS: 192.168.10.1」のシェルにログインした状態です。 この状態で実行するコマンドは「MacOS: 192.168.10.1」で動作します。 Homesteadのディレクトリに移動したあと、vagrant sshを実行すると、「Homesterad: 192.168.10.10」のシェルにログインします。 この状態で実行するコマンドは「Homesterad: 192.168.10.10」で動作します。 vagrant ssh したあと、「mysql -u root」を実行すると、これはHomestead上で動作しますので「Homestead内で起動しているMySQL」にログインします。 ユーザー名noMacbook:~ ユーザー名$ とMacのターミナルを表示してすぐに「mysql -u root」を実行すると、これはMacOS上で動作しますので、「MacOS上で起動しているMySQL」にログインします。 Homestead上のLaravelでlocalhostを指定すると当然接続先は「Homestead内で起動しているMySQL」です。 ・select version() が5.6になっていること(Homesteadデフォルトは5.7です) ・DBに実行したSQLと実際動作が噛み合わないこと あたりから、おそらくLaravelの設定をHomestead上でやっているのに、MacOSのMySQLのユーザ設定を変更して接続できない、という状態になってます。 HomesteadのMySQLに接続してユーザを作成・権限の設定をしてください。
Ms.yy

2019/12/22 12:14

ドットインストールの教材でも同じ現象が起き、質問した所 同じく、mac側とvagrant側での接続先が違ったみたいでして無事mysql決しました、 多角化的に情報を頂けたのが、助かりました^^
guest

0

MySQL あるあるネタの1つですね。

詳しくは mysql localhost 127.0.0.1 辺りをキーワードに検索してみるといろいろ記事が出てくると思いますが、MySQL にとって 127.0.0.1 と localhost は別物です。

  • localhost: Unixドメインソケットでの接続
  • 127.0.0.1: TCP での接続

となります。
なお、mysql コマンドのデフォルトの接続先は localhost です。
同様に

は別のユーザーです。

そのためmysql -u test_user -ppassmysql -h localhost -u test_user -ppass と同義で、test_user@localhost でのログインと同義です。
127.0.0.1 でのユーザーでアクセスするためには mysql -h 127.0.0.1 -u test_user -ppassでアクセスする必要があります。

投稿2019/11/18 13:34

kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ms.yy

2019/11/19 00:17

ありがとうございます。 test_user@localhost test_user@127.0.0.1 が別ユーザーってことは知りませんでした。 さっそく調べさせていただきました^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問