为何PHP过滤SQL数据仅在全用或不用所有筛选器时生效?
问题根源与修复方案
你的代码逻辑本身没问题,但筛选器变量的赋值判断逻辑有误,导致了不符合预期的结果:
问题分析
HTML下拉菜单即使未选择有效选项(比如默认的空值选项),$_POST中依然会存在对应的键,只是值为空字符串。而你用isset()判断时,只要键存在就会返回true,这时候没选的筛选器会被赋值为空字符串,而非你预期的null。
你的if条件里用的是严格相等判断$xxxFilter === null,空字符串和null是严格不相等的,所以当只选部分筛选器时:
- 未选的筛选器变量是空字符串,
$xxxFilter === null不成立 - 同时
$row['xxx'] === $xxxFilter(空字符串)也不成立 - 最终整个
if条件为false,没有数据被加入$data
只有当三个筛选器全选(三个条件都匹配),或者全不选(三个筛选器变量都是null,所有条件都成立)时,if才会生效,这就是你看到的现象。
修复代码
把筛选器的赋值逻辑改成检查提交的值是否为有效非空值,而不是仅检查键是否存在:
$data = []; // 改用!empty()判断,空字符串会被判定为empty,赋值为null $jobFilter = !empty($_POST['jobsToFilter']) ? $_POST['jobsToFilter'] : null; $departmentFilter = !empty($_POST['departmentsToFilter']) ? $_POST['departmentsToFilter'] : null; $locationFilter = !empty($_POST['locationsToFilter']) ? $_POST['locationsToFilter'] : null; while ($row = mysqli_fetch_assoc($result)) { if (($jobFilter === null || $row['jobTitle'] === $jobFilter) && ($departmentFilter === null || $row['department'] === $departmentFilter) && ($locationFilter === null || $row['location'] === $locationFilter)) { array_push($data, $row); } }
如果需要更严格的判断(比如排除空格等无效值),也可以这样写:
$jobFilter = isset($_POST['jobsToFilter']) && trim($_POST['jobsToFilter']) !== '' ? $_POST['jobsToFilter'] : null;
额外说明
如果你的HTML下拉菜单默认选项是类似<option value="">请选择</option>的形式,上面的修复就能让未选择有效选项的筛选器被设为null,符合你原本的逻辑:未选择的筛选器不参与过滤,只要已选的筛选器匹配对应字段,就将数据加入$data。
内容的提问来源于stack exchange,提问作者Yellownote
相关产品推荐
相关产品推荐

