thinkphp报“could not find driver”或“class 'pdo' not found”是因php未启用pdo_mysql扩展,需确保cli和web环境的php.ini均开启extension=pdo_mysql.so(linux/macos)或php_pdo_mysql.dll(windows),并验证pdo驱动列表含mysql。

ThinkPHP项目一运行就报“could not find driver”或“Class 'PDO' not found”,不是数据库配置写错了,而是PHP环境压根没加载pdo_mysql扩展——CLI能连、网页崩,90%是命令行和Web用的两套php.ini,其中一套漏启了驱动。
先确认PDO扩展是否真在跑
打开终端,执行:php -m | grep -E "pdo|mysql"。如果只看到pdo但没有pdo_mysql,说明扩展未启用;若连pdo都看不到,pdo主模块也没开。
新建一个info.php,内容为<?php phpinfo(); ?>,用浏览器访问它,搜索“Loaded Configuration File”,记下实际生效的php.ini绝对路径。
【CLI和Web必须共用同一套扩展状态】你刚在终端看到的php -m结果,只代表命令行PHP;而ThinkPHP网页请求走的是PHP-FPM或Apache模块,它读的是phpinfo()里显示的那个php.ini。两个环境的extension=pdo_mysql.so(Linux/macOS)或extension=php_pdo_mysql.dll(Windows)必须都存在且未被注释。
Mac上启用pdo_mysql的两种方式
方法一:用brew直接安装扩展(推荐)
先确认PHP版本,例如是php@8.2,则运行:brew install php@8.2-mysql。安装完成后,检查其自动生成的ini文件——通常位于/opt/homebrew/etc/php/8.2/conf.d/ext-mysql.ini,确保内容为extension="pdo_mysql.so"(不带路径,PHP 7.4+自动补后缀)。
方法二:手动编辑php.ini启用(当brew未生成ini时)
用nano /opt/homebrew/etc/php/8.2/php.ini打开对应php.ini,在;extension=区块末尾添加一行:extension=pdo_mysql.so。注意不要加引号、不要写绝对路径、不要漏掉.so后缀——写成extension="pdo_mysql"或extension=/opt//pdo_mysql.so都会失败。
⚠️ 提醒:Mac上extension_dir默认指向/opt/homebrew/lib/php/pecl/20220829这类带数字后缀的目录,别手动生成.so文件往错目录扔;brew install会自动把pdo_mysql.so放进正确位置。
Linux系统快速补全PDO驱动
第一步:确认包管理器类型
Ubuntu/Debian用户执行:sudo apt update && sudo apt install php-pdo php-mysql;CentOS/RHEL用户执行:sudo yum install php-pdo php-mysqlnd(或dnf install php-pdo php-mysqlnd)。
第二步:检查php.ini是否启用
运行php --ini查CLI配置路径,再用phpinfo()查Web配置路径,两个php.ini里都要有:extension=pdo.soextension=pdo_mysql.so
(注意:不是mysqli.so,也不是pdo_pgsql.so)
第三步:重启服务并验证
Ubuntu/Debian下执行:sudo systemctl restart apache2 或 sudo systemctl restart php8.2-fpm;CentOS下执行:sudo systemctl restart httpd 或 sudo systemctl restart php-fpm。然后刷新phpinfo()页面,搜索“PDO drivers”,确认列表中明确出现mysql(小写、无下划线、无前缀)。
Windows下启用pdo_mysql的关键动作
打开php.ini,去掉这两行前面的分号:;extension=php_pdo.dll;extension=php_pdo_mysql.dll
确认extension_dir指向的目录下真实存在这两个DLL文件——常见错误是路径写对了,但php_pdo_mysql.dll根本没拷进去,或者文件名拼错成php_pdo_mysql.dll.bak。
重启Web服务(Apache/Nginx)或PHP-FPM进程,否则修改不生效。
ThinkPHP中type字段填错的致命陷阱
TP6+ 的config/database.php中,connections.default.type必须是字符串,不能是数组(比如不能写成['type' => 'mysql'])。
这个type值不是随便写的数据库名,而是PDO扩展注册的驱动标识符,大小写、拼写、下划线全敏感:
✅ 合法值只有:'mysql'、'pgsql'、'sqlite'、'sqlsrv'、'oci'
❌ 禁止写成:'MySQL'、'pdo_mysql'、'mysqli'、'mysql '(末尾空格)、"mysql"(双引号在某些旧版TP中有解析差异)
写错一个字符,PDO直接抛出“Driver not found”,不会提示你哪错了。
验证连接是否真正打通
在项目根目录终端执行:mysql -h 127.0.0.1 -P 3306 -u root -p。这一步必须用127.0.0.1,不是localhost——后者在macOS/Linux下默认走socket,容易和PHP配置错位。
如果命令行能连上,但ThinkPHP还是报错,说明问题一定出在PHP环境或配置项上;如果命令行也连不上,先查MySQL服务是否启动、端口是否监听、用户权限是否允许从该host登录。
别只盯着日志里“数据库连接失败”这句废话,直接翻runtime/log/下最新日志,找到带PDOException的那一行,复制完整message再判断。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











