
在实际业务中,下拉选择框(
✅ 核心思路:多条件 LIKE 拼接 + 预处理语句
mysql 中可使用多个 LIKE 子句实现“同时包含多个词”的语义(即逻辑与关系)。例如:
select * FROM `contratos` WHERE id_contrato LIKE '%FRAMEWORK CONTRACT%' AND id_contrato LIKE '%2023%';
⚠️ 注意:此处假设待搜索字段为 id_contrato(即示例中显示的合同标题字段),而非 yourtext(原答案中的占位符需替换为真实字段名)。
? 推荐实践:使用 mysqli 预处理防止sql注入
避免字符串拼接导致的安全风险,应将关键词作为参数传入预处理语句:
立即学习“前端免费学习笔记(深入)”;
php // 假设用户输入的关键词数组(可来自GET/POST或固定配置) $keywords = ['FRAMEWORK CONTRACT', '2023']; // 构建动态WHERE条件:每个关键词对应一个 LIKE 条件 $placeholders = []; $params = []; $types = ''; foreach ($keywords as $kw) { $placeholders[] = "id_contrato LIKE ?"; $params[] = "%{$kw}%"; $types .= 's'; // string type } $whereClause = !empty($placeholders) ? 'WHERE ' . implode(' AND ', $placeholders) : ''; $sql = "SELECT * FROM `contratos` {$whereClause}"; $stmt = mysqli_prepare($conexion, $sql); if ($stmt) { mysqli_stmt_bind_param($stmt, $types, ...$params); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); echo ''; mysqli_stmt_close($stmt); } else { error_log("SQL prepare failed: " . mysqli_error($conexion)); } ?>
⚠️ 关键注意事项
- 字段准确性:务必确认 id_contrato 是存储完整标题(如 “FRAMEWORK CONTRACT TO CONTRACT 19/ 2023″)的字段;若标题分散在多字段中,需用 CONCAT() 合并后再匹配。
- 大小写与空格鲁棒性:MySQL LIKE 默认不区分大小写(取决于排序规则),但建议前端清洗关键词(如 trim(strtoupper($kw)))并统一后端匹配逻辑。
- 性能优化:对高频搜索字段(如 id_contrato)建立全文索引(FULLTEXT)或前缀索引(如 INDEX idx_title (id_contrato(100))),避免全表扫描。
- 用户体验增强:可配合ajax实现无刷新筛选,或在页面加载时默认显示全部,再由用户触发搜索。
通过以上方式,你既能安全、灵活地实现多关键词服务端过滤,又能保持代码可维护性与扩展性——未来只需修改 $keywords 数组或提取为独立函数,即可复用于其他筛选场景。