PHP 5.3 中 mysql_* 扩展空结果返回 false 而非空数组,需用 $row === false 判断;mysql_num_rows() 不可靠,应以 fetch 循环是否执行来判断有无数据;建议尽快迁移到 mysqli 或 PDO。

PHP 5.3 环境下若仍在使用已废弃的 mysql_* 扩展(如 mysql_query、mysql_fetch_array),遇到“查询结果为空却没报错、逻辑走偏”的问题,核心在于:该扩展对空结果集的返回值设计与现代习惯不符,且不提供行数预检机制。
mysql_fetch_array() 空结果永远返回 false,不是空数组
这是最易踩坑的一点。当 SELECT 没查到任何记录时,mysql_fetch_array($result) 直接返回布尔值 false,而非 [] 或 null。
错误写法:
if (empty($row)) { /* 误判:false 和空字符串、0 都被判定为 true */ }
正确写法:
if ($row === false) { /* 明确判断 false */ }
或
if (!$row && $row !== 0 && $row !== '0') { /* 仅当字段不含数字 0 时可用 */ }
不能依赖 mysql_num_rows() 判断是否为空
在 PHP 5.3 + mysql_* 扩展中:
• mysql_num_rows($result) 对未缓冲结果集(即未显式调用 mysql_store_result())可能返回 0,即使后续还能 fetch;
• 更关键的是,$result 本身只要查询语法正确就非 false,mysql_query() 成功后必须手动 fetch 才知道有没有数据。
所以安全流程是:
• 先检查 $result 是否为 false(语法/权限错误);
• 再循环 mysql_fetch_array(),靠其返回值终止;
• 不要先查 mysql_num_rows() 再决定是否 fetch —— 多余且不可靠。
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
空结果场景下的典型处理结构
以下代码适配 PHP 5.3 及 mysql_* 扩展,兼顾可读与健壮性:
- 执行查询后立即用
or die(mysql_error())捕获语法、连接、权限类错误 - 用
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))遍历 —— 若一次都不进循环,说明无数据 - 若需区分“无数据”和“有数据但字段全空”,应在循环外设标志位:
$found = false;
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$found = true;
echo $row['name'];
}
if (!$found) echo "未找到匹配记录";
立即学习“PHP免费学习笔记(深入)”;
强烈建议的过渡方案
PHP 5.3 虽仍支持 mysql_*,但该扩展已在 PHP 5.5 废弃、PHP 7.0 移除。为避免未来升级崩溃:
- 新项目绝不再用
mysql_*,直接上mysqli或PDO - 旧系统改造时,可封装兼容函数,例如:
function db_fetch_all($result) {
$rows = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$rows[] = $row;
}
return $rows;
}
这样后续替换底层驱动时,业务层改动最小 - 中文乱码等衍生问题,优先确认
mysql_set_charset('utf8', $link)已在连接后调用


















