You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP连接MySQL报SQLSTATE[HY000][1045]错误 .env凭证正确仍无法连接

排查解决步骤

1. 验证.env配置是否被正确加载

多数情况下框架未读取.env更新值,会导致实际传入的数据库凭证和配置不一致:

  • 在数据库初始化逻辑位置临时打印配置校验:
var_dump(env('DB_USER'), env('DB_PASS'), env('DB_HOST'));
  • 若输出值和.env配置不一致:
    • 清理框架配置缓存:Laravel执行php artisan config:clear,ThinkPHP执行php think clear:config,其他框架对应执行清配置缓存的命令
    • 检查.env语法:如果密码包含#、空格等特殊字符,必须用双引号包裹,例如DB_PASS="my#pass 123"

2. 校验MySQL账号的访问来源规则

MySQL账号权限和访问来源绑定,格式为用户名@访问来源,Navicat能连通不代表web服务的访问方式匹配权限规则:

  • 在MySQL命令行执行命令查看root账号的权限绑定:
SELECT user, host FROM mysql.user WHERE user = 'root';
  • 你配置的DB_HOST是127.0.0.1,若root账号只绑定了localhost的访问权限,就会出现匹配失败,反之同理
  • 解决方式:给root账号开通对应来源的访问权限,示例如下:
GRANT ALL PRIVILEGES ON my_db_name.* TO 'root'@'127.0.0.1' IDENTIFIED BY '你的实际数据库密码';
FLUSH PRIVILEGES;
  • 也可以直接把.env中的DB_HOST改为localhost测试能否连通。

3. 排查密码特殊字符转义问题

如果数据库密码包含$、&、引号等特殊字符,框架读取.env时可能会被自动转义或截断,和实际密码不符:

  • 先将.env里的DB_PASS值用双引号完整包裹
  • 写原生PDO测试脚本直连,排除配置读取问题:
<?php
$host = '127.0.0.1';
$dbname = 'my_db_name';
$user = 'root';
$pass = '你的实际数据库密码';
try {
    new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb3", $user, $pass);
    echo "连接成功";
} catch (PDOException $e) {
    echo $e->getMessage();
}

如果该脚本能连通,说明是框架配置读取逻辑有问题,反之则是账号权限本身的问题。

4. 校验端口与服务监听规则

  • 执行MySQL命令SHOW VARIABLES LIKE 'port';确认实际监听端口是不是3306
  • 确认本地防火墙没有拦截127.0.0.1对3306端口的访问请求

内容的提问来源于stack exchange,提问作者devwannabe19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:45:03