
当用户传入空搜索关键词时,应阻止全表扫描并直接返回空结果(如 null),而非返回全部用户数据;同时需修正函数签名与逻辑,确保类型安全和语义清晰。
当用户传入空搜索关键词时,应阻止全表扫描并直接返回空结果(如 `null`),而非返回全部用户数据;同时需修正函数签名与逻辑,确保类型安全和语义清晰。
在实际开发中,searchUser() 这类查询函数若不对空参数做前置校验,极易引发性能与安全风险:一方面,LIKE '%%' 会匹配所有记录,导致无意义的全表扫描;另一方面,返回全部用户数据可能违反最小权限原则,甚至暴露敏感信息。
正确的做法是在执行 SQL 前严格校验输入——只要 $search 为空字符串(或仅含空白字符),就立即终止查询并返回 null。注意:原答案中返回字符串 'No result' 并不符合函数契约(声明返回 array|string),且违背“空搜索 = 无结果”的语义,更合理的约定是返回 null 或空数组([])。但根据题干明确要求“return none”,即语义上的“无值”,故推荐返回 null,并同步更新返回类型声明为 ?array(PHP 7.1+ 可空类型):
public function searchUser(string $search): ?array
{
// 去除首尾空白并判断是否为空(兼顾空格输入)
if (trim($search) === '') {
return null;
}
$sql = $this->pdo->prepare(
"SELECT user_id, first_name, last_name, avatar
FROM user
WHERE first_name LIKE :search OR last_name LIKE :search"
);
$searchPattern = "%{$search}%";
$sql->bindValue(':search', $searchPattern, PDO::PARAM_STR);
$sql->execute();
$results = [];
while ($row = $sql->fetch()) {
$results[] = new Search(
$row['user_id'],
$row['first_name'],
$row['last_name'],
$row['avatar']
);
}
return $results;
}✅ 关键改进说明:
- 使用
trim($search) === ''更健壮地处理空格输入; - 统一使用
:search单一占位符,避免重复绑定、提升可读性; - 采用
bindValue()替代bindParam()(此处无需引用绑定,值已确定); - 函数签名改为
?array,明确支持null返回值,增强类型安全性; - 移除冗余的
$sql->rowCount()判断,while ($sql->fetch())本身已具备空结果容错能力。
? 调用示例与注意事项:
$result = $userRepo->searchUser(" "); // 返回 null
$result = $userRepo->searchUser("john"); // 返回 Search 对象数组
// 调用方须判空:if ($result !== null) { /* 处理结果 */ }始终将输入校验置于数据库操作之前——这不仅是性能优化,更是构建可靠、可维护 API 的基本准则。

















