基本上我想在搜索时将通配符添加到col值...
通常我会这样做:
WHERE cakes.cake_name LIKE '%$cake_search%'
然而现在我希望它匹配逆:
用户搜索“
treacle sponge
”,我想要匹配一行cake_name
列=的位置 'sponge
'。
这可能吗?
答案 0 :(得分:3)
WHERE '$cake_search' LIKE concat('%',cakes.cake_name, '%')
应该有效。它将需要全表扫描,但反向查询也是如此。您是否查看了full text search的MySQL?它可能会使这种查询更有效。
答案 1 :(得分:2)
为什么不使用MATCH?
MATCH(`cake_name`) AGAINST ('treacle sponge')
答案 2 :(得分:0)
您必须在空格字符上拆分用户提供的输入,并动态构建查询以检查列中的这些值:
$input = "treacle sponge";
$input_words = explode(' ', $input);
$sql_where = "WHERE cakes.cake_name IN('" . implode("','", $input_words) . "')"; // generates: WHERE cakes.cake_name IN('treacle','sponge')
答案 3 :(得分:0)
为了防止SQL注入,我建议使用预准备语句。
$prepStmt = $conn->prepare('SELECT ... WHERE cakes.cake_name LIKE :cake_search
');
if($prepStmt->execute(array('cake_search'=>"%$cake_search%"))) {
...
}
或者,使用全文搜索:
$prepStmt = $conn->prepare('SELECT ... WHERE MATCH (`cake_name`) AGAINST (:cake_search IN BOOLEAN MODE)');
if($prepStmt->execute(array('cake_search'=>$cake_search_words))) {
...
}
请参阅JSON specialchars JSON php 5.2.13以获取完整示例..;)