php查询结果为空时mysqli_fetch_array返回false,需用===false或!$row显式判断,不可用empty();pdo fetch()同样返回false,应结合rowcount()辅助验证;orm如laravel中find()返回null、get()返回空collection需调用isempty()。

PHP 查询结果为空时,不报错也不等于没数据——得主动判断 mysqli_fetch_array、pdo::fetch 或 get_result() 的返回值,否则逻辑会静默走错分支。
查不到数据时 mysqli_fetch_array 返回什么
它返回 false,不是空数组,也不是 null。直接用 empty() 或 is_null() 判断容易漏掉这个 false。
常见错误现象:代码写成 if (empty($row)) { ... },但 $row = false 也会进分支,和“查到空字符串字段”混淆。
- 正确做法是显式比对:
if ($row === false)或if (!$row)(仅当确认不会查到布尔true值时) - 如果用了
mysqli_fetch_all($result, MYSQLI_ASSOC),空结果返回空数组[],这时empty()才安全 - 注意:
mysqli_num_rows($result) === 0可提前判断,但多一次函数调用,且对未缓冲结果集(如MYSQLI_USE_RESULT)可能不适用
PDOStatement::fetch() 空结果的三种常见返回值
取决于 $fetch_style 参数:
立即学习“PHP免费学习笔记(深入)”;
-
PDO::FETCH_ASSOC→ 查无结果时返回false -
PDO::FETCH_NUM→ 同样返回false -
PDO::FETCH_COLUMN→ 若字段本身存的是NULL,也返回false,无法区分“没查到”和“查到 NULL”
所以不能只靠 if (!$row) 判定失败;更稳妥的是结合 rowCount():
$stmt = $pdo->prepare("SELECT name FROM users WHERE id = ?");
$stmt->execute([$id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($stmt->rowCount() === 0) {
// 明确知道没查到
}
注意:rowCount() 对 SELECT 在部分 PDO 驱动(如 MySQL)中可能不可靠,优先用 fetch() 返回值判断,rowCount() 作辅助验证。
ORM 场景下(如 Laravel Eloquent)空结果怎么识别
它把“查不到”包装成 null 或空集合,行为更统一,但也藏了坑:
-
User::find(999)→ 返回null(单条),可直接if (!$user) -
User::where('age', '>', 100)->first()→ 同样返回null -
User::where('active', 1)->get()→ 返回空的Collection,$users->isEmpty()才是正解,empty($users)不行(对象永远非空) - 用
findOrFail()会抛出ModelNotFoundException,适合必须存在的场景,但别滥用——404 不该由数据库层兜底
空结果常被忽略的副作用
最典型的:把 false 当数组用,触发 Warning: Trying to access array offset on value of type bool。
比如这段代码:
$row = mysqli_fetch_array($result); echo $row['name']; // $row 是 false → PHP 8.0+ 直接报错
这类问题在开发环境可能被 error_reporting 掩盖,上线后才暴露。更隐蔽的是时间类字段默认为 '0000-00-00',查出来是字符串,但业务上等同于“空”,需要额外清洗。
真正麻烦的从来不是“怎么判断空”,而是“空之后该返回什么 HTTP 状态、渲染什么 UI、要不要记录日志”。这些得按接口契约来,不能全靠 if (!$row) 一把梭。











