<p>PHP 7.0+ 已彻底移除 mysql_* 系列函数,调用 mysql_connect() 会直接报 Fatal error;验证方式为 php -m | grep mysql 无输出或 phpinfo() 中不显示 mysql 模块。</p>

确认mysql扩展是否已被移除
PHP 7.0起已彻底移除mysql_*系列函数,调用mysql_connect()等会直接报Fatal error: Uncaught Error: Call to undefined function mysql_connect()。运行php -m | grep mysql可验证当前环境是否加载了mysql扩展——结果为空即说明已被禁用或不存在。
更可靠的方式是检查phpinfo()输出页,搜索“mysql”:若只看到“mysqli”和“pdo_mysql”,而无“mysql”模块,则必须切换连接方式。
快速兼容过渡:封装mysqli模拟旧接口
不重写全部代码时,可在入口或公共函数文件中定义兼容层。以下为最小可行封装(适配常见调用):
- 定义
mysql_connect()→ 内部调用mysqli_connect(),并把连接句柄存入$GLOBALS['mysql_link'] - 所有查询函数(如
mysql_query()、mysql_fetch_assoc())均自动读取该全局连接,避免逐处传参 - 对
mysql_real_escape_string(),改用mysqli_real_escape_string($link, $str),注意必须传入有效连接 - 避免使用
mysql_pconnect()——mysqli不支持持久连接语法,应改用连接池或长连接复用策略
重构连接逻辑:转向原生mysqli或PDO
封装只是临时方案,长期需迁移至标准方式。推荐优先使用面向对象的mysqli:
立即学习“PHP免费学习笔记(深入)”;
- 连接时显式指定字符集:
new mysqli($host, $user, $pass, $db, $port, $socket),并在之后执行$mysqli->set_charset('utf8mb4') - 查询后务必检查错误:
if ($mysqli->errno) { error_log("MySQL error: " . $mysqli->error); } - 替换
mysql_num_rows()为$result->num_rows,mysql_insert_id()为$mysqli->insert_id - 若项目已用PDO,统一改为
new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass),并启用异常模式:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
验证连接行为与网络协议
升级后常出现“能连上但查不出数据”或“localhost连不上”,本质是解析逻辑变化:
-
localhost在mysqli中默认走Unix socket;若实际需TCP,显式改用127.0.0.1 - 检查
my.cnf中socket路径是否与PHP中mysqli.default_socket一致,不一致则连接失败 - 通过
netstat -lnp | grep mysql确认MySQL监听的是socket还是TCP端口,再匹配PHP连接参数 - 如遇超时,加
mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 5)控制连接等待上限



















