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

实现多条件搜索筛选有没有更简便方法?如何替代大量switch语句?

多条件搜索switch语句优化方案

你当前穷举所有筛选组合写switch的写法逻辑上没问题,但完全没有可维护性,随着筛选条件增加代码量会指数级上涨,完全可以通过动态拼接SQL+公共渲染逻辑把代码压缩到几十行。

具体实现步骤

  1. 先统一接收并格式化表单提交的所有参数
// 接收参数统一转成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'];
  1. 初始化SQL基础结构、预处理参数容器
// 基础SQL语句,加1=1是为了后续拼接条件不用判断是否是第一个条件
$sql = "SELECT * FROM autori WHERE 1=1";
$paramTypes = ''; // 预处理参数类型,所有参数都是int所以统一存i
$params = []; // 存要绑定的参数值
  1. 逐个判断筛选条件,动态拼接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";
// }
  1. 执行预处理查询,统一渲染结果
// 初始化预处理语句
$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 13:57:02