
本文讲解如何修改 PHP 中的 PDO 查询语句,使单个搜索框能同时匹配数据库中歌曲的标题(title)或编号(number),通过 OR 条件与参数化查询安全实现双字段模糊检索。
本文讲解如何修改 php 中的 pdo 查询语句,使单个搜索框能同时匹配数据库中歌曲的标题(title)或编号(number),通过 `or` 条件与参数化查询安全实现双字段模糊检索。
在实际开发中,用户往往希望用一个搜索框完成多字段检索(例如输入“love”既能查到歌名含“Love Song”的记录,也能查到编号为“102”的歌曲)。原代码仅支持按 number 字段模糊查询,要扩展为支持 title 和 number 双字段联合搜索,核心在于两点:SQL 逻辑改造 和 PHP 参数绑定适配。
首先,修改 SQL 查询语句,使用 OR 连接两个 LIKE 条件,并为每个条件分配独立的命名参数:
SELECT id, title, number, chord FROM Song WHERE number LIKE :number OR title LIKE :title
注意:不能复用同一参数名(如 :number)匹配两个字段,否则 PDO 会报错;必须为每个占位符指定唯一名称。
其次,在 PHP 层同步更新参数绑定逻辑。由于搜索词统一来自 $_POST['query'],我们只需将同一输入值分别赋给 :number 和 :title 两个键:
立即学习“PHP免费学习笔记(深入)”;
<?php
require_once '../config.php';
if (isset($_POST['query'])) {
$inpText = trim($_POST['query']);
// 防空处理:若输入为空,跳过查询或返回空结果
if (empty($inpText)) {
echo '<table><tr><td>请输入搜索关键词</td></tr></table>';
exit;
}
$sql = 'SELECT id, title, number, chord
FROM Song
WHERE number LIKE :number OR title LIKE :title';
$stmt = $conn->prepare($sql);
// 同一搜索词同时用于两个字段的模糊匹配
$stmt->execute([
'number' => '%' . $inpText . '%',
'title' => '%' . $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'>未找到匹配的歌曲</td></tr>";
}
echo '</table>';
}
?>✅ 关键注意事项:
- 始终使用 trim() 清理用户输入,避免因空格导致意外匹配;
- 使用 PDO::FETCH_ASSOC 明确获取关联数组,提升可读性与健壮性;
- 表格结构建议补充 或响应式类(如 Bootstrap),但本例聚焦核心逻辑;
- 严禁拼接 SQL 字符串(如 "WHERE title LIKE '%" . $_POST['query'] . "%'"),以防 SQL 注入——PDO 的预处理机制正是为此而设;
- 如需更高阶功能(如优先级排序、全文索引支持),后续可引入 MATCH ... AGAINST 或 ORDER BY CASE WHEN 优化相关性。
通过以上改造,一个简洁、安全、可维护的双字段搜索功能即可上线。



















