答案是:PDO连接MySQL报“could not find driver”错误,本质是PHP未加载pdo_mysql扩展,因PDO仅为抽象层,需该驱动实现具体通信。

“找不到驱动”不是mysqli的问题,是PDO和MySQLi被混用了
报错 could not find driver 时,如果代码里用的是 PDO(比如 new PDO('mysql:host=...')),但你只启用了 mysqli 扩展,那必然失败——mysqli 和 PDO 是两套完全独立的扩展,互不替代。
确认你实际用的是 PDO 还是 MySQLi
先看代码里怎么写的:
- 用了
new PDO(...)或pdo_相关函数 → 你需要pdo_mysql扩展,不是mysqli - 用了
mysqli_connect()、new mysqli()→ 你需要mysqli扩展,pdo_mysql起不到作用 - ThinkPHP/Laravel 等框架默认走 PDO,即使配置里写
'type' => 'mysql',底层也调PDO,所以仍依赖pdo_mysql
php.ini 里 extension=xxx 的写法必须匹配系统架构
Linux 和 Windows 下扩展名不同,写错就等于没加载:
立即学习“PHP免费学习笔记(深入)”;
- Linux:必须是
extension=pdo_mysql(无后缀)或extension=pdo_mysql.so(显式 .so) - Windows:必须是
extension=php_pdo_mysql.dll(带php_前缀 +.dll) - 别写成
extension=pdo_mysql.dll(Linux 下会忽略)、也别写成extension=php_pdo_mysql(Windows 下缺后缀不加载) - 检查
extension_dir是否指向真实存在的目录,路径错误会导致扩展加载静默失败
php -m 显示 pdo_mysql 但还是报错?查 PHP SAPI 环境分裂
CLI(命令行)和 Web(Apache/Nginx)可能用的是两套 php.ini,装对了 CLI 的扩展,不代表 Web 也能用:
- 运行
php --ini查 CLI 加载的配置 - 在 Web 环境中建一个
info.php,内容为<?php phpinfo(); ?>,访问后搜索 “Loaded Configuration File” 看 Web 实际读的是哪个php.ini - 两个环境的
php.ini都得单独加extension=pdo_mysql并重启对应服务(systemctl restart apache2或systemctl restart php-fpm) -
php -m | grep pdo只反映 CLI,不能代表 Web 请求时的状态
最容易被忽略的一点:扩展启用后,pdo(基础模块)和 pdo_mysql(具体驱动)必须同时存在。只开 pdo_mysql 而没开 pdo,照样报 “could not find driver”。



















