php 8.5.5 默认不启用 mysqli 或 pdo_mysql 扩展,必须手动在 php.ini 中启用 extension=mysqli 和 extension=pdo_mysql(windows 为 php_mysqli.dll/php_pdo_mysql.dll),并重启服务;连接时 mysqli 需检查 $conn->connect_error,pdo 必须设置 pdo::attr_errmode => pdo::errmode_exception 并在 dsn 中显式指定 charset=utf8mb4。

PHP 8.5.5 默认不启用任何数据库扩展,直接 new mysqli 或 new PDO 会报 Fatal error: Uncaught Error: Class "mysqli" not found —— 这不是代码写错了,是扩展根本没开。
确认 mysqli 或 pdo_mysql 扩展已启用
PHP 8.5.5 不再默认捆绑 mysql 扩展(早已移除),mysqli 和 PDO 是两个独立模块,必须手动启用:
- 运行
php -m | grep -E "(mysqli|pdo|pdo_mysql)",检查输出中是否含mysqli、pdo、pdo_mysql - 若缺失,编辑你的 php.ini(可通过
php --ini查路径),取消注释或添加:extension=mysqliextension=pdo_mysql - 重启 Web 服务(如 Apache)或 PHP-FPM;命令行下需重启终端或重载配置
- 注意:Windows 下扩展名可能是
php_mysqli.dll,Linux/macOS 是mysqli.so
用 mysqli 面向对象方式连接本地 MySQL
这是最轻量、无需额外配置的连接方式,适合快速验证本地环境:
- 默认端口是
3306,如果改过(比如用 Docker 启动的 MySQL 映射到3307),必须显式传入第 5 个参数:new mysqli("localhost", "root", "pass", "testdb", 3307) - 字符集建议直接在 DSN 里声明,避免后续乱码:
$conn->set_charset("utf8mb4") - 不要依赖
mysql_select_db()—— 构造时第 4 个参数已指定库名,再选一次纯属冗余 - 连接失败时,
$conn->connect_error返回的是字符串,不是异常,别用try/catch包裹它
<?php $host = 'localhost';
$user = 'root';
$pass = '123456'; // 本地测试常用弱密码,切勿用于生产
$db = 'testdb';
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) {
die('连接失败: ' . $conn->connect_error);
}
$conn->set_charset('utf8mb4');
echo "✅ 已连上本地 MySQL";
?>
用 PDO 连接并启用异常模式
PDO 更适合现代项目,尤其当你可能换数据库(比如后期切 SQLite 做单元测试),但本地测试时容易栽在 DSN 格式和错误处理上:
- DSN 中必须包含
charset=utf8mb4,否则中文插入/查询可能出错;localhost在某些 Docker 环境下会解析失败,换成127.0.0.1更稳 -
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION必须设,否则 SQL 错误静默失败,debug 时找不到问题在哪 - 不要省略第 4 个参数(options 数组),空数组
[]和不传效果不同:不传则用默认设置,PDO::ATTR_ERRMODE默认是SILENT - 连接成功后,PDO 对象本身不自动关闭,脚本结束会释放,但若长期运行(如 CLI 守护进程),建议显式置为
null
<?php $dsn = 'mysql:host=127.0.0.1;dbname=testdb;charset=utf8mb4';
$user = 'root';
$pass = '123456';
try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
echo "✅ PDO 连接成功";
} catch (PDOException $e) {
die('❌ PDO 连接失败: ' . $e->getMessage());
}
?>
命令行快速验证连通性
不用起 Web 服务器,一行命令就能排除网络、权限、服务状态等基础问题:
- 执行:
php -r "\$pdo = new PDO('mysql:host=127.0.0.1;dbname=testdb', 'root', '123456'); echo 'ok';" - 报
Connection refused→ MySQL 没启动,或端口不对 - 报
Access denied→ 用户密码错,或该用户没权限访问testdb - 报
Unknown database→ 库不存在,先用mysql -u root -p -e "CREATE DATABASE testdb;"创建 - 注意:CLI 的 php.ini 和 Web 的可能不同,
php --ini和phpinfo()要分别确认
本地测试最容易忽略的其实是 MySQL 服务本身的状态和用户权限粒度——PHP 连接代码写对了,但 root@localhost 在 MySQL 8+ 默认只允许 socket 连接,而 PHP 的 mysqli 默认走 TCP。这时候把 host 改成 127.0.0.1 或确认 MySQL 用户有 root@'127.0.0.1' 权限,比调 PHP 代码更关键。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











