
本文讲解如何在 php 中准确拆分逗号分隔的关键词字符串,并动态构建有效的 mysql `like` 查询,重点解决因空格未被正确处理导致的匹配失效问题,同时提供防 sql 注入的基础防护建议。
在 PHP 中,将用户输入的关键词字符串(如 "paper, glue, discount, bulk")拆分为数组并用于构建 LIKE 查询是常见需求。但若拆分逻辑不严谨,极易引发查询结果异常——例如返回全部记录而非预期匹配项。根本原因在于:原始字符串使用的是 逗号加空格(,)作为分隔符,而代码中却仅用 , 拆分,导致每个关键词实际携带前导空格(如 " glue"),从而使 LIKE '% glue%' 无法匹配数据库中干净的字段值(如 "glue" 或 "paper, glue"),最终因条件恒为 FALSE,MySQL 回退为全表扫描(尤其当 WHERE 子句整体逻辑失效时,可能隐式影响执行计划或触发意外行为)。
正确的做法是严格匹配分隔符:
$my_search = "paper, glue, discount, bulk";
// ✅ 正确:按 ", "(逗号+空格)拆分
$new_search = preg_split("/, /", $my_search);
$mmsql = "SELECT * FROM clients_personal WHERE likes LIKE '%offers%'";
foreach ($new_search as $value) {
// ✅ 同时建议 trim() 防御残留空白
$clean_value = trim($value);
$mmsql .= " OR likes LIKE '%" . $conn->real_escape_string($clean_value) . "%'";
}⚠️ 注意事项:永远不要直接拼接用户输入到 SQL:上述示例中已加入 $conn->real_escape_string() 做基础转义,但更推荐使用 预处理语句(Prepared Statements) 实现彻底防护;若需支持“所有关键词必须同时存在”,应改用 AND 连接,并考虑全文索引(FULLTEXT)或正则(REGEXP)提升效率;LIKE 查询对性能不友好,尤其带前导通配符(%keyword%)时无法利用常规索引,大数据量场景建议评估 MATCH ... AGAINST 方案。
最终生成的 SQL 将形如:
SELECT * FROM clients_personal WHERE likes LIKE '%offers%' OR likes LIKE '%paper%' OR likes LIKE '%glue%' OR likes LIKE '%discount%' OR likes LIKE '%bulk%';
此时查询语义清晰、条件有效,且与手动硬编码结果完全一致。
立即学习“PHP免费学习笔记(深入)”;











