access denied不是密码错误,而是mysql严格匹配'user'@'host'组合失败;需用mysql命令行验证localhost/127.0.0.1连接、查mysql.user表确认host匹配、补create权限或改认证插件。

mysqli_connect() 报 Access denied 怎么快速定位
这不是密码输错了,而是 MySQL 认证时 user+host 组合不匹配。错误信息里明确写了 'myuser'@'localhost',就说明 PHP 正在用 localhost 尝试走 Unix socket 连接,但 MySQL 里可能只有 'myuser'@'127.0.0.1' 或 'myuser'@'%' —— 后两者对 localhost 无效。
立刻执行这三步:
- 在命令行用
mysql -u myuser -p -h localhost测试,看是否失败;再试mysql -u myuser -p -h 127.0.0.1,看是否成功 - 登录 MySQL 执行
SELECT User, Host FROM mysql.user WHERE User = 'myuser';,确认结果里有没有myuser对应的localhost行 - 如果没有,就建用户:
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'pass123'; GRANT ALL ON mydb.* TO 'myuser'@'localhost'; FLUSH PRIVILEGES;
PHP7.1 的 port 参数必须显式写,不能塞进 host 字符串
PHP7.1+ 的 mysqli 扩展解析 DSN 更严格。如果写成 mysqli_connect('192.168.1.4:9004', ...),它会自动补默认端口 3306,导致连错(比如实际要连 9004 却发请求到 9004:3306)。这是 PHP7.1 引入的兼容性变化,不是 bug。
正确写法是分开传参或显式用 port:
- 用数组参数:
mysqli_connect('192.168.1.4', 'user', 'pass', '', 9004) - 用 DSN(PDO 或 mysqli::__construct):
mysql:host=192.168.1.4;port=9004;dbname=mydb - 别再用
host=192.168.1.4:9004这种旧写法,PHP7.1 会忽略冒号后的内容或误判
权限不足不只是连不上,还可能是 CREATE DATABASE 被拒
能连上不等于能建库。MySQL 默认只给用户 USAGE 权限,CREATE DATABASE 需要单独授权。PHP 脚本里调 $conn->query("CREATE DATABASE ...") 失败,报错却是 Access denied,大概率是缺 CREATE 权限,不是认证问题。
检查和补权步骤:
- 连上 MySQL 后执行
SHOW GRANTS FOR 'myuser'@'localhost'; - 如果输出里没有
GRANT CREATE ON *.*或GRANT CREATE ON `mydb`.*,就说明没权限 - 补授权:
GRANT CREATE ON `mydb`.* TO 'myuser'@'localhost'; FLUSH PRIVILEGES;(注意反引号包裹库名) - 别用
GRANT ALL PRIVILEGES一刀切,生产环境应最小权限原则
MySQL 8.0+ 用户密码插件不兼容 PHP7.1
即使账号、密码、host 全对,PHP7.1 连 MySQL 8.0+ 仍报 Access denied,极可能是认证插件不匹配。MySQL 8.0 默认用 caching_sha2_password,而 PHP7.1 自带的 mysqli 驱动只支持老的 mysql_native_password。
临时解决(开发环境):
- 登录 MySQL,执行:
ALTER USER 'myuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass123'; FLUSH PRIVILEGES; - 长期方案是升级 PHP 到 7.4+ 或启用
mysqlnd扩展并配置支持新插件,但 PHP7.1 不支持,只能换插件 - Docker 环境下更要注意:MySQL 容器启动时加
--default-authentication-plugin=mysql_native_password
MySQL 8.0 的插件兼容性和 PHP7.1 的 port 解析规则,这两个点最容易被跳过——它们不会报语法错误,也不会提示具体原因,只默默返回 Access denied。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











