在使用 PHP 操作 MySQL 数据库时,mysqli 扩展是常用的选择。执行查询后,通常会得到一个 mysqli_result 对象,但很多开发者会忽略一个重要环节:判断查询结果是否为空。本文将详细讲解如何判断并正确处理查询结果为空的情况。
我们先来看一个简单的查询例子:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
die("连接失败: " . $mysqli->connect_error);
}
$sql = "SELECT * FROM users WHERE status = 'active'";
$result = $mysqli->query($sql);
if (!$result) {
die("查询失败: " . $mysqli->error);
}
// 这里是关键部分:检查是否有结果行
if ($result->num_rows === 0) {
echo "没有找到符合条件的用户。";
} else {
while ($row = $result->fetch_assoc()) {
echo "用户名: " . htmlspecialchars($row['username']) . "<br>";
}
}
$result->free();
$mysqli->close();
?>
1?? 检查 $result 是否为 false
这表示 SQL 查询语句本身出错,例如语法错误或表不存在。使用:
if (!$result) {
// 查询失败,处理错误
}
2?? 检查 $result->num_rows
查询成功但没有匹配行时,num_rows 为 0。使用:
if ($result->num_rows === 0) {
// 查询为空,处理无结果情况
}
3?? 避免直接用 fetch_assoc() 判断空结果
很多人直接用:
if ($row = $result->fetch_assoc()) { ... }
这种方式如果没有结果不会进入循环,但无法显式区分是“空结果”还是“有行但没满足条件”。推荐显式检查 num_rows。
在实际项目中,直接输出“没有结果”是不够的。你可以根据场景进行优化,比如:
返回一个友好的提示页面;
记录日志方便后期分析;
跳转到其他页面,比如:
if ($result->num_rows === 0) {
header("Location: https://m66.net/no-results.html");
exit;
}