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

如何组合多个PHP筛选器?实现曲谱流派与乐器双重筛选

实现流派+乐器组合筛选方案

一、重构筛选表单

把原来的多提交按钮改成流派单选组+乐器单选组,让用户能同时选择两个筛选条件后统一提交:

<form method="post" id="filter">
    <!-- 流派筛选区域 -->
    <div class="filter-group">
        <label>流派:</label>
        <input type="radio" name="genre" value="Alle" checked> 全部
        <input type="radio" name="genre" value="Movies"> 电影
        <input type="radio" name="genre" value="Christmas"> 圣诞
        <input type="radio" name="genre" value="Folk"> 民谣
        <input type="radio" name="genre" value="Classic"> 古典
        <input type="radio" name="genre" value="Funk"> 放克
        <input type="radio" name="genre" value="Pop"> 流行
        <input type="radio" name="genre" value="Romantic"> 浪漫
        <input type="radio" name="genre" value="Baroque"> 巴洛克
    </div>

    <!-- 乐器筛选区域 -->
    <div class="filter-group">
        <label>乐器:</label>
        <input type="radio" name="instrument" value="Alle" checked> 全部
        <input type="radio" name="instrument" value="Piano"> 钢琴
        <input type="radio" name="instrument" value="Violin"> 小提琴
        <!-- 这里根据数据库中的乐器类型添加更多选项 -->
    </div>

    <input type="submit" value="筛选" class="filter_button"/>
</form>

二、优化PHP查询逻辑

放弃原来“查全量再循环判断”的低效写法,改成动态构建SQL条件,直接查询符合组合筛选要求的数据:

<?php
// 初始化筛选条件数组和参数数组
$conditions = [];
$params = [];

// 处理流派筛选
if (isset($_POST['genre']) && $_POST['genre'] !== 'Alle') {
    $conditions[] = '`sheets_genre` = ?';
    $params[] = $_POST['genre'];
}

// 处理乐器筛选
if (isset($_POST['instrument']) && $_POST['instrument'] !== 'Alle') {
    $conditions[] = '`sheets_instrument1` = ?';
    $params[] = $_POST['instrument'];
}

// 构建基础查询语句,用显式JOIN替代旧写法更清晰
$query = 'SELECT `sheets_title`, `sheets_composer`, `sheets_genre`, `sheets_instrument1`, `sheets_arrangement` 
          FROM `imslp_sheets` 
          JOIN `imslp_genre` ON `sheets_genre_ID` = `genre_ID`';

// 拼接WHERE条件(多个条件用AND连接,自然实现组合筛选)
if (!empty($conditions)) {
    $query .= ' WHERE ' . implode(' AND ', $conditions);
}

// 使用预处理语句防止SQL注入
$stmt = $conn->prepare($query);
if (!empty($params)) {
    // 绑定参数,这里假设所有参数都是字符串类型,可根据实际字段类型调整
    $types = str_repeat('s', count($params));
    $stmt->bind_param($types, ...$params);
}
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $thisTitle = $row['sheets_title'];
        $thisComposer = $row['sheets_composer'];
        $thisGenre = $row['sheets_genre'];
        $thisInstrument = $row['sheets_instrument1'];
        $thisArrangement = $row['sheets_arrangement'];

        if (strlen($thisComposer) > 23) {
            $thisComposer = substr($thisComposer, 0, 23) . '...';
        }

        // 直接输出符合条件的结果
        echo "
            <h2>$thisComposer</h2>
            <p>$thisTitle - $thisGenre - $thisInstrument</p>
        ";
    }
} else {
    echo "<p>没有找到符合条件的曲谱</p>";
}
$stmt->close();
?>

三、核心优势说明

  • 组合筛选自动生效:流派和乐器条件用AND连接,选「圣诞」+「钢琴」就能直接返回同时满足的结果
  • 性能更优:只查询符合条件的数据,避免全表查询后循环判断的冗余操作
  • 安全性更高:用预处理语句绑定参数,彻底避免SQL注入风险
  • 扩展性强:后续加新的流派/乐器,只需在表单加对应选项,PHP逻辑无需大幅修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:05:21