如何组合多个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
相关产品推荐
相关产品推荐

