php搜索无结果需判断结果集是否为空而非仅检查查询执行成功,应使用pg_num_rows、mysqli_num_rows或rowcount();模糊查询须用预处理防注入,中文需utf8mb4字符集,多字段匹配用or,无结果时主动提示。

PHP搜索无结果,不是代码没跑起来,而是查到了“空”,但程序没察觉、也没反馈。加模糊查询本身不能解决“无结果不提示”问题,关键在结果存在性判断——得让代码真正“看见”有没有数据。
先确认SQL是否真返回了空结果
很多情况是SQL语法没错、连接正常、pg_query()或mysqli_query()返回了资源,但结果集里一条记录都没有。这时候用 if ($ret) 只能判断“执行成功”,不能判断“有数据”。必须额外检查行数或遍历状态。
- PostgreSQL:用
pg_num_rows($ret)判断是否大于 0 - MySQLi:用
mysqli_num_rows($result) - PDO:用
$stmt->rowCount()
模糊查询要防注入,别拼字符串
用户输入直接塞进 LIKE '%{$kw}%' 是高危操作。哪怕加了 htmlspecialchars() 或 addslashes(),也拦不住SQL注入——这两个函数根本不是为防SQL注入设计的。
- 必须用预处理语句:PDO 的
prepare()+execute(['%' . $kw . '%']),或 MySQLi 的bind_param("s", $search) - 通配符 % 要拼在绑定值里,而不是写死在 SQL 字符串中
- 中文搜索记得确认字段是
utf8mb4字符集 +utf8mb4_unicode_ci排序规则,否则 LIKE ‘%张%’ 可能查不到
多字段模糊匹配,逻辑别写成 AND
想在 title 和 content 两个字段里任一匹配关键词,写成 WHERE title LIKE ? AND content LIKE ? 就错了——这要求同一行两个字段都含关键词。
- 正确写法是用 OR:
WHERE title LIKE ? OR content LIKE ? - ThinkPHP 中可用
where('title|content', 'like', "%{$kw}%")(竖线表示 OR) - 原生 SQL 若字段类型不一致(如 TEXT vs VARCHAR),建议显式加
COLLATE utf8mb4_unicode_ci避免隐式转换失败
无结果时,页面别留白
查完数据后,不要只靠循环渲染。循环一次都不执行,页面就空着——用户不知道是卡了、没网,还是真没结果。
- 加一个标志变量,比如
$hasResults = false - 在
while或foreach里设为true - 循环结束后,用
if (!$hasResults)输出 “未找到相关内容” 或类似提示 - 前端可配合 CSS 居中、加图标,提升体验
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











