phpMyAdmin报错1045的真实原因是MySQL用户权限中user@host组合不匹配,而非单纯密码错误;需检查mysql.user表的User/Host字段、phpMyAdmin配置的host值是否与数据库中用户host严格一致,并确保FLUSH PRIVILEGES生效。
phpMyAdmin 报错 1045 Access denied 的真实原因
这个错误根本不是密码输错了那么简单,而是 mysql 服务端在验证时发现:用户名、密码、主机(user@host)三者组合不匹配。哪怕密码完全正确,只要登录请求声称来自 localhost,而数据库里只存了 'myuser'@'127.0.0.1',照样拒绝。
检查 MySQL 用户表里到底存了哪些 user@host
别猜,直接查。用 root 登录 MySQL 命令行执行:
SELECT User, Host FROM mysql.user;
重点看三件事:
-
Host列是否包含你实际访问的来源——比如 phpMyAdmin 运行在 Nginx/Apache 同机,它默认走localhost,但 MySQL 里localhost和127.0.0.1是两个不同 host - 有没有重复用户名但不同 host 的记录(例如
'admin'@'localhost'和'admin'@'%'),权限可能不一致 - 新创建的用户是否漏写了
Host,MySQL 默认是''(空字符串),等价于'%',但某些旧版本或严格模式下会出问题
phpMyAdmin 配置里的 $cfg['Servers'][$i]['host'] 必须和 MySQL 用户 host 对齐
打开 config.inc.php,找到你用的服务器配置段,检查这几项:
-
$cfg['Servers'][$i]['host']设成'localhost'→ MySQL 里必须有对应'user'@'localhost' -
$cfg['Servers'][$i]['host']设成'127.0.0.1'→ 对应'user'@'127.0.0.1',不能混用 - 如果设成域名或公网 IP(如
'db.example.com'),MySQL 用户的Host必须精确匹配,通配符%只能用于子域名或 IP 段,且受skip-name-resolve影响 - 改完配置后记得重启 web 服务(Apache/Nginx),phpMyAdmin 不会自动重读
常见修复操作:用 CREATE USER 或 GRANT 补全 host 组合
别删旧用户,直接补一个匹配的。例如 phpMyAdmin 报错说 'webuser'@'localhost' 拒绝,但你只建过 'webuser'@'127.0.0.1':
立即学习“PHP免费学习笔记(深入)”;
CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'your_password';<br>GRANT ALL PRIVILEGES ON *.* TO 'webuser'@'localhost';<br>FLUSH PRIVILEGES;
注意:
-
IDENTIFIED BY会重置密码,如果只想复用原密码,用SET PASSWORD FOR 'webuser'@'localhost' = PASSWORD('xxx');(MySQL 5.7+ 推荐用ALTER USER) - MySQL 8.0+ 默认认证插件是
caching_sha2_password,老版 phpMyAdmin 可能不兼容,建用户时显式指定:CREATE USER ... IDENTIFIED WITH mysql_native_password BY ... -
FLUSH PRIVILEGES不是可选步骤,权限变更后必须执行,否则不生效
真正卡住人的地方,往往不是密码错了,而是没意识到 localhost 在 MySQL 里是 socket 连接专用标识,和 TCP 的 127.0.0.1 完全隔离——这点连很多 DBA 都会临时翻文档确认。











