LoginSignup
10
2

More than 3 years have passed since last update.

【MAMP】laravelのMySQL接続エラー([1045] Access denied for user)

Last updated at Posted at 2021-03-20

初学者です。
「laravelで開発してみよう!」と思った初学者が一番初めにぶち当たりそうなエラーの解決方法を紹介します。

開発環境

PHP 7.3.9
MAMP 5.7
Mysql 5.7.26
Laravel 6.20.7
Composer 2.0.8

エラー内容

MAMPのhtdocsでComposerを使い、laravelをインストールします。
その後、phpMyAdminでDBを新しく作成し、DBにアクセスするユーザーを作成。
作成したlaravelアプリとDBを接続するために、ターミナルで、

$ php artisan migrate

を実行すると

 Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user 'error_test_user'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = error_test and table_name = migrations and table_type = 'BASE TABLE')

  at /Applications/MAMP/htdocs/error_test/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673| 

というエラーが表示される場合があります。

原因

SQLSTATE[HY000] [1045] Access denied for user 'error_test_user'@'localhost'

を訳してみると、「ユーザー(error_test_user'@'localhost)のアクセスが拒否されました」と書いていますね。
考えられることを検証していきましょう。

解決策

.envファイルの確認(MySQLのHOSTとPORT)

.envでは環境変数を設定していると思います。

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=[接続するDBの名前]
DB_USERNAME=[アクセスするuserの名前]
DB_PASSWORD=[アクセスするuserのパスワード]

まず初めに確認していただきたいのがDB_HOST及びDB_PORTの値です。
この値はMAMPでサーバーを起動した時に出てくるこのページ↓のMySQL欄に記載してあるものと同じものを記入しているか確認してください。
image.png

mysql_host_port_check.png
この場合、.envはこうですね。

.env
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=8889
DB_DATABASE=[接続するDBの名前]
DB_USERNAME=[アクセスするuserの名前]
DB_PASSWORD=[アクセスするuserのパスワード]

アクセスするユーザーのHost nameを確認する

phpMyAdminで作成したユーザーの情報を確認しましょう。
phpmyadmin_user_check.png
ユーザーを追加する際、ここのデフォルト値が「%」になっているので、「localhost」に変更する必要でがあります。
写真では「%」になっているのでユーザーを編集するか削除して新しく作り直す必要がありますね。

キャッシュのクリア

上記の2つが正しいことを確認できているのであれば、

$ php artisan migrate 

を実行すれば問題なくDB接続が完了するはずです。
しかし、これでも結構同じエラーがまだ表示されるという方もいるらしいので、一応キャッシュのクリアをしておきましょう。
laravelは内部のキャッシュが残ってしまい、更新が反映しないことが多いです。

$ php artisan config:cache

.envやconfig下のファイルを編集した場合はこれをターミナルで実行してください。

$ php artisan cache:clear

また、一応ですがこのコマンドでアプリケーション自体のキャッシュをクリアしておくこともお勧めします。

キャッシュをクリアした後にもう一度、

$ php artisan migrate 

をすればうまくいくはずです。

それでもうまくいかない場合(unix_socket)

私は上記の設定を確認するだけで接続できたので以下は参考までに。
今回はlocalhostを接続先ホストに指定しているのでUNIX_ドメインソケットを使用したDB接続であるはずなので、.envにDB_SOCKETを設定します。

.env
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=8889
DB_DATABASE=error_test
DB_USERNAME=error_test_user
DB_PASSWORD=laravel0123
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

DB_SOCKETの値はMAMPのwebページに書いていあります。
mysql_host_port_check2.png

もしくは、
config/database.phpで直接記入してもいいかもしれません。

database.php
        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',

ソケットの設定が必要だとする記事があるので開発環境やバージョンによっては必要な設定だと考えられます。

最後に

上記の解決法で直らない場合は、開発環境の違いやスペルミスなどが考えられるので見直してみるのをお勧めします。

10
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
2