实现多条件搜索筛选有没有更简便方法?如何替代大量switch语句?
多条件搜索switch语句优化方案
你当前穷举所有筛选组合写switch的写法逻辑上没问题,但完全没有可维护性,随着筛选条件增加代码量会指数级上涨,完全可以通过动态拼接SQL+公共渲染逻辑把代码压缩到几十行。
具体实现步骤
- 先统一接收并格式化表单提交的所有参数
// 接收参数统一转成int,避免异常值 $ordine = (int)$_POST['ordine']; $epoca = (int)$_POST['epoca']; $movimento = (int)$_POST['movimento']; $letteratura_ita = (int)$_POST['letteratura_ita']; $letteratura_estero = (int)$_POST['letteratura_estero'];
- 初始化SQL基础结构、预处理参数容器
// 基础SQL语句,加1=1是为了后续拼接条件不用判断是否是第一个条件 $sql = "SELECT * FROM autori WHERE 1=1"; $paramTypes = ''; // 预处理参数类型,所有参数都是int所以统一存i $params = []; // 存要绑定的参数值
- 逐个判断筛选条件,动态拼接SQL
// 处理年代筛选 if ($epoca > 0) { $sql .= " AND epoca = ?"; $paramTypes .= 'i'; $params[] = $epoca; } // 处理文学流派筛选 if ($movimento > 0) { $sql .= " AND movimento = ?"; $paramTypes .= 'i'; $params[] = $movimento; } // 处理意大利文学筛选 if ($letteratura_ita === 1) { $sql .= " AND letteratura_ita = 1"; } // 处理外国文学筛选 if ($letteratura_estero === 1) { $sql .= " AND letteratura_estero = 1"; } // 处理排序规则 if ($ordine === 1) { $sql .= " ORDER BY cognome ASC"; } elseif ($ordine === 2) { $sql .= " ORDER BY cognome DESC"; } // 可选:加默认排序,比如没有选排序规则时按id正序 // else { // $sql .= " ORDER BY idautore ASC"; // }
- 执行预处理查询,统一渲染结果
// 初始化预处理语句 $stmt = mysqli_prepare($conn, $sql); // 有参数的话绑定参数 if (!empty($params)) { mysqli_stmt_bind_param($stmt, $paramTypes, ...$params); } // 执行查询 mysqli_stmt_execute($stmt); // 获取结果集 $risultato = mysqli_stmt_get_result($stmt); // 公共渲染逻辑,只写一次就行 while ($autore = mysqli_fetch_assoc($risultato)) { echo "<table border='1' class='autori'>\n"; $idautore = $autore["idautore"]; echo '<td><img src="data:image/jpeg;base64,' . base64_encode($autore['img']) . '" width="200" height="200"/> </td>'; echo "<tr>\n"; echo "<td> {$autore['nome']} {$autore['cognome']} </td>"; echo "</tr>\n"; echo "<tr>\n"; echo "<td> {$autore['descrizione_breve']} </td>"; echo "</tr>\n"; echo "</table>\n"; } // 关闭连接 mysqli_close($conn);
注意事项
- 上面的SQL条件里的字段名(比如
epoca、movimento、letteratura_ita)需要和你实际数据库表的字段名对应调整即可 - 用预处理语句绑定参数的写法完全避免了SQL注入风险,比直接拼接用户输入的字符串更安全
- 后续如果新增筛选条件,只需要加一段对应的条件判断拼接逻辑即可,不需要穷举所有组合
内容的提问来源于stack exchange,提问作者Giujitsu
相关产品推荐
相关产品推荐

