PHP 8.3.8 默认不加载 MySQL 扩展,必须手动启用 mysqli 和 pdo_mysql:分别确认 CLI 与 Web 环境的 php.ini 路径,取消 extension=mysqli 和 extension=pdo_mysql 注释,检查 extension_dir 正确性,重启服务后用 function_exists('mysqli_connect') 和 class_exists('PDO') 验证,再设字符集 utf8mb4 并启用 PDO 异常模式。

PHP 8.3.8 默认不加载 MySQL 扩展,必须手动启用 mysqli 或 pdo_mysql,否则调用 mysqli_connect() 或 PDO 构造函数会直接报错 “Call to undefined function”。
确认 php.ini 路径并启用扩展
CLI 和 Web(如 Apache/Nginx)可能使用不同的 php.ini,必须分别检查:
- 运行
php --ini查 CLI 使用的配置文件位置 - 在 Web 环境中创建
<?php phpinfo(); ?>页面,搜索 “Loaded Configuration File” 确认 Web 使用的php.ini - 打开两个
php.ini,取消注释以下两行(确保没有分号):extension=mysqliextension=pdo_mysql - 检查
extension_dir是否指向正确的扩展目录(例如ext或绝对路径),路径错误会导致扩展加载失败但无明确提示 - 保存后重启 Web 服务器(
systemctl restart apache2或nginx)和 PHP-FPM(如使用)
验证扩展是否真正生效
仅靠 php -m | grep mysqli 不够可靠——它只检测模块是否注册,不保证能正常初始化。更稳妥的方式是:
- 写一个测试脚本,调用
function_exists('mysqli_connect')和class_exists('PDO'),返回true才算通过 - 若
phpinfo()页面里有 “mysqli” 和 “pdo_mysql” 区块,且 “Client API library version” 显示非空(如mysqlnd 8.3.8),说明客户端库也已就位 - 常见假阳性:扩展名写错(如
extension=php_mysqli.dll在 Linux 下无效)、扩展文件缺失、或extension_dir指向空目录
连接时 charset 和 port 的坑
PHP 8.3.8 对字符集和端口处理更严格,不显式指定容易导致中文乱码或连接超时:
立即学习“PHP免费学习笔记(深入)”;
- 用
mysqli时,mysqli_set_charset($conn, 'utf8mb4')必须在mysqli_connect()之后立即调用,不能等到执行查询前才设 - 用
PDO时,DSN 中的charset=utf8mb4是必需项,漏掉会导致插入中文时报SQLSTATE[HY000]: General error: 1366 Incorrect string value - 如果 MySQL 不在默认 3306 端口,
mysqli面向对象方式必须传第 5 个参数(端口),而面向过程方式要把端口拼进主机名:"localhost:3307";PDO则必须写成mysql:host=localhost;port=3307;dbname=test
为什么 PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION 是刚需
PHP 8.3.8 默认关闭异常模式,PDO 连接失败只会静默返回 false,不抛出异常,极易掩盖真实问题:
- 不设异常模式时,
new PDO(...)失败后继续执行后续代码,常引发Call to a member function query() on bool - 正确写法必须包含:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);,且该行要在构造之后、任何查询之前 - 这个设置无法在 DSN 中声明,也不能延迟到第一次查询时再设——连接阶段的错误(如权限拒绝、服务未启动)只有在构造时捕获
最易被忽略的是:PHP 8.3.8 会静默忽略 mysqli 连接中的空密码('')与 MySQL 8.0+ 默认认证插件 caching_sha2_password 的兼容问题,此时需在 MySQL 中为用户显式重置为 mysql_native_password,光改 PHP 配置没用。



















