
本文介绍如何修改 php + pdo 的 sql 查询,使其能同时根据歌曲名称或编号进行模糊匹配搜索,避免重复编写查询逻辑,并确保参数化防止 sql 注入。
本文介绍如何修改 php + pdo 的 sql 查询,使其能同时根据歌曲名称或编号进行模糊匹配搜索,避免重复编写查询逻辑,并确保参数化防止 sql 注入。
在实际开发中,用户常希望一个搜索框能灵活匹配多个字段(如歌曲名 title 和编号 number),而非仅限单一条件。原始代码仅支持按 number 模糊查询,若要扩展为“任一字段匹配即返回结果”,核心在于重构 SQL 的 WHERE 子句,使用 OR 连接多个 LIKE 条件,并在 PHP 中正确绑定多个占位符参数。
以下是优化后的完整示例代码:
<?php require_once '../config.php';
if (isset($_POST['query']) && !empty(trim($_POST['query']))) {
$inpText = trim($_POST['query']);
// ✅ 使用 OR 实现多字段模糊匹配(title 或 number)
$sql = 'SELECT id, title, number, chord
FROM Song
WHERE title LIKE :title OR number LIKE :number';
$stmt = $conn->prepare($sql);
// ✅ 同时绑定两个参数,值相同(复用同一搜索词)
$stmt->execute([
'title' => '%' . $inpText . '%',
'number' => '%' . $inpText . '%'
]);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo '
| {$row['title']} | "; echo "{$row['number']} | "; echo "{$row['chord']} | "; echo "
| 未找到匹配的歌曲 | ||
请输入搜索关键词
'; } ?>✅ 关键改进说明:
- SQL 层面:WHERE title LIKE :title OR number LIKE :number 允许任一字段包含搜索词即命中;
- 参数绑定:使用关联数组一次性传入 'title' 和 'number' 两个键,值均为 %{$inpText}%,语义清晰且安全;
- 防御性处理:添加 !empty(trim()) 校验,避免空搜索触发全表扫描;
- 前端体验:增加空结果提示与基础样式,提升可用性。
⚠️ 注意事项:
- 若数据量较大,建议为 title 和 number 字段分别建立 FULLTEXT 索引或普通 INDEX,以加速 LIKE '%xxx%' 查询(注意前导通配符会限制索引效率);
- 如需更高精度(如优先匹配标题、再匹配编号),可改用 UNION 或添加 ORDER BY(例如 ORDER BY CASE WHEN title LIKE ? THEN 1 ELSE 2 END);
- 切勿拼接用户输入到 SQL 中——本方案全程使用 PDO 预处理语句,已天然防御 SQL 注入。
通过这一改造,单个搜索框即可智能覆盖多维度检索需求,代码简洁、安全、可维护性强,是 Web 应用中典型的“一搜多域”实践范例。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











