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

如何在MySQL查询中实现多条件动态过滤(兼容遗留系统)

解决方法

核心问题是原查询用固定的AND/OR组合,无法根据过滤器是否有值动态调整条件。正确的做法是动态构建WHERE子句,只包含有实际输入值的过滤条件:

步骤1:转义变量防止SQL注入(必须操作)

由于使用mysql扩展,先对每个过滤变量做转义,避免注入风险:

$dev_name = mysql_real_escape_string($dev_name);
$stdev_location_name = mysql_real_escape_string($stdev_location_name);
$dev_serial = mysql_real_escape_string($dev_serial);

步骤2:动态生成过滤条件

初始化空数组,仅将有有效值的过滤条件加入:

$conditions = array();

// 设备名过滤:下拉选择有效值时加入
if (!empty($dev_name)) {
    $conditions[] = "dev_name LIKE '%{$dev_name}%'";
}

// 位置名过滤:下拉选择有效值时加入
if (!empty($stdev_location_name)) {
    $conditions[] = "stdev_location_name LIKE '%{$stdev_location_name}%'";
}

// 序列号过滤:输入框有内容时加入
if (!empty($dev_serial)) {
    $conditions[] = "dev_serial LIKE '%{$dev_serial}'";
}

步骤3:拼接完整SQL语句

根据条件数组是否为空,决定是否添加WHERE子句:

$sql = "SELECT * FROM stdevice
    JOIN stlocation ON stdevice.location = stlocation.stdev_id
    JOIN device_name ON stdevice.dev_id = device_name.dev_id";

if (!empty($conditions)) {
    $sql .= " WHERE " . implode(" AND ", $conditions);
}

$count_item = mysql_query($sql);
$count = mysql_num_rows($count_item);

原方法失效原因

  • 固定AND写法:若过滤器为空(如下拉未选),条件会变成dev_name LIKE '%%',若下拉默认值不是空字符串(如占位符),会导致匹配失败;且固定AND会强制所有条件生效,哪怕是空条件。
  • 改成OR的问题:会匹配满足任意一个条件的数据,不符合“同时满足已填过滤器”的需求。

额外适配说明

如果下拉框默认值是"请选择"这类占位符,需在判断时排除无效值:

// 示例:排除下拉默认值"请选择"
if ($dev_name !== "请选择" && !empty($dev_name)) {
    $conditions[] = "dev_name LIKE '%{$dev_name}%'";
}

内容的提问来源于stack exchange,提问作者Thepersona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:25:01