一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Win10搭建ThinkPHP 8.0:解决PDO连接MySQL报Access denied异常 解答

时间:2026-06-20 09:58:58 编辑:袖梨 来源:一聚教程网

ThinkPHP 8报1045错误核心是user@host不匹配或权限缺失:需确认MySQL服务真实运行、强制PHP用127.0.0.1连接、创建对应host用户并授权、切换认证插件为mysql_native_password、确保pdo_mysql扩展启用且重启Web服务。

在Windows 10系统中搭建ThinkPHP 8.0项目时,执行数据库操作直接报错「SQLSTATE[HY000][1045] Access denied for 'root'@'localhost'」,不是密码输错了重试就行,而是MySQL拒绝了整个认证流程——关键卡点就两个:user@host组合不匹配,或该组合没被授予对应权限。

确认MySQL服务真实运行且端口就绪

phpEnv或手动安装的MySQL显示“已启动”,不代表mysqld进程真在跑。打开任务管理器→服务页签→找到MySQL80→右键“转到进程”,若mysqld.exe瞬间消失,说明服务崩溃退出。

去MySQL安装目录下的data子目录,找以计算机名.err命名的日志文件(如DESKTOP-ABC.err),开头几行通常有明确报错,比如Address already in use(3306端口被占)或Can't find file './mysql/user.MYD'(数据目录损坏)。

命令行强制启动验证:cd F:phpEnvmysqlbin → mysqld --defaults-file=..my.ini --console,观察控制台是否卡在初始化或直接报错退出。

立即学习“PHP免费学习笔记(深入)”;

用netstat -ano | findstr :3306查端口占用,若PID非mysqld.exe,需先杀掉冲突进程。

修正PHP连接参数与MySQL user@host严格匹配

ThinkPHP 8默认配置database.php中写'hostname' => 'localhost',但Windows下mysqli会优先走命名管道而非TCP,导致权限判断逻辑不同;而MySQL 8.0默认只允许'root'@'localhost',却把'root'@'127.0.0.1'视为完全独立账户。

方法一:强制PHP走TCP协议
将database.php中的'hostname' => 'localhost'改为【'hostname' => '127.0.0.1'】,并确认'hostport' => '3306'未被注释或修改。

方法二:在MySQL中显式创建对应host用户
用phpMyAdmin或命令行登录MySQL(空密码可直接回车):
① 执行SELECT User, Host FROM mysql.user WHERE User = 'root';,确认是否存在127.0.0.1这一行;
② 若无,执行:CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY '';
③ 紧接着执行:GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
【必须执行 FLUSH PRIVILEGES;】,否则权限不生效。

切换MySQL认证插件为兼容模式

MySQL 8.0+默认使用caching_sha2_password插件,而旧版PHP(尤其phpEnv内置PHP)未启用mysqlnd或版本太低时,会静默失败并报看似“密码错误”的Access denied。

登录MySQL后执行:SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';,若plugin列为caching_sha2_password,则需切换:

执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

若需同时兼容127.0.0.1连接,再补一句:ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '';

这一步做完,无需重启MySQL服务,新认证方式立即生效。

检查PHP扩展是否真正启用

ThinkPHP 8依赖PDO_MySQL驱动,但仅在php.ini中取消;extension=pdo_mysql前的分号还不够——需确认实际加载成功。

新建一个phpinfo.php文件,内容为<?php phpinfo(); ?>,用浏览器访问,搜索pdo_mysql,确认状态栏显示“enabled”且有对应版本信息。

若未出现,检查php.ini路径是否正确(phpinfo页面顶部明确写出Loaded Configuration File),并在该文件中确保以下三行均开启:
extension=php_pdo.dll
extension=php_pdo_mysql.dll
extension=php_mysqli.dll

改完后必须重启Web服务器(Apache/Nginx)或phpEnv的PHP服务,否则扩展不会加载。

热门栏目