PHP开发遇Uncaught Error: Call to undefined function mysql_query()错误求建议
解决Fatal Error: Call to undefined function mysql_query()的问题
这个错误的核心原因很明确:PHP 7及更高版本已经彻底移除了旧的mysql_*系列函数——这些函数早在PHP 5.5就被标记为废弃,现在完全不能用了,必须切换到MySQLi或PDO扩展。
你提到尝试用MySQLi但没解决问题,大概率是转换过程中没注意到函数参数、连接方式的差异。结合你的代码,给你具体的分步修改方案:
1. 修正数据库连接代码
旧的mysql_connect()和mysql_select_db()要替换成MySQLi的写法,而且要保留连接对象(MySQLi的绝大多数函数都需要这个对象作为参数):
// 原旧代码 // $link = mysql_connect($dbhost, $dbuser, $dbpass); // mysql_select_db($dbname); // 替换为MySQLi面向过程写法 $link = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); // 检查连接是否成功 if (!$link) { die("数据库连接失败: " . mysqli_connect_error()); } // 建议设置字符集 mysqli_set_charset($link, "utf8mb4");
2. 替换所有mysql_query()调用
注意!mysqli_query()的参数顺序和mysql_query()正好相反:第一个参数是数据库连接对象,第二个才是SQL语句。比如:
// 原旧代码 // $result = mysql_query("SELECT * FROM categories WHERE parent_id = 0"); // 替换为MySQLi写法 $result = mysqli_query($link, "SELECT * FROM categories WHERE parent_id = 0");
3. 调整结果集读取函数
原来的mysql_fetch_assoc()、mysql_num_rows()等也要换成对应的MySQLi函数,并且传入结果集(或连接对象,视函数而定):
// 原旧代码 // while ($row = mysql_fetch_assoc($result)) { ... } // 替换为MySQLi写法 while ($row = mysqli_fetch_assoc($result)) { // 你的数据处理逻辑 } // 如果需要获取行数 // 原旧代码: $count = mysql_num_rows($result); $count = mysqli_num_rows($result);
4. 错误处理的更新
原来的mysql_error()要换成mysqli_error($link),因为需要指定连接对象:
// 原旧代码 // echo mysql_error(); // 替换为MySQLi写法 echo mysqli_error($link);
额外推荐:考虑切换到PDO
如果你的项目有重构空间,更推荐使用PDO——它支持多种数据库,预处理语句能更安全地防止SQL注入,代码也更简洁。举个简单的例子:
try { $pdo = new PDO("mysql:host=$dbhost;dbname=$dbname;charset=utf8mb4", $dbuser, $dbpass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 查询示例 $stmt = $pdo->query("SELECT * FROM categories WHERE parent_id = 0"); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // 处理数据 } } catch(PDOException $e) { die("数据库错误: " . $e->getMessage()); }
最后提醒:修改时要逐个检查所有使用mysql_*函数的地方,不要遗漏;修改完成后务必测试每个数据库操作的场景,确保功能正常。
内容的提问来源于stack exchange,提问作者Safi Alsafi
相关产品推荐
相关产品推荐

