
本文讲解如何修改 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 require_once '../config.php';
if (isset($_POST['query'])) {
$inpText = trim($_POST['query']);
// 防空处理:若输入为空,跳过查询或返回空结果
if (empty($inpText)) {
echo '<table><tr><td>请输入搜索关键词</td></tr>';
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 '
| {$row['title']} | "; echo "{$row['number']} | "; echo "{$row['chord']} | "; echo "
| 未找到匹配的歌曲 | ||
✅ 关键注意事项:
- 始终使用 trim() 清理用户输入,避免因空格导致意外匹配;
- 使用 PDO::FETCH_ASSOC 明确获取关联数组,提升可读性与健壮性;
- 表格结构建议补充 或响应式类(如 Bootstrap),但本例聚焦核心逻辑;
- 严禁拼接 SQL 字符串(如 "WHERE title LIKE '%" . $_POST['query'] . "%'"),以防 SQL 注入——PDO 的预处理机制正是为此而设;
- 如需更高阶功能(如优先级排序、全文索引支持),后续可引入 MATCH ... AGAINST 或 ORDER BY CASE WHEN 优化相关性。
通过以上改造,一个简洁、安全、可维护的双字段搜索功能即可上线。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











