<p>PHP 8.2 下 ThinkPHP 5.1 必须使用 'pdo_mysql' 作为数据库驱动,禁用 mysql/mysqlnd/mysqli;需启用 pdo 和 pdomysql 扩展,清除所有 mysql* 函数调用,并推荐配置 PDO 参数以提升兼容性。</p>

PHP 8.2 环境下 ThinkPHP 5.1 数据库驱动必须用 pdo_mysql,不能写 mysql 或 mysqlnd——否则直接报错或连接失败。
database.php 中 type 必须设为 'pdo_mysql'
打开 config/database.php,确认这一行:
-
正确写法:
'type' => 'pdo_mysql' -
错误写法(会报错):
'type' => 'mysql'、'type' => 'mysqlnd'、'type' => 'mysqli'
PHP 8.2 已彻底移除 mysql_* 函数族,mysqlnd 也不是合法驱动名;TP 5.1 的底层适配只认 pdo_mysql 这个标识符,它对应 PDO MySQL 驱动,是唯一稳定支持的选项。
确保 PDO 扩展已启用且无冲突
执行 php -m | grep pdo,输出中必须包含:
立即学习“PHP免费学习笔记(深入)”;
pdopdo_mysql
如果缺 pdo_mysql,需在 php.ini 中开启:extension=pdo_mysql(Linux/macOS)或 extension=php_pdo_mysql.dll(Windows)。注意:不要同时加载 mysql 或 mysqli 扩展,它们与 PDO 冲突且 PHP 8.2 不再兼容。
废弃 mysql_* 函数必须全部清除
即使数据库配置正确,只要代码里残留任何 mysql_connect()、mysql_query() 等调用,PHP 8.2 启动时就会 Fatal error: Call to undefined function。
- 全局搜索:
grep -r "mysql_" app/ extend/ - 所有匹配到的地方,统一替换为
\think\Db::query()或模型查询方法 - 特别检查历史插件、自定义工具类、旧模块的初始化脚本
连接参数建议显式指定 PDO 属性
在 database.php 的 'params' 配置中加入:
-
PDO::ATTR_EMULATE_PREPARES => false(禁用模拟预处理,提升安全性和兼容性) -
PDO::ATTR_STRINGIFY_FETCHES => false(避免数字字段被转成字符串) -
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"(显式设字符集)
这些不是必须项,但能规避 PHP 8.2 下部分边缘场景的类型隐式转换问题,尤其在处理时间、布尔、JSON 字段时更可靠。



















