mysqli_query返回空结果需区分查询失败(返回FALSE,用mysqli_error查看错误)和查到0行(返回结果集但mysqli_num_rows为0);正确判断需先检查查询是否成功,再检查行数。

mysqli_query 返回空结果的常见原因
查不到数据不等于出错,mysqli_query 即使 SQL 语法正确、连接正常,也可能返回 FALSE 或空结果集。关键要区分:是查询失败(FALSE),还是查到了 0 行(mysqli_num_rows === 0)。
-
mysqli_query执行失败时返回FALSE,此时应立刻用mysqli_error($conn)看报错,比如表名写错、字段不存在、权限不足 - 执行成功但没匹配到记录,
mysqli_query返回有效结果集,只是mysqli_num_rows($result) === 0 - 忘记调用
mysqli_fetch_assoc()或类似函数,直接打印$result看起来像“空”,其实是资源类型,不是空数组
判断空结果的正确写法(mysqli 面向过程)
不能只靠 if (!$result),必须分两层检查:先看查询是否成功,再看是否有数据。
if (!$result = mysqli_query($conn, "SELECT * FROM users WHERE id = 123")) {
die("查询失败:" . mysqli_error($conn));
}
if (mysqli_num_rows($result) === 0) {
echo "未找到用户";
} else {
$row = mysqli_fetch_assoc($result);
echo "用户名:" . htmlspecialchars($row['name']);
}
PDO 查询为空时的处理要点
PDO 默认不抛异常,$stmt->execute() 成功后,要用 $stmt->rowCount() 判断行数,而不是检查语句对象本身是否为 false。
-
$stmt->fetch()查无结果时返回FALSE,不是空数组 —— 这是初学者最常误判的地方 - 用
$stmt->fetchAll()会返回空数组[],适合批量场景;但单条查询建议用fetch()+ 显式判断 - 开启异常模式(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)可让错误中断流程,避免漏检语法错误
$stmt = $pdo->prepare("SELECT name FROM users WHERE id = ?");
$stmt->execute([123]);
if ($stmt->rowCount() === 0) {
echo "用户不存在";
} else {
$user = $stmt->fetch();
echo "欢迎," . htmlspecialchars($user['name']);
}
调试时容易忽略的细节
空结果经常不是逻辑问题,而是环境或数据问题。别急着改代码,先确认这些:
立即学习“PHP免费学习笔记(深入)”;
- SQL 里用了
WHERE name = '张三',但数据库存的是'张三 '(带空格)或全角字符,用SELECT HEX(name)看真实字节 - 时间字段比较出错,比如 PHP 用
date('Y-m-d')拼字符串,而 MySQL 字段是DATETIME类型,导致隐式转换失败 - 连接了错误的数据库(
mysqli_select_db()没生效,或 PDO DSN 写错dbname=),查的是空库 - 用了
mysqli_real_escape_string()但没传连接句柄,导致转义失败,SQL 被截断
查不到数据时,先把原始 SQL 复制出来,在 phpMyAdmin 或命令行里手动执行一遍 —— 这比在代码里加十次 var_dump 更快定位问题。











