SQLSTATE[HY000] [1045]访问拒绝:可直接登录MySQL但网页连接失败
SQLSTATE[HY000] [1045] Access denied for user 'username'@'localhost' (using password: YES)
可按以下顺序排查解决:
核对普通账号的授权主机配置
登录MySQL后执行命令查看账号信息:SELECT user,host FROM mysql.user WHERE user='替换为你的普通账号名';
如果返回结果中host字段的值不是localhost,仅为127.0.0.1、%或其他值,说明PHP连接使用的主机标识和账号授权的主机不匹配,有两种修复方案:- 修改PHP数据库配置的主机地址为
127.0.0.1,替代原来的localhost后重试 - 给普通账号追加localhost授权,执行以下命令(替换为实际的账号、密码、要访问的数据库名):
GRANT ALL PRIVILEGES ON 目标数据库名.* TO '你的普通账号'@'localhost' IDENTIFIED BY '普通账号的密码'; FLUSH PRIVILEGES;
- 修改PHP数据库配置的主机地址为
检查PHP配置的密码准确性
复制粘贴密码时容易带入多余的空格、换行符,或者编码转换导致异常,可在PHP连接数据库的代码前临时添加var_dump($password变量);exit;,将输出结果和命令行登录使用的密码逐位对比,确认完全一致。显式指定MySQL socket路径
本地集成环境(如XAMPP、MAMP、宝塔面板本地版)常使用自定义的MySQL socket路径,root账号不受路径限制可正常连接,普通账号可能因此被拦截:
登录MySQL执行show variables like 'socket';获取实际socket路径,之后在PHP的数据库连接配置中追加该参数即可,以PDO连接为例:new PDO('mysql:host=localhost;dbname=你的库名;unix_socket=查询到的socket路径', '账号', '密码');清理MySQL匿名用户
如果MySQL中存在''@'localhost'的匿名用户,权限匹配时会优先命中匿名用户规则,导致普通账号登录被拒绝,执行以下命令清理即可:DELETE FROM mysql.user WHERE user=''; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者user16511156

