
当搜索关键词为空时,应阻止数据库全表扫描,直接返回空结果(如 null 或空数组),避免性能问题与逻辑错误。
当搜索关键词为空时,应阻止数据库全表扫描,直接返回空结果(如 `null` 或空数组),避免性能问题与逻辑错误。
在 PHP 中实现安全、高效的用户搜索功能时,一个常见但关键的边界处理是:当搜索参数为空字符串时,不应执行模糊查询(否则 LIKE '%' 会匹配所有记录),而应提前终止并返回明确的“无结果”状态。
你当前的 searchUser() 方法声明返回类型为 array,但若传入空字符串,原逻辑会执行 WHERE first_name LIKE '%' OR last_name LIKE '%' —— 这等价于无条件查询,不仅低效,还违背业务意图(空搜索 ≠ 查所有用户)。正确做法是在 SQL 执行前进行参数校验,并统一返回语义清晰的结果。
✅ 推荐改进方案(类型安全 + 语义清晰)
public function searchUser(string $search): array
{
// 步骤1:空值/空白字符防护(trim 防止仅含空格的输入)
if (trim($search) === '') {
return []; // 明确返回空数组,保持类型一致性
}
// 步骤2:使用参数化查询防止注入(已正确使用 PDO::PARAM_STR)
$sql = $this->pdo->prepare(
"SELECT user_id, first_name, last_name, avatar
FROM user
WHERE first_name LIKE :search OR last_name LIKE :search"
);
$likePattern = "%{$search}%";
$sql->bindValue(':search', $likePattern, PDO::PARAM_STR);
$sql->execute();
// 步骤3:使用 fetchAll() 简化逻辑,避免手动循环
$rows = $sql->fetchAll(PDO::FETCH_ASSOC);
$results = [];
foreach ($rows as $row) {
$results[] = new Search(
(int)$row['user_id'],
$row['first_name'],
$row['last_name'],
$row['avatar'] ?? null
);
}
return $results;
}
⚠️ 注意事项
-
不要混合返回类型:原答案中改为
array|string并返回'No result'字符串,虽能运行,但破坏了类型契约,易导致调用方需额外判断类型,增加维护成本。PHP 8+ 强烈建议保持返回类型单一且可预测。 -
trim()比== ''更健壮:用户可能输入空格、制表符等空白字符,trim($search) === ''能覆盖此类场景。 -
避免重复变量名:原代码中
$search既作参数又作结果数组,易引发混淆;改用$results提升可读性。 -
性能提示:对
first_name和last_name字段建立联合索引或全文索引(如 MySQL 的FULLTEXT)可显著提升模糊查询效率,但空搜索永远应绕过查询。
✅ 总结
空搜索不是“特殊结果”,而是无效请求。最佳实践是:前置校验 → 快速返回空数组 → 保持类型安全 → 交由上层决定 UI 展示(如显示“未找到用户”)。这样既保障系统健壮性,又符合现代 PHP 的类型设计哲学。











