答案是PHP未安装或未启用pdo_mysql扩展:需运行php -r "print_r(PDO::getAvailableDrivers());"确认输出含小写mysql,再分别验证CLI和Web环境的php.ini路径及extension=pdo_mysql启用状态,二者必须一致。

报 could not find driver 错误,90% 的情况不是代码写错了,而是 PHP 根本没装或没启对应数据库的 PDO 驱动扩展。别急着改 database.php 或重试密码,先确认环境有没有这个“零件”。
怎么快速确认缺不缺 pdo_mysql
执行这行命令:
php -r "print_r(PDO::getAvailableDrivers());"
如果输出里没有 mysql(注意是小写、无下划线、无前缀),那就实锤缺驱动。常见错误输出:
-
Array ( [0] => sqlite )→ 缺pdo_mysql -
Array ( )(空数组)→ 连pdo主模块都没加载 -
Array ( [0] => mysql [1] => pgsql )→ 驱动正常,问题在别处
这个命令必须在你实际运行 PHP 的环境下执行:CLI 下跑一次,Web 下(比如放个 info.php 里调用)再跑一次——两者结果可能完全不同。
立即学习“PHP免费学习笔记(深入)”;
Linux 下装 pdo_mysql 的正确姿势
不同发行版包名不同,不能只装 php 就完事。必须显式安装驱动包:
- Ubuntu/Debian:
sudo apt install php-mysql(会自动拉取php-pdo和php-mysql) - CentOS/RHEL 8+:
sudo dnf install php-pdo php-mysqlnd - Alpine(Docker 常见):
apk add php82-pdo_mysql(版本号按你实际 PHP 版本调整)
装完别忘了验证:php -m | grep pdo 应同时输出 pdo 和 pdo_mysql。注意不是 mysqli ——那是另一个扩展,PDO 不认它。
Windows 下 php.ini 配置最容易踩的坑
即使你看到 php.ini 里有这两行,也不代表生效:
;extension=php_pdo.dll;extension=php_pdo_mysql.dll
必须做三件事:
- 删掉前面的分号,改成
extension=php_pdo.dll和extension=php_pdo_mysql.dll - 确认
extension_dir指向的目录下真实存在这两个 DLL 文件(路径别写错,大小写敏感) - 重启 Web 服务(Apache 或 Nginx + PHP-FPM),不是只重启浏览器
特别注意:Windows 下 CLI 和 Apache/FPM 往往加载不同 php.ini,php --ini 和 phpinfo() 显示的 “Loaded Configuration File” 路径必须一致,且两处都启用了驱动。
ThinkPHP 中 type => 'mysql' 写错也会触发该报错
TP6/TP8 的 config/database.php 里,'type' => 'mysql' 这个值不是随便填的字符串,而是 PDO 扩展注册的驱动标识符,大小写、拼写、空格全敏感:
- ✅ 正确:
'mysql'、'pgsql'、'sqlite' - ❌ 错误:
'MySQL'、'mysqli'、'pdo_mysql'、'mysql '(末尾空格)、"mysql"(双引号在某些旧 TP 版本中解析异常)
另外,'type' 必须是字符串,不能是数组或对象。如果用了 env('DB_TYPE', 'mysql'),请确保 .env 里写的也是纯字符串 DB_TYPE=mysql,别带空格或引号。
最常被忽略的一点:CLI 和 Web 环境用的是两套独立的 PHP 配置。你在终端跑 php think migrate 成功,不代表网页能访问;反过来也一样。每次改完配置,必须分别验证两个环境的 PDO::getAvailableDrivers() 输出,并确认服务已真正重启。



















