PHP基于GET参数按面积价格过滤项目列表的逻辑问题
故障原因
- 逻辑判断顺序错误:当前代码的分支判断逻辑仅优先校验「四参数全传且全部满足」的场景,只要该场景不命中,后续的单参数判断分支会直接忽略其他维度的过滤条件,比如同时传入面积下限和价格上限时,只要项目满足面积下限,哪怕价格超出上限也会被判定为显示,这是多参数组合过滤失效的核心原因。
- 参数类型不匹配:面积、价格都是数值类型,你使用
$sanitizer->text()处理参数得到的是字符串,做大小比较时会触发字符串规则(例如字符串层面"100" < "20"判定为真),进一步导致判断异常。
修复方案
调整判断逻辑,先分别校验面积、价格两个维度的合法性,只要两个维度同时满足过滤要求就展示项目,否则隐藏,同时将参数转换为数值类型:
<?php // 改用数值类 sanitizer 方法,确保参数为数字类型 $min_quadrature = $sanitizer->float($input->get->min_quadrature); $max_quadrature = $sanitizer->float($input->get->max_quadrature); $min_price = $sanitizer->float($input->get->min_price); $max_price = $sanitizer->float($input->get->max_price); ?> <div class="gallery-items four-columns grid-small-pad"> <?php foreach($pages->find("parent=projects") as $parent): ?> <?php // 初始化两个维度的校验结果为合法 $quadrature_valid = true; $price_valid = true; // 单独校验面积维度 if (!empty($min_quadrature) && $parent->quadrature < $min_quadrature) { $quadrature_valid = false; } if (!empty($max_quadrature) && $parent->quadrature > $max_quadrature) { $quadrature_valid = false; } // 单独校验价格维度 if (!empty($min_price) && $parent->price < $min_price) { $price_valid = false; } if (!empty($max_price) && $parent->price > $max_price) { $price_valid = false; } // 两个维度都合法才展示 $show = $quadrature_valid && $price_valid ? "d-block" : "d-none"; ?> <div class="gallery-item projects <?= $show; ?>" data-budget="<?= $parent->price; ?>" data-quadrature="<?= $parent->quadrature; ?>"> <div class="grid-item-holder"> <?php $image = $parent->background; $thumb = $image->size(300, 170); ?> <img src="<?= $thumb->url; ?>" alt=""> <div class="port-desc-holder"> <div class="port-desc"> <div class="grid-item mt-2"> <h3 class="m-0"><a href="<?= $parent->url; ?>"><?= $parent->title; ?></a></h3> <p class="price d-none"><?= $parent->price; ?></p> <p class="quadrature p-0 m-0"><?= $parent->quadrature; ?> m2</p> </div> </div> </div> </div> </div> <?php endforeach ?> </div>
修复后的逻辑支持任意参数组合的过滤场景:单参数过滤、面积区间/价格区间单独过滤、面积+价格组合过滤都可以正常生效。
内容的提问来源于stack exchange,提问作者Elexer
相关产品推荐
相关产品推荐

