如何在 PHP 中实现 SQL 查询:同时支持按歌曲名或歌曲编号模糊搜索

作者:袖梨 2026-06-24

本文介绍如何修改 PHP + PDO 查询语句,使单个搜索框能同时匹配数据库中歌曲的标题(title)和编号(number)字段,通过 OR 条件与参数化绑定安全实现双条件模糊检索。

本文介绍如何修改 php + pdo 查询语句,使单个搜索框能同时匹配数据库中歌曲的标题(title)和编号(number)字段,通过 `or` 条件与参数化绑定安全实现双条件模糊检索。

要让一个 SQL 查询同时支持按“歌曲名”或“歌曲编号”进行模糊搜索,核心在于使用 OR 逻辑连接两个 LIKE 条件,并确保 PHP 中正确绑定两个命名参数。原始代码仅查询 number 字段,需扩展为覆盖 title 和 number 两字段,且必须避免拼接用户输入导致 SQL 注入。

以下是优化后的完整 PHP 示例(含安全处理与结构化输出):

<?phprequire_once '../config.php';if (isset($_POST['query']) && !empty(trim($_POST['query']))) {    $inpText = trim($_POST['query']);    // ✅ 使用 OR 连接两个 LIKE 条件,支持 title 或 number 匹配    $sql = "SELECT id, title, number, chord             FROM Song             WHERE title LIKE :keyword OR number LIKE :keyword";    $stmt = $conn->prepare($sql);    $stmt->execute(['keyword' => '%' . $inpText . '%']);    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);    echo '<table border="1" class="search-result">';    if ($result) {        foreach ($result as $row) {            echo "<tr>";            echo "<td><a href='page/details.php?id={$row['id']}'>{$row['title']}</a></td>";            echo "<td>{$row['number']}</td>";            echo "<td>{$row['chord']}</td>";            echo "</tr>";        }    } else {        echo "<tr><td colspan='3' style='text-align:center;'>未找到匹配的歌曲</td></tr>";    }    echo '</table>';} else {    echo '<p style="color:#666;">请输入关键词进行搜索。</p>';}?>

关键改进说明:

  • 统一参数复用:使用同一个占位符 :keyword 同时匹配 title 和 number,简化绑定逻辑,避免冗余参数(原答案中误写为 :number 和 :title 两个不同参数,实际单输入场景下应共用同一值);
  • 输入校验与清理:添加 trim() 和 !empty() 判断,防止空搜索触发全表扫描;
  • PDO 安全绑定:始终通过 execute() 传入参数,杜绝字符串拼接,有效防御 SQL 注入;
  • 健壮性增强:增加空结果提示、HTML 结构完整性(如 colspan)、基础样式建议;
  • ⚠️ 注意事项
    • 若未来需支持“仅按标题”或“仅按编号”的高级筛选,可引入额外表单字段(如 <select name="filter">),再动态构建 SQL;
    • LIKE '%...%' 在大数据量时可能影响性能,必要时可为 title 和 number 字段添加前缀索引(如 INDEX idx_title (title(50)));
    • 避免在生产环境直接输出未过滤的 $row['chord'] 等字段,如有 HTML 内容风险,建议使用 htmlspecialchars() 转义。

该方案简洁、安全、可维护,是 PHP+MySQL 模糊多字段搜索的标准实践。

立即学习“PHP免费学习笔记(深入)”;

相关文章

精彩推荐