xampp 默认不启用 mysqli 扩展,mediawiki 1.35+ 等应用会因扩展未加载而报错退出;需在 php.ini 中取消 extension=mysqli 和 extension=mbstring 注释,修正 extension_dir 路径(避免末尾反斜杠),重启 apache 后通过 phpinfo() 验证生效。

XAMPP 默认不启用 mysqli 扩展(尤其在较新版本中),而 MediaWiki 1.35+、WordPress 安装页、部分 PHP 框架会直接报错退出——不是密码错了,是扩展根本没加载。
确认 mysqli 和 pdo_mysql 是否真已启用
别信“XAMPP 自带就支持”这种说法。打开 http://localhost/phpinfo(),搜索 mysqli 和 pdo_mysql。如果页面里没出现对应模块区块,说明没生效。
- 常见假象:
pdo显示已加载,但pdo_mysql没列出来 → PDO 接口存在,但连 MySQL 的驱动没启用 - 更隐蔽的问题:phpinfo() 里有
mysqli,但new mysqli()仍报Class 'mysqli' not found→ 实际是extension_dir路径末尾多了一个\或指向了错误目录,导致 DLL 文件加载失败(PHP 8.x 下尤其敏感) - 检查方法:在 phpinfo() 页面里找
Loaded Configuration File对应的php.ini路径,再看extension_dir值是否真实存在且可读
修改 php.ini 启用扩展(关键三步)
编辑 XAMPP 自带的 php.ini(通常位于 C:\xampp\php\php.ini),不要改 Apache 目录下的副本。
- 搜索
;extension=mysqli,删掉前面的分号,改为extension=mysqli - 同样处理
;extension=mbstring→extension=mbstring(MediaWiki、中文站点必需,否则安装页卡住) - 搜索
;extension=pdo_mysql,改为extension=pdo_mysql(注意不是php_pdo_mysql.dll,XAMPP 8.x 后命名已简化) - 保存后必须重启 Apache 服务(不是只刷新页面),否则修改不生效
连接失败但 pdo 可用?检查 host 和 socket 行为差异
mysqli 和 PDO 对 localhost 的解析逻辑不同:mysqli 默认走 TCP/IP,PDO 在某些配置下可能尝试 Unix socket(Windows 上无效)。
- mysqli 连接失败报
Access denied for user 'wp'@'localhost',但 PDO 成功 → 把$servername = "localhost"改成"127.0.0.1"再试,强制走 TCP - MySQL 实际监听的是
127.0.0.1:3306,而localhost在 Windows 下有时被映射到命名管道或 socket,mysqli 更严格 - phpMyAdmin 能进,但代码连不上 → 检查是否用了 root 空密码。XAMPP 新版默认禁用空密码登录,需在 phpMyAdmin 里给 root 用户设密码,或手动执行
ALTER USER 'root'@'localhost' IDENTIFIED BY '';
为什么改完 php.ini 还看不到 mysqli?路径和权限最常被忽略
extension_dir 错了,所有启用操作都白做。XAMPP 8.0+ 的 php.ini 默认写的是 extension_dir = "ext",但有些用户手动改过绝对路径,比如 extension_dir = "C:\xampp\php\ext\" —— 注意末尾那个反斜杠,Windows 会把它当成转义字符处理,导致目录识别失败。
- 正确写法只有两种:
extension_dir = "ext"(相对路径,推荐)或extension_dir = "C:/xampp/php/ext"(正斜杠,无尾部反斜杠) - 验证方式:在 PHP 脚本里加一行
var_dump(get_extension_funcs('mysqli'));,返回false就代表扩展根本没载入 - 还有一种静默失败:杀毒软件拦截了
php_mysqli.dll加载,临时关闭 Defender 实时防护再试一次











