
本文介绍如何修改 PHP 中的 PDO 查询,使 SQL 语句能同时支持按歌曲编号(number)或歌曲名称(title)进行模糊匹配,通过 OR 条件与参数化绑定实现安全、灵活的双条件搜索。
本文介绍如何修改 php 中的 pdo 查询,使 sql 语句能同时支持按歌曲编号(number)或歌曲名称(title)进行模糊匹配,通过 `or` 条件与参数化绑定实现安全、灵活的双条件搜索。
要在单个搜索框中实现“既可按歌曲编号、也可按歌曲名称”进行模糊查询,核心在于重构 SQL WHERE 子句,使用 OR 连接两个独立的 LIKE 条件,并确保 PHP 中正确绑定两个命名参数。原始代码仅搜索 number 字段,扩展后应同时匹配 number 和 title,且必须复用同一个用户输入值(无需额外表单字段),避免 SQL 注入风险。
以下是优化后的完整 PHP 示例:
<?php require_once '../config.php';
if (isset($_POST['query']) && !empty(trim($_POST['query']))) {
$inpText = trim($_POST['query']);
// ✅ 使用 OR 实现双字段模糊匹配,复用同一搜索词
$sql = 'SELECT id, title, number, chord
FROM Song
WHERE number LIKE :search OR title LIKE :search';
$stmt = $conn->prepare($sql);
// ✅ 绑定同一值到两个命名参数(:search),简洁且安全
$stmt->execute(['search' => '%' . $inpText . '%']);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo '
| {$row['title']} | "; echo "{$row['number']} | "; echo "{$row['chord']} | "; echo "
| 未找到匹配的歌曲 | ||
请输入搜索关键词。
关键改进说明:
- ✅ 统一搜索词:仅使用 $_POST['query'] 一个输入,同时匹配 number 和 title,无需新增表单字段或 PHP 变量;
- ✅ 参数重用:SQL 中使用相同占位符 :search(而非 :number 和 :title),在 execute() 中只传一次值,语义清晰、不易出错;
- ✅ 安全性保障:全程使用 PDO 预处理语句 + 命名参数,彻底防止 SQL 注入;
- ✅ 健壮性增强:添加 !empty(trim()) 校验,避免空搜索返回全表数据;
- ✅ HTML 结构优化:补全表格结构(
可选)、增加空结果提示,提升用户体验。 ⚠️ 注意事项:
- 若数据量较大,建议为 number 和 title 字段分别添加 INDEX(如 ALTER TABLE Song ADD INDEX idx_number (number);),以加速 LIKE '%xxx%' 查询;
- LIKE '%value%' 无法利用前导索引,如需高性能全文检索,后期可考虑 MySQL FULLTEXT 索引或 Elasticsearch;
- 切勿拼接用户输入到 SQL 字符串中(如 "WHERE title LIKE '%" . $_POST['query'] . "%'"),这是严重安全隐患。
通过这一改造,你的搜索功能即可无缝支持“搜歌名”或“搜编号”,代码更简洁、安全、可维护。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











