PHP 8.3 可直接用 mysqli 连接 MariaDB 10.6,无需额外扩展;常见错误“Class 'mysqli' not found”源于未启用 extension=mysqli 扩展、extension_dir 路径错误或未重启服务,需通过 php -m 或 phpinfo() 验证加载状态。

PHP 8.3 调用 mysqli 就能连 MariaDB 10.6,不需要额外扩展
MariaDB 10.6 完全兼容 MySQL 协议,PHP 8.3 自带的 mysqli 扩展开箱即用,无需安装 mariadb-connector-php 或其他第三方包。只要 PHP 编译时启用了 mysqli(默认几乎都启用),new mysqli() 就能直连 —— 这不是“凑合能用”,而是官方保证的兼容层级。
常见错误现象:Fatal error: Class 'mysqli' not found 不是 MariaDB 版本问题,而是 PHP 环境没启用扩展:
- 检查
php.ini中是否取消注释extension=mysqli(Windows 下可能是extension=php_mysqli.dll) - 确认
extension_dir指向正确绝对路径(比如C:\php\ext或/usr/lib/php/20230831/),相对路径常失效 - 运行
php -m | grep mysqli或print_r(get_loaded_extensions())验证已加载
new mysqli() 连接时端口、字符集、空密码的写法细节
MariaDB 10.6 默认端口仍是 3306,但显式写出更稳妥,尤其 Docker 或云数据库常改端口;字符集不设会乱码,空密码传 '' 而非 null,否则 PHP 8.3 可能触发 TypeError:
- 主机名用
'localhost'会走 Unix socket(快),用'127.0.0.1'强制走 TCP(适合调试权限或远程) - 连接后必须立即执行
$mysqli->set_charset('utf8mb4'),MariaDB 10.6 默认字符集是utf8mb4,但 PHP 客户端不自动同步 - 密码为空时传
'',传null会导致mysqli_connect(): Argument #3 ($password) must be of type string - 端口参数可省略,但建议显式写出:第 5 个参数是
$port,不是选项数组 ——mysqli不支持键值对配置
示例:
立即学习“PHP免费学习笔记(深入)”;
<?php
$host = '127.0.0.1';
$user = 'appuser';
$pass = ''; // 注意:空字符串,不是 null
$db = 'myapp';
$port = 3306;
$mysqli = new mysqli($host, $user, $pass, $db, $port);
if ($mysqli->connect_error) {
die('Connect failed: ' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4'); // 必须加,否则中文存取异常
?>
为什么推荐开启 MYSQLI_REPORT_STRICT 而不是手动检查错误
PHP 8.3 对 mysqli_report() 的异常支持更稳定,关掉它就得在每个查询后写 if ($mysqli->errno) { ... },极易漏判;开启后所有错误(连接失败、查询语法错、字段不存在)统一抛 mysqli_sql_exception,try/catch 一把抓:
- 必须在
new mysqli()前调用mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) - 不能只用
MYSQLI_REPORT_ERROR,缺STRICT时部分警告仍静默(比如准备语句绑定类型不匹配) - 注意:该设置是进程级全局生效,若项目混用多个 DB 实例,需确保无冲突
- 开启后
$mysqli->query()返回true/false,不再返回结果对象 —— 查询要用$mysqli->real_query() + $mysqli->use_result()或直接->query()后判断是否为mysqli_result
MariaDB 10.6 特有行为:认证插件和 SSL 连接要留意
MariaDB 10.6 默认使用 unix_socket(本地)或 mysql_native_password(TCP),但若用户用 ed25519 插件创建,mysqli 会报 Plugin 'ed25519' is not loaded;SSL 也不是默认启用,明文传输风险需主动处理:
- 若遇到认证插件错误,用
ALTER USER 'user'@'host' IDENTIFIED VIA mysql_native_password USING PASSWORD('xxx');切回兼容模式 - 强制 SSL 连接需在 DSN 中加
?ssl_mode=REQUIRED(PDO 支持更好),mysqli仅能通过mysqli::options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true)+ 设置 CA 路径,操作繁琐 - MariaDB 10.6 的
max_allowed_packet默认值比 MySQL 8.0 小,大字段插入失败时先查SHOW VARIABLES LIKE 'max_allowed_packet';,再用$mysqli->options(MYSQLI_OPT_MAX_ALLOWED_PACKET, 64*1024*1024);调整
真正麻烦的从来不是“能不能连”,而是连上之后的字符集、错误处理、认证兼容、资源释放这些细节 —— 它们不会报错,但会让数据无声损坏或请求随机失败。



















