MySql:我可以查询“WHERE'$ string'LIKE%table.col%”吗?

时间:2010-07-15 11:58:34

标签: php mysql

基本上我想在搜索时将通配符添加到col值...

通常我会这样做:

WHERE cakes.cake_name LIKE '%$cake_search%'

然而现在我希望它匹配逆:

  

用户搜索“treacle sponge”,我想要匹配一行   cake_name列=的位置   'sponge'。

这可能吗?

4 个答案:

答案 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以获取完整示例..;)