.env 文件中的 MySQL 密码不起作用,但在 database.php 中工作正常(env() 缓存旧密码,config:clear 不会删除它)

Posted

技术标签:

【中文标题】.env 文件中的 MySQL 密码不起作用,但在 database.php 中工作正常(env() 缓存旧密码,config:clear 不会删除它)【英文标题】:MySQL password in .env file not working, but works fine in database.php (env() caching an old password, config:clear does not remove it) 【发布时间】:2020-04-28 17:17:25 【问题描述】:

我在使用 .env 文件时收到 SQLSTATE[HY000] [1045] Access denied for user 错误。

我已确认凭据有效——我可以使用 mysql Workbench 进行连接。

我在 Windows 和 Laravel 6.2 上使用 XAMPP。使用php artisan serve 运行网站时,我遇到了同样的问题。

我已经在 MySQL Workbench 中测试了凭据。我什至通过注释掉 config/database.php 中的密码行并对密码进行硬编码来测试凭据。

问题似乎是我如何在我的 .env 文件中声明 DB_PASSWORD (DB_DATABASE 和 DB_USERNAME 工作正常。)我尝试过单引号和双引号(就像 .env 文件中的其他示例一样)这两个选项都不起作用。我尝试使用没有密码的root用户,但这也不起作用。

这是我尝试使用 .env 文件获取凭据时遇到的错误:

SQLSTATE[HY000] [1045] Access denied for user 'dba'@'localhost' (using password: YES)

或者(对于通过通用教程代码示例进行搜索的其他人):

SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)

如果我在 config/database.php 中输入密码——效果很好。我究竟做错了什么?我尝试在 XAMPP 中停止 Apache 服务,然后为 Laravel 运行这些命令:

php artisan cache:clear
php artisan config:clear
php artisan config:cache

但没有骰子。

这是我的 .env:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_test
DB_USERNAME=dba
DB_PASSWORD="simplepass1000"

这里是 config/database.php(使用硬编码的密码,不适用于从 env 加载的密码):

        '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', ''),
            'password' => 'simplepass1000',
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

更新:为了更好地调试这个问题,我将 env('DB_PASSWORD', '') 变量打印到视图中(它也放在日志文件中,所以我应该先检查那里。)这是一个旧密码,所以不是我试图使用的密码。我运行了这些命令来重置环境:

php artisan cache:clear
php artisan config:clear
php artisan config:cache

但是,这不会清除 env('DB_PASSWORD') 值。我在 .env 文件中将 DB_PASSWORD 更改为 DB_PASSWORD2,这解决了我的问题:

DB_PASSWORD2=simplepass1000

config/database.php:

'password' => env('DB_PASSWORD2', ''),

我仍然不确定这个旧的 env() 值是从哪里来的。我已经对我的网站进行了 grep 处理,但在任何代码文件中都没有看到它,所以这一定是从我机器上的某个地方拉出来的。

env 值似乎是从我的环境中加载的,因为我在 Laravel 网站之外得到了相同的值:

$ php -r "echo getenv('DB_PASSWORD');"

我已经尝试使用 putenv() 来重置这个变量,但这不起作用:

$ php -r "echo putenv('DB_PASSWORD=test');"

【问题讨论】:

你试过这个解决方案了吗? ***.com/a/48366835/2445028 @VolkanAlbayrak 谢谢,我刚试过但没有用。我理解这条评论意味着在等号和密码“DB_PASSWORD = 'simplepass1000'”之间添加空格。试过单引号和双引号,但都不起作用 你试过php artisan config:clear吗? 【参考方案1】:

解决方案是将您的 .env 文件设置为:

DB_DATABASE=laravel_test

DB_USERNAME=dba

DB_PASSWORD=simplepass1000

DB_PASSWORD 变量没有引号

【讨论】:

谢谢,这似乎是教程推荐的。我先尝试了这个,但仍然收到拒绝访问错误。我再次尝试以确保我仍然收到错误。 你可以从控制台访问你的mysql服务器吗?使用您的凭据?【参考方案2】:

如果你在本地服务器,别忘了重启本地服务器。

要重启,你可以在你的服务器终端^C,然后重新执行php artisan serve

【讨论】:

【参考方案3】:

如果此密码包含空格,您可以使用:

解决方案是将 .env 文件设置为:

DB_DATABASE=laravel_test

DB_USERNAME=dba

DB_PASSWORD="simple pass 1000"

DB_PASSWORD 变量没有引号

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于.env 文件中的 MySQL 密码不起作用,但在 database.php 中工作正常(env() 缓存旧密码,config:clear 不会删除它)的主要内容,如果未能解决你的问题,请参考以下文章

节点脚本可执行文件在 Mac 上不起作用:env: node\r: 没有这样的文件或目录

将应用程序部署到 Heroku,ENV 变量不起作用

golang FTP PASS(密码)命令在本地工作,但在 ECS 上运行时不起作用

git忽略.env文件不起作用

为什么$ results = DB :: select有效而DB :: table不起作用?

MySQL8版本密码重置(老版本skip-grant-tables不起作用,MySQL服务开启之后立马关闭)