class "mysqli" not found 是因 mysqli 扩展未加载,需确认扩展文件存在、php.ini 中 extension=mysqli 已启用且无分号、重启 web 服务(apache/nginx+php-fpm),最后用 phpinfo() 验证显示 “enabled” 才生效。

mysqli扩展根本没加载,new mysqli() 直接报 Class not found
这不是代码写错了,是 PHP 根本不认识 mysqli 这个类。常见现象是页面空白或直接报 Fatal error: Uncaught Error: Class "mysqli" not found,连错误信息都可能被 FastCGI 截断。
关键动作不是改代码,而是确认扩展文件存在、配置启用、服务重启三步到位:
- Linux(如 Ubuntu/Debian):运行
sudo apt install php-mysqli或按 PHP 版本指定(如php7.4-mysqli),再检查/etc/php/7.4/apache2/php.ini(或 fpm 路径)中extension=mysqli是否已取消注释 - Windows(phpEnv/XAMPP/Wamp):打开对应版本的
php.ini(例如phpEnv\php\php74\php.ini),确保extension=mysqli和extension=pdo_mysql两行前面没有分号 - 改完必须重启 Web 服务:Apache/Nginx + PHP-FPM 都要重启,只刷新浏览器毫无作用
- 验证是否生效:建一个
info.php,内容为<?php phpinfo(); ?>,访问后搜索mysqli,看到 “enabled” 且有详细配置才表示加载成功
连接时用 localhost 却连不上,换 127.0.0.1 就通了
PHP 7.4 的 mysqli 扩展在部分环境下(尤其 Windows 集成包)会把 localhost 强制解析为 Unix socket 连接,但 MySQL 8.0 可能没配 socket 路径,或路径不对(比如默认找 /tmp/mysql.sock,而实际在 /var/run/mysqld/mysqld.sock)。
这不是 bug,是行为差异。绕过最简单:
- 把连接参数里的
$host = 'localhost'改成$host = '127.0.0.1' - 如果必须用 socket,显式指定路径:
new mysqli('localhost', $user, $pass, $db, null, '/var/run/mysqld/mysqld.sock') - 不建议依赖
localhost自动回退机制,MySQL 8.0+ 和较新 mysqlnd 驱动对此越来越严格
PDO::__construct() 或 mysqli_connect() 报错 2054,提示 caching_sha2_password
这是 MySQL 8.0 默认给用户(包括 root)分配的新认证插件,而 PHP 7.4 自带的 libmysql 或旧版 mysqlnd 驱动压根不识别它——连接刚握手就失败,跟密码对不对、端口开没开都没关系。
错误典型表现为:The server requested authentication method unknown to the client 或 PDO::__construct(): SQLSTATE[HY000] [2054]。
修复不是升级 PHP,而是改 MySQL 用户配置:
- 登录 MySQL:
mysql -u root -p - 查当前插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; - 改认证方式(注意
@'localhost'和@'%'是两个用户,都要改):ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 立刻执行:
FLUSH PRIVILEGES;(漏掉这句等于白改) - 验证连接:
mysql -u root -p -h 127.0.0.1(用 IP 而非 localhost,避免走 socket 干扰判断)
扩展启了、主机名改了、认证也调了,还是连不上?检查字符集初始化
MySQL 8.0 默认排序规则 utf8mb4_0900_ai_ci 在某些老驱动下会导致连接后首次查询失败,表现是连接对象创建成功,但一执行 query() 就崩,或者字段返回乱码。
这不是连接层问题,是协议协商阶段的隐性失败:
- mysqli 方式:创建连接后立刻加
$conn->set_charset('utf8mb4'); - PDO 方式:DSN 中加入
;charset=utf8mb4,并设置属性:new PDO($dsn, $user, $pass, [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4']); - 别信“只要数据库设了 utf8mb4 就够了”,PHP 驱动需要显式声明,否则可能沿用 latin1 导致协议错乱
2054 错误,90% 以上就是 caching_sha2_password 没处理,先查用户插件再调其他。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











