
本文介绍如何通过 mysql 的 like 多条件组合查询,在 php 生成的 `
在实际业务系统中,用户常需从大量合同文本(如 FRAMEWORK CONTRACT TO CONTRACT 19/2023)中快速定位符合多个语义条件的选项。仅靠前端 JavaScript 过滤效率低、不支持服务端逻辑(如权限控制),而直接拼接 SQL 字符串又易引发 SQL 注入风险。因此,推荐在服务端构建安全、可复用的多关键词模糊匹配查询。
✅ 正确实现方式:参数化多条件 LIKE 查询
假设合同标题字段为 id_contrato(或更规范地命名为 titulo_contrato),需同时匹配“FRAMEWORK CONTRACT”和“2023”,应使用 AND 连接多个 LIKE 条件:
// ✅ 安全示例:使用 MySQLi 预处理语句
$searchTerms = ['FRAMEWORK CONTRACT', '2023']; // 可动态传入
$placeholders = str_repeat('?,', count($searchTerms) - 1) . '?';
$conditions = array_fill(0, count($searchTerms), 'id_contrato LIKE ?');
$sql = "SELECT * FROM `contratos` WHERE " . implode(' AND ', $conditions);
$stmt = mysqli_prepare($conexion, $sql);
// 构造绑定参数:每个关键词转为 %keyword%
$params = array_map(fn($term) => "%{$term}%", $searchTerms);
$types = str_repeat('s', count($params));
$refParams = [$types];
foreach ($params as $param) {
$refParams[] = &$param;
}
call_user_func_array([mysqli_stmt, 'bind_param'], $refParams);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);? 前端渲染优化(带占位提示)
⚠️ 关键注意事项:永远避免字符串拼接 SQL(如 "WHERE ... LIKE '%" . $_GET['q'] . "%'"),这是高危漏洞;LIKE 区分大小写取决于字段排序规则(collation),如需忽略大小写,确保字段使用 utf8mb4_unicode_ci 等不区分大小写的排序规则;若需支持任意顺序的多词匹配(如“2023 FRAMEWORK CONTRACT”也命中),当前 AND LIKE 方案已满足;若需全文检索(含相关性排序),应迁移到 FULLTEXT 索引 + MATCH() AGAINST();将数据库查询逻辑封装为独立函数(如 getFilteredContracts(array $keywords)),提升可维护性与复用性。
通过以上方案,你不仅能精准筛选出 FRAMEWORK CONTRACT ... 2023 类合同,还能保障系统安全性与代码可扩展性——这才是生产环境应有的实践标准。











