苹果CMS等老系统在XAMPP 5.6+上必报mysql_connect()未定义错误,因PHP 7.0起已彻底移除该函数;应替换为mysqli_connect()并传入数据库名参数,且所有查询须显式传递连接句柄,同时核查XAMPP实际MySQL端口、密码空值语义及配置路径。

直接替换 mysql_connect() 为 mysqli_connect() 或 PDO,否则 PHP 5.5+(尤其是 XAMPP 5.6 起)必然报错且无法运行。
为什么 mysql_connect() 在 XAMPP 里一定报错
不是配置问题,是 PHP 官方彻底废弃了 mysql_* 系列函数:从 PHP 5.5 开始标记为 Deprecated,PHP 7.0 起完全移除。XAMPP 5.6 及之后版本(包括当前主流的 XAMPP 8.x)默认使用 PHP 7.4/8.x,mysql_connect() 函数根本不存在,调用会直接触发 Fatal error: Uncaught Error: Call to undefined function mysql_connect()。
常见错误现象包括:
- 页面空白,无任何输出(PHP 致命错误被静默吞掉)
- Apache 错误日志中出现
PHP Fatal error: Uncaught Error: Call to undefined function mysql_connect() - 苹果CMS、Destoon 等老系统在 XAMPP 上启动即报错,卡在
inc/conn.php或类似数据库连接文件
怎么安全迁移到 mysqli_connect()
最稳妥、改动最小的升级路径是改用面向过程风格的 mysqli —— 它和旧 mysql_* 函数参数顺序、返回逻辑几乎一致,适合快速修复老项目。
原始写法(必挂):
mysql_connect($host, $user, $pass) or die(mysql_error()); mysql_select_db($dbname);
替换成(推荐):
$link = mysqli_connect($host, $user, $pass, $dbname);
if (!$link) {
die('Connect Error: ' . mysqli_connect_error());
}
关键注意点:
-
mysqli_connect()第四个参数直接传库名,不用再单独调mysqli_select_db() - 所有后续查询必须带
$link句柄,如mysqli_query($link, $sql);旧代码里漏传句柄会报mysqli_query() expects parameter 1 to be mysqli, boolean given - 如果原代码用了
mysql_fetch_array(),要同步改为mysqli_fetch_array($result)(无需句柄),但注意结果集变量名需先由mysqli_query()返回
为什么不要用 PDO 快速“替换”
虽然 PDO 更现代、支持多数据库,但它和 mysql_* 的编程模型差异大,**盲目替换容易引入新 bug**:
-
PDO默认不抛异常,new PDO(...)成功不代表连接有效,需手动设PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION - 预处理语句是推荐写法,但老系统大量拼接 SQL 字符串,直接换
PDO::query()会丢失错误上下文,调试困难 - 事务控制(
begin_transaction/commit)、字符集设置(set_charset)等行为与mysqli不同,需逐处校验 - 苹果CMS、DEDECMS 等老系统的扩展类(如
cls_mysql)深度耦合mysql_*,强行塞PDO实例会导致方法签名不匹配
迁移后仍连不上?重点检查这三处
函数换了,但连接失败常因底层配置未同步调整:
- XAMPP 默认 MySQL 端口是
3306,但如果本地已装 MySQL 或端口被占用,XAMPP 实际监听的是3307或3308—— 检查xampp/mysql/bin/my.ini中port=值,并确保mysqli_connect()的$host写成'127.0.0.1:3307'(不能只写'localhost',后者走 socket,可能绕过端口配置) - root 密码为空是 XAMPP 默认,但若你改过密码,
mysqli_connect()的$pass参数必须填对;若留空却提示Access denied for user 'root'@'localhost' (using password: YES),说明配置里误传了非空字符串 - 部分老 CMS(如苹果CMS v7)在
inc/config.php里把数据库密码写成''字符串而非null,而mysqli_connect()对空字符串密码处理更严格,建议显式传null或删掉该参数项
真正麻烦的从来不是函数名替换,而是那些藏在配置路径、端口、密码空值语义里的隐性依赖 —— 改完代码不验证连接细节,90% 会卡在 “函数不报错了,但查不到数据”。


















