“driver not found”根本原因是php未加载对应pdo扩展,需同时检查cli和web环境的php.ini中pdo及pdo_mysql是否启用,并确保thinkphp的type值严格为'mysql'等合法字符串。

“Driver not found”不是配置写错了,是 PHP 根本没加载对应 PDO 扩展——哪怕 database.php 里 'type' => 'mysql' 写得再标准,只要 pdo_mysql 没启用,TP 启动时就会静默失败或直接抛异常。
php -m 和 phpinfo() 为什么必须都查
CLI(命令行)和 Web(Apache/Nginx)很可能加载了两套 php.ini,导致一个环境能连数据库、另一个报错。只查 php -m 看到 pdo_mysql,不代表网页能用;只看 phpinfo() 页面里的 PDO drivers 列表,也不代表命令行迁移能跑通。
- CLI 下执行
php --ini查 “Loaded Configuration File” 路径 - Web 下建
info.php(内容为<?php phpinfo(); ?>),访问后搜索 “Loaded Configuration File” - 对比两个文件中
extension=行:Linux/macOS 看是否都有extension=pdo.so和extension=pdo_mysql.so;Windows 看是否都解注了extension=php_pdo.dll和extension=php_pdo_mysql.dll - 改完任一
php.ini都要重启对应服务:CLI 不用重启,Web 必须sudo systemctl restart apache2或sudo nginx -s reload
ThinkPHP 的 type 值不是随便写的
TP 不认 mysqli、pdo_mysql、MySQL 这类常见变体,只认 PDO 扩展注册的驱动名,且严格区分大小写和下划线。写错一个字符,就触发 Driver not found。
- 合法值只有:
'mysql'、'pgsql'、'sqlite'、'sqlsrv'、'oci' -
config/database.php中必须是字符串,不是数组:'type' => 'mysql'✅,不是'type' => ['type' => 'mysql']❌(TP6+ 尤其注意) - TP8 模块化后,视图驱动等也按同样逻辑处理:
Driver [Think] not supported就是缺topthink/think-view包,跟数据库驱动同理
密码含 @ / : 等字符时 DSN 会 silently 解析失败
ThinkPHP 把 host、username、password 拼进 PDO DSN 字符串,而 DSN 使用 URL 格式。若密码含 @、/、:、?,不编码就会截断连接串,PDO 报错信息往往误导人(比如提示 host 错误)。
- 密码
p@ss/wd必须 URL 编码为p%40ss%2Fwd - TP6 中如果手动写了
'dsn'配置项,其他字段(如host、port)会被忽略——此时必须确保 DSN 完整且含;charset=utf8mb4 - TP5.1 默认拼接 DSN,但若
'dsn' => 'mysql:host='这种半截写法存在,也会跳过自动拼接,导致连接参数丢失
最常被忽略的是 MySQL 8.0+ 的 caching_sha2_password 认证插件:老版本 PHP/PDO 不支持,错误提示像 SQLSTATE[HY000] [2054],但它根本不是驱动问题,而是认证不兼容——这时候该在数据库侧建用户时指定 IDENTIFIED WITH mysql_native_password,而不是硬改 PHP 扩展。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











