“using password: YES”表示密码已传递但校验失败,常见原因包括密码错误、用户host不匹配、认证插件不兼容(如caching_sha2_password)、账户锁定或权限不足;“using password: NO”则表明PHP未实际传入密码,多因环境变量未加载或配置键名错误。

1045 报错不是连接不上,而是连上了却被 MySQL 明确拒绝登录。关键看错误信息末尾括号里的内容:"using password: YES" 表示密码已传、用户名也对,但校验失败;"using password: NO" 表示 PHP 实际传的是空密码——哪怕配置写了,也可能根本没读到。
确认实际使用的凭证是否加载成功
别只信 .env 或 config 文件,要验证运行时真实值:
- 在控制器里加
dump(env('DB_HOST')); dump(env('DB_USERNAME')); dump(env('DB_PASSWORD'));,输出 null 就说明 .env 没生效 - .env 生效需同时满足:文件在项目根目录(和
think命令同级)、APP_DEBUG=true、键名全大写带下划线(DB_PASSWORD✅,db_password❌) - Web 和 CLI 环境变量可能不同:用
php -r "print_r($_ENV);"测命令行,用print_r($_SERVER)测网页,对比差异
检查 MySQL 中是否存在匹配的 user@host 组合
MySQL 的用户是二元组,'root'@'localhost' 和 'root'@'127.0.0.1' 完全是两个用户,权限互不影响:
- 进 MySQL 执行:
SELECT User, Host FROM mysql.user WHERE User = 'your_username';,看返回的 Host 是什么 - 如果结果是
localhost,PHP 配置中 host 必须为'localhost'(走 socket);如果是127.0.0.1,PHP 就得配'127.0.0.1'(走 TCP) - Docker 环境中,host 写
localhost指的是容器自己,不是宿主机 MySQL,应改为服务名(如mysql)或host.docker.internal
验证账号密码本身是否有效
绕过 PHP,用 MySQL 命令行直接交叉验证最可靠:
立即学习“PHP免费学习笔记(深入)”;
- 终端执行:
mysql -h 127.0.0.1 -u your_user -p,输入密码 → 成功说明凭据没问题,问题出在 PHP 配置或连接方式 - 若
mysql -h localhost能登,但 PHP 配localhost却报 1045,大概率是 socket 路径不一致,或 MySQL 8+ 禁用了 socket(尤其 Mac M1 Homebrew 安装) - 若命令行也登不上,先确认是否输错密码、有无隐藏空格,再查该 user@host 是否真存在、密码是否过期
别忘了权限和认证插件这两道关
用户存在 ≠ 能访问数据库,也不代表认证方式兼容:
- 执行
SHOW GRANTS FOR 'your_user'@'host';,确认返回里包含对目标库的操作权限(如GRANT ALL ON `mydb`.* TO 'user'@'localhost') - MySQL 8.0+ 默认用
caching_sha2_password插件,旧版 PHP(尤其未启用 mysqlnd 或版本太低)不支持,此时错误信息里会明确含该插件名 - 临时解决:在 MySQL 中执行
ALTER USER 'your_user'@'host' IDENTIFIED WITH mysql_native_password BY 'your_password';,再FLUSH PRIVILEGES;



















