“Access denied”错误主因是PHP连接参数与MySQL用户记录不匹配、caching_sha2_password插件不兼容或权限未生效;需严格比对'user'@'localhost'与'user'@'127.0.0.1'、切换认证插件为mysql_native_password、执行FLUSH PRIVILEGES并确认pdo_mysql和mysqli扩展已启用。

PHP8连接MySQL时提示“Access denied”,不是密码输错了重试就行,而是MySQL用户认证失败、权限不足或认证插件不兼容导致的硬性拦截,必须逐项验证才能恢复连接。
确认连接参数与MySQL用户记录是否严格匹配
打开PHP连接代码,检查mysqli_connect()或PDO初始化中传入的主机、用户名、密码三者是否与MySQL中实际创建的用户完全一致——注意localhost和127.0.0.1在MySQL里是两个独立账户,【localhost走Unix socket,127.0.0.1走TCP,权限记录互不共享】。
用已有高权限账号登录MySQL终端,执行:SELECT User, Host FROM mysql.user WHERE User = 'your_user';
若结果中只有'your_user'@'127.0.0.1',但PHP里写的是'localhost',连接必然失败;此时要么改PHP为127.0.0.1,要么给'your_user'@'localhost'单独授权。
立即学习“PHP免费学习笔记(深入)”;
检查并修复MySQL 8.0+默认认证插件兼容性
MySQL 8.0及以上默认使用caching_sha2_password插件,而部分PHP 8.0/8.1环境(尤其未启用mysqlnd驱动或版本偏低)无法识别该协议,会直接报Access denied,哪怕密码完全正确。
方法一:临时切换认证方式(开发环境适用)
在MySQL中执行:
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;
方法二:确认PHP已启用mysqlnd驱动
运行phpinfo(),搜索“mysqlnd”字段,若未显示或为disabled,需修改php.ini启用extension=mysqli、extension=pdo_mysql,并重启Web服务。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
授予用户必需的数据库操作权限
第一步:确认当前用户是否拥有CREATE权限
执行:SHOW GRANTS FOR 'your_user'@'localhost';
若输出中不含GRANT CREATE ON *.*或GRANT CREATE ON `mydb`.*,说明建库权限缺失。
第二步:补全权限
执行:GRANT CREATE, SELECT, INSERT, UPDATE, DELETE ON `mydb`.* TO 'your_user'@'localhost';
第三步:强制刷新权限缓存
执行:FLUSH PRIVILEGES;
【不执行这一步,刚授的权限不会生效】
验证PHP扩展是否已加载
在命令行运行:php -m | grep -i "mysql"
必须看到pdo_mysql和mysqli两行输出,缺一则连接会直接失败而非报Access denied。
若未列出,编辑php.ini取消以下两行前的分号:
extension=mysqli
extension=pdo_mysql
保存后重启Apache或Nginx服务,再运行php -m确认生效。


















