如何让searchUser函数在search参数为空时不返回数据?
解决searchUser函数空参数返回全量数据的问题
问题根源在于当$search为空字符串时,拼接后的%$search%会变成%%,而LIKE操作符中%%会匹配所有记录,导致返回数据库全部用户数据。下面提供两种可行的解决方式:
方法一:提前校验参数,直接返回空数组
在执行数据库查询前先检查搜索参数是否为空(使用trim过滤纯空格的情况),如果为空直接返回空数组,避免不必要的数据库请求:
public function searchUser(string $search): array { if (trim($search) === '') { return []; } $sql = $this->pdo->prepare("SELECT user_id, first_name, last_name, avatar FROM user where first_name like :first_name or last_name like :last_name"); $searchParam = "%$search%"; $sql->bindParam(':first_name', $searchParam, PDO::PARAM_STR); $sql->bindParam(':last_name', $searchParam, PDO::PARAM_STR); $sql->execute(); $result = []; while ($row = $sql->fetch()) { $result[] = new Search( $row['user_id'], $row['first_name'], $row['last_name'], $row['avatar'] ); } return $result; }
方法二:修改SQL语句,增加参数非空条件
通过在WHERE子句中添加参数非空的判断,确保只有当搜索参数有效时才执行匹配逻辑:
public function searchUser(string $search): array { $searchParam = "%$search%"; $sql = $this->pdo->prepare("SELECT user_id, first_name, last_name, avatar FROM user WHERE (:search != '' AND (first_name like :first_name or last_name like :last_name))"); $sql->bindParam(':search', $search, PDO::PARAM_STR); $sql->bindParam(':first_name', $searchParam, PDO::PARAM_STR); $sql->bindParam(':last_name', $searchParam, PDO::PARAM_STR); $sql->execute(); $result = []; while ($row = $sql->fetch()) { $result[] = new Search( $row['user_id'], $row['first_name'], $row['last_name'], $row['avatar'] ); } return $result; }
推荐使用方法一,因为提前校验参数可以减少无效的数据库查询,提升接口性能,同时代码逻辑更直观。
内容的提问来源于stack exchange,提问作者netjav
相关产品推荐
相关产品推荐

