<p>PHP 8.0+ 下 mysqlconnect 等函数因扩展彻底移除而触发 Fatal error,必须全局搜索并删除所有 mysql* 调用(含 app/ 和 extend/),确认真依赖后替换为 Db::query() 或 PDO,同时注释 php.ini 中废弃的 mysql.so/php_mysql.dll 并启用 pdo_mysql 和 mysqli。</p>

ThinkPHP 8 项目中残留的 mysql_connect 及相关函数调用,在 PHP 8.0+ 环境下会直接触发 Fatal error,因为该扩展自 PHP 7.0 起废弃、8.0 正式移除,没有任何开关或兼容层可启用——必须彻底删除并替换为 Db 类或 PDO 写法,否则项目根本无法启动。
第一步:定位所有 mysql_* 函数调用
打开终端,进入项目根目录,执行:
【注意:必须包含 extend/ 和 app/ 目录,第三方包和自定义模块常藏在 extend/】
grep -r "mysql_connect\|mysql_query\|mysql_fetch_\|mysql_num_rows\|mysql_error" app/ extend/ --include="*.php"
立即学习“PHP免费学习笔记(深入)”;
若返回空结果,不代表安全——有些代码可能拼接字符串调用,比如 $func = 'mysql_' . 'connect'; $func();,这种需人工逐行扫视。重点检查旧版验证码、日志写入、安装脚本、数据库迁移类等冷门模块。
第二步:区分真依赖与历史残留
对每个搜索结果,先判断是否真实走 MySQL 原生扩展:
→ 打开对应文件,看是否含有 extension=php_mysql.dll 或 mysql_connect( 直接调用;
→ 若只是 mysql_query( 出现在注释里、或被 if (false) { ... } 包裹,直接删;
→ 若调用前有 function_exists('mysql_connect') 判断,说明作者已知其废弃,整段逻辑应整体移除,不要保留判断壳子。
绝大多数 ThinkPHP 项目实际使用的是 \think\Db::query() 或 PDO 封装,所谓“mysql_* 调用”只是未清理的遗留代码,删掉即可,无需替换。
第三步:仅对确需保留的逻辑做安全替换
方法一:统一改用 ThinkPHP Db 类(推荐)
把 mysql_query("SELECT * FROM user") 替换为 \think\Db::query("SELECT * FROM user");
把 mysql_fetch_array($result) 替换为 \think\Db::query("SELECT * FROM user")[0] 或直接走 ORM:Db::name('user')->select();
【关键前提:确保该代码路径确实被运行,且当前数据库连接已正确配置为 mysql 类型】
方法二:改用原生 PDO(适用于需脱离框架的底层模块)
替换前确认 php.ini 已启用 extension=pdo_mysql;
将 $link = mysql_connect($host, $user, $pass); mysql_select_db($db, $link); 改为:
$dsn = "mysql:host=127.0.0.1;dbname={$db};charset=utf8mb4";<br>$pdo = new \PDO($dsn, $user, $pass, [\<br> \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,<br> \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC<br>]);
后续所有 mysql_query() 全部改为 $pdo->query(),mysql_fetch_array() 改为 $stmt->fetch()。
第四步:检查并清理 php.ini 中的废弃扩展
找到当前 PHP 运行所用的 php.ini 文件(可通过 php --ini 查看),打开后搜索:
extension=php_mysql.dll(Windows)或 extension=mysql.so(Linux);
→ 若存在,**整行注释掉或删除**;
→ 同时确认 extension=pdo_mysql 和 extension=mysqli 已启用且未被注释;
重启 PHP 服务(如 php-fpm 或 Apache),再运行 php -m | grep -E "(mysql|pdo)" 验证输出含 mysqli 和 pdo_mysql 即可。



















