PHP 7.0起mysql_*函数被彻底移除,7.4中调用mysql_connect()报错因函数已从源码删除;需改用mysqli或PDO,并注意连接句柄传递、错误模式设置及数组索引兼容性。

PHP 7.4 里 mysql_connect() 不是“不能用”,而是根本不存在——它早在 PHP 7.0 就被物理删除了。
为什么调用就报 Fatal error: Call to undefined function mysql_connect()
这不是配置没开、扩展没装、路径写错的问题,是 PHP 官方把整个 mysql_* 函数族从源码里删干净了:
- PHP 5.5.0 起标记为
@deprecated,仅警告 - PHP 7.0.0 起彻底移除,
mysql_connect()、mysql_query()、mysql_fetch_array()全部消失 - PHP 7.4(以及所有后续版本)压根不编译这部分代码,连函数符号都不注册
- 所以哪怕你改
php.ini加extension=php_mysql.dll,也毫无作用——这个 so/dll 文件在 PHP 7+ 里早就没了
常见误判:以为只是“扩展没启用”
很多人看到报错第一反应是去宝塔或 XAMPP 里勾选“MySQL 扩展”,结果发现列表里根本没有 mysql 这一项。原因很直接:
- PHP 7.0+ 的扩展列表里只有
mysqli和pdo_mysql -
mysql扩展对应的php_mysql.dll(Windows)或mysql.so(Linux)在 PHP 源码中已被永久剔除 - 试图从 PHP 5.6 环境复制该文件到 PHP 7.4 下,会导致
PHP Warning: PHP Startup: Unable to load dynamic library或直接启动失败
替换时最容易漏掉的三个硬性约束
就算你把 mysql_connect() 替成 mysqli_connect(),旧代码大概率仍会报错,因为接口行为有三处关键差异:
立即学习“PHP免费学习笔记(深入)”;
-
mysqli_connect()第四个参数直接传数据库名(如mysqli_connect($host, $user, $pass, $dbname)),不再需要单独调mysqli_select_db() - 所有后续查询必须显式传入连接句柄,例如
mysqli_query($link, $sql);漏传会报mysqli_query() expects parameter 1 to be mysqli, boolean given -
mysql_fetch_array()改成mysqli_fetch_array($result)即可,但前提是$result必须来自mysqli_query()的返回值——旧代码里常把mysql_query()返回的 resource 直接当$link用,这在 mysqli 下完全无效
别碰 PDO 的“快速替换”陷阱
看到 PDO::__construct() 参数和 mysql_connect() 类似,就批量替换成 new PDO(...)?小心踩坑:
-
new PDO()成功不代表连接有效,它默认静默失败;必须手动设PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION才能捕获错误 - 老系统大量使用字符串拼接 SQL,直接套
PDO::query()会丢失原始 SQL 上下文,出错时根本不知道哪条语句崩了 -
PDO默认返回关联数组,而旧代码可能依赖mysql_fetch_array()的数字索引行为,不加PDO::FETCH_BOTH会引发数组键名错乱
真正卡住人的从来不是“怎么写新代码”,而是旧逻辑里那些隐含依赖——比如某个 mysql_query() 调用其实靠的是上一个 mysql_connect() 创建的隐式连接,而 mysqli 不支持这种全局状态。这种细节不逐行核对,光换函数名只会让错误从 undefined function 变成更难定位的 mysqli_fetch_array() expects parameter 1 to be mysqli_result。



















