You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据传入的星级数组动态调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:15:07