XAMPP 默认已启用 mysqli 扩展,但若出现 Class 'mysqli' not found 等错误,需确认 phpinfo() 显示 mysqli support 为 enabled,并检查是否修改了正确的 php.ini(Apache 与 CLI 路径不同),确保 extension=php_mysqli.dll(Windows)或 extension=mysqli.so(macOS)未被注释,且重启 Apache;连接失败常因 localhost/127.0.0.1 差异、空密码误加 -p、端口占用或防火墙拦截所致。

XAMPP 默认已启用 mysqli 扩展,不需要手动开启 —— 但如果你遇到 Class 'mysqli' not found 或 Call to undefined function mysqli_connect() 这类错误,说明 PHP 实际加载的配置没走 XAMPP 自带的 php.ini,或者扩展被意外注释/禁用。
确认 mysqli 是否真的已启用
直接访问 http://localhost/dashboard/phpinfo.php(或新建一个 info.php 文件写入 <?php phpinfo(); ?> 放进 htdocs),搜索 “mysqli”。如果看到 “mysqli support” 显示为 “enabled”,且 “Client API library version” 有数值,说明扩展已就位。
常见误判点:
- 你改了错误的
php.ini文件(比如系统级的、WAMP 留下的、或 CLI 模式下的) - Apache 和 CLI 使用的是不同 PHP 配置(
php --ini查 CLI 路径,phpinfo()查 Web 路径) - 你运行的是旧版 XAMPP(如 5.6 以前),但代码用了
mysqli新特性(如MYSQLI_OPT_CONNECT_TIMEOUT)
检查并修正 php.ini 中的 mysqli 配置
XAMPP 的 php.ini 通常位于:C:\xampp\php\php.ini(Windows)或 /Applications/XAMPP/xamppfiles/etc/php.ini(macOS)。打开后搜索以下两行:
extension=php_mysqli.dll ;extension=mysqli
确保其中一行是**未被分号注释**且拼写正确(Windows 是 .dll,macOS/Linux 是 .so,XAMPP for macOS 一般已预配好):
- Windows:取消
;extension=php_mysqli.dll前的分号 → 变成extension=php_mysqli.dll - macOS:检查是否存在
extension=mysqli.so,若无则补上(但新版 XAMPP 通常已默认启用) - 改完必须重启 Apache(不是只刷新页面)
PHP 代码中连接 MySQL 时的典型陷阱
即使 mysqli 已启用,连接失败往往不是扩展问题,而是参数或权限配置偏差:
-
$servername写成"127.0.0.1"而非"localhost":MySQL 对这两者处理方式不同(localhost默认走 socket,127.0.0.1走 TCP),XAMPP 默认 root 用户只允许 socket 登录;若坚持用 IP,需确认用户权限含'root'@'127.0.0.1' - 密码为空却写了
-p参数:命令行执行mysql -uroot -p会卡在输入密码提示,而 XAMPP 默认 root 密码为空,应直接用mysql -uroot - 端口被占用:MySQL 默认端口 3306 若被其他服务(如独立安装的 MySQL、Docker 容器)占了,XAMPP 启动会失败;可改
my.ini中的port=3307并同步更新 PHP 连接里的$port参数 - 防火墙或杀毒软件拦截:尤其 Windows Defender 有时会静默阻止
mysqld.exe监听,表现为服务“启动又停止”
验证连接是否真正可用的最小闭环
别依赖 phpMyAdmin 成功就认为 PHP 脚本能连——它用的是另一套认证逻辑。用这个最简脚本实测:
<?php
$host = 'localhost';
$user = 'root';
$pass = ''; // XAMPP 默认空密码
$db = 'mysql'; // 系统库,保证一定存在
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) {
die('连接失败: ' . $conn->connect_error . ' (errno: ' . $conn->connect_errno . ')');
}
echo '✅ mysqli 连接成功,版本:' . $conn->get_client_info();
$conn->close();
?>
重点看输出里有没有 errno(比如 1045 是权限错,2002 是无法连接到 socket/TCP)。只要这一步通了,后续业务逻辑的问题就和扩展无关了。
最容易被忽略的是:XAMPP 控制面板显示 MySQL “Running”,不代表它真在监听外部连接。有时候 mysqld 进程活着,但因配置错误(如 skip-networking 或绑定地址不对)拒绝所有 TCP 请求,只响应本地 socket —— 这时候用 127.0.0.1 就必然失败,而 localhost 可能侥幸成功。


















