如何在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
相关产品推荐
相关产品推荐

