如何根据传入的星级数组动态调整PHP脚本中的SQL查询条件
问题原因
你当前的逻辑错误点在于使用AND连接多个星级条件,相当于要求单条记录的review_stars同时等于多个选中的数值,不存在符合条件的记录,自然查询结果异常。
修复方案
改用IN操作符实现“匹配任意一个选中星级”的需求,同时增加参数过滤避免SQL注入风险,调整后的代码如下:
// 第一步:过滤传入的星级数组,仅保留1-5的合法值,规避非法参数 $allowStars = ['1','2','3','4','5']; $selectedStars = array_intersect($_GET['stars'], $allowStars); $sql = "SELECT * FROM `reviews` WHERE `review_website_id` = '" . $getQfetch['website_id'] . "' "; // 存在选中星级时拼接IN条件 if (!empty($selectedStars)) { $starCondition = "'" . implode("','", $selectedStars) . "'"; $sql .= " AND `review_stars` IN (" . $starCondition . ")"; } $sql .= " ORDER BY CAST(review_id AS SIGNED) DESC";
逻辑说明
当你选中星级1和5时,代码会自动拼接出AND review_stars IN ('1','5')的条件,等价于AND (review_stars = '1' OR review_stars = '5'),完全符合你的查询需求,任意多选组合都可以正确匹配。
安全优化建议
当前直接拼接变量到SQL语句的写法存在SQL注入风险,生产环境建议改用PDO或MySQLi的预处理语句传参,示例如下:
// 基于PDO预处理的写法 $params = [$getQfetch['website_id']]; $sql = "SELECT * FROM `reviews` WHERE `review_website_id` = ? "; if (!empty($selectedStars)) { // 生成对应数量的占位符 $placeholders = implode(',', array_fill(0, count($selectedStars), '?')); $sql .= " AND `review_stars` IN ($placeholders)"; $params = array_merge($params, $selectedStars); } $sql .= " ORDER BY CAST(review_id AS SIGNED) DESC"; // 执行SQL时传入$params参数即可,无需手动处理转义
内容的提问来源于stack exchange,提问作者JohnBowls
相关产品推荐
相关产品推荐

