
本文详解如何在sql查询中正确使用like操作符实现关键词模糊匹配,包括通配符用法、大小写处理及防止sql注入的安全实践。
在数据库查询中,若希望检索包含特定关键词(如“shirt”)的所有记录——例如匹配“shirt”“T-shirt”“cotton shirt”甚至“oversized short-sleeve shirt”——仅靠精确匹配(=)或未加通配符的LIKE是无效的。原始代码中:
$thin = $_POST['stxt']; $thing = strtoupper($thin); $sql = "SELECT * FROM products WHERE UPPER(productName) LIKE '$thing'";
问题在于:LIKE '$thing' 等价于 = '$thing',它只匹配完全一致的字符串,缺失关键的通配符支持。
✅ 正确做法是使用 % 通配符包裹搜索值,表示“任意长度的前缀与后缀”:
$thin = $_POST['stxt']; $thing = strtoupper($thin); $sql = "SELECT * FROM products WHERE UPPER(productName) LIKE '%$thing%'";
此时,当 $thin = 'shirt',该语句将匹配所有 productName 中任意位置包含“SHIRT”(不区分大小写) 的记录,如 "T-SHIRT"、"Long sleeve shirt"、"Sporty Shirt Set" 等。
? 补充通配符说明:
- %:匹配零个、一个或多个任意字符(最常用);
- _(下划线):匹配恰好一个任意字符;
例如:'sh_rt' 可匹配 "shirt" 或 "short",但不匹配 "shout"(因中间字符数不符)。
⚠️ 重要安全提醒:上述拼接SQL的方式存在严重SQL注入风险。攻击者可通过输入 ' OR '1'='1 等恶意内容绕过过滤、读取全表甚至删除数据。
✅ 推荐使用预处理语句(Prepared Statements),以彻底隔离SQL结构与用户输入:
$thin = $_POST['stxt'] ?? '';
$pdo = new PDO($dsn, $user, $pass);
$stmt = $pdo->prepare("SELECT * FROM products WHERE UPPER(productName) LIKE ?");
$searchPattern = '%' . strtoupper($thin) . '%';
$stmt->execute([$searchPattern]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);? 进阶建议:
- 若数据库支持,可考虑使用全文索引(FULLTEXT)替代LIKE提升大数据量下的查询性能;
- 中文场景下注意字符集一致性(推荐统一使用utf8mb4),避免UPPER()对中文无效的问题(此时应直接使用COLLATE utf8mb4_general_ci等不区分大小写的排序规则);
- 前端建议对空搜索做拦截(如trim($thin) === ''时跳过查询),避免全表扫描。
掌握LIKE的通配逻辑与参数化查询实践,是构建健壮、安全、可扩展搜索功能的基础一步。










