必须启用mysqli扩展并正确配置:运行php -m | grep mysqli验证,取消php.ini中extension=mysqli注释,重启PHP服务;连接时显式指定端口、选库并设utf8mb4字符集,避免@抑制符掩盖caching_sha2_password等认证问题。

确认 mysqli 扩展已启用
PHP8.1 安装完不等于能连 MySQL——mysqli 扩展默认可能未加载。运行 php -m | grep mysqli,若无输出,说明没启用。打开 php.ini,找到并取消注释这行:extension=mysqli(不是 php_mysql.dll,那是 PHP5 时代的)。改完必须重启服务:sudo systemctl restart apache2 或 sudo systemctl restart php8.1-fpm。Windows 下用 XAMPP/WAMP 的,可在控制面板里点“PHP 扩展”勾选 mysqli。
面向对象方式连接测试库(推荐)
测试环境常需快速验证、频繁重连,面向对象写法更直观、错误属性直接可读。别把数据库名硬塞进 new mysqli() 第四个参数——它只设“默认库”,后续跨库或切换会失效。建议连接后显式选择:
$host = '127.0.0.1';
$port = 3306;
$user = 'testuser';
$pass = 'test123';
$dbname = 'testdb';
$conn = new mysqli($host, $user, $pass, '', $port);
if ($conn->connect_error) {
error_log('MySQL connect error: ' . $conn->connect_error);
die('DB unavailable');
}
// 显式选库 + 设字符集,比在 SQL 里 SET NAMES 更稳
$conn->select_db($dbname);
$conn->set_charset('utf8mb4');
- 端口不写默认是 3306,但测试环境有时会配成 3307 或其他,显式传参更可靠
-
$conn->set_charset('utf8mb4')必须在select_db()之后调用,否则可能不生效 - 别用
@new mysqli(...)抑制错误——会掩盖认证插件不兼容等关键问题
处理 MySQL 8.0+ 认证插件失败
本地测试环境用 root 连不上?大概率是 MySQL 8.0 默认用了 caching_sha2_password 插件,而 PHP8.1 的 mysqli 默认不支持。登录 MySQL 执行:
ALTER USER 'testuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test123'; FLUSH PRIVILEGES;
- 别只改 root,测试账号也要同步改;
'testuser'@'localhost'中的 host 要和 PHP 连接时的 host 一致(127.0.0.1≠localhost,后者走 socket) - 如果测试库部署在 Docker 或远程 VM,host 改成对应 IP,并确认 MySQL 的
bind-address允许该地址访问 - 改完不用重启 MySQL,但 PHP 连接要重试——旧连接缓存可能仍卡在插件协商阶段
连接后立即验证可用性
测试环境不是连上就完事,得确认能真正执行查询。加一行轻量探测:
立即学习“PHP免费学习笔记(深入)”;
if (!$conn->query("SELECT 1")) {
error_log('DB probe failed: ' . $conn->error);
die('DB health check failed');
}
- 用
SELECT 1比查真实表更快,且绕过权限问题(只要登录成功就能跑) - 别依赖
mysqli_ping()——它只测连接存活,不保证 SQL 层可用(比如 max_connections 耗尽时 ping 成功但 query 失败) - 测试脚本退出前务必调用
$conn->close(),避免连接数堆积导致后续测试失败
最易被忽略的是字符集和认证插件的组合影响:utf8mb4 设了但插件不兼容,或者插件改了但没清客户端 DNS 缓存,都会表现为“连上了却查不出中文”或“莫名中断”。每次换环境,这两项必须一起核对。



















