能否在同一条SQL查询中同时使用LIKE和MATCH AGAINST?
问题解决:SQL语句语法错误及优化建议
- 语法错误修正:你的SQL语句里
OR后面多写了一个WHERE,SQL语法要求WHERE子句只能有一个开头,多个条件直接用OR/AND连接即可。修正后的基础SQL如下:
SELECT * FROM posts WHERE title LIKE '%$search%' OR MATCH (title) AGAINST('$search' IN NATURAL LANGUAGE MODE)
- 必须修复的SQL注入风险:直接把用户输入的
$search拼进SQL语句里,属于高危写法,极易遭遇SQL注入攻击。建议用PDO预处理语句替代,示例代码:
$search = "user search"; $stmt = $connection->prepare("SELECT * FROM posts WHERE title LIKE ? OR MATCH (title) AGAINST(? IN NATURAL LANGUAGE MODE)"); $likeKeyword = "%{$search}%"; $stmt->execute([$likeKeyword, $search]); $data = $stmt->fetchAll();
- 实现你的需求逻辑:如果要区分短词用
LIKE、长词/多词用MATCH AGAINST,可以先判断搜索词的状态,再选择对应查询逻辑,不用强行OR两个条件:
$search = trim("user search"); $wordCount = count(explode(' ', $search)); // 自定义判断规则:比如词数>1 或 单词语长>5时用全文搜索 if ($wordCount > 1 || strlen($search) > 5) { $stmt = $connection->prepare("SELECT * FROM posts WHERE MATCH (title) AGAINST(? IN NATURAL LANGUAGE MODE)"); $stmt->execute([$search]); } else { $stmt = $connection->prepare("SELECT * FROM posts WHERE title LIKE ?"); $stmt->execute(["%{$search}%"]); } $data = $stmt->fetchAll();
内容的提问来源于stack exchange,提问作者Table
相关产品推荐
相关产品推荐

