Php MySql:我可以查询吗;其中'$str';例如%table.col%“;?
基本上我想在搜索时向列值添加通配符… 通常我是这样做的:Php MySql:我可以查询吗;其中'$str';例如%table.col%“;?,php,mysql,Php,Mysql,基本上我想在搜索时向列值添加通配符… 通常我是这样做的: WHERE cakes.cake_name LIKE '%$cake_search%' 但是,现在我希望它与反向匹配: 用户搜索“糖浆” 海绵”,我希望它与一行匹配 其中,cake\u name列= “海绵”” 这可能吗 WHERE '$cake_search' LIKE concat('%',cakes.cake_name, '%') 应该有用。它需要一个完整的表扫描,但反向查询也需要。你有没有研究过MySQL?这可能会使这种查询
WHERE cakes.cake_name LIKE '%$cake_search%'
但是,现在我希望它与反向匹配:
用户搜索“糖浆”
海绵
”,我希望它与一行匹配
其中,cake\u name
列=
“海绵”
”
这可能吗
WHERE '$cake_search' LIKE concat('%',cakes.cake_name, '%')
应该有用。它需要一个完整的表扫描,但反向查询也需要。你有没有研究过MySQL?这可能会使这种查询更有效
应该有用。它需要一个完整的表扫描,但反向查询也需要。你有没有研究过MySQL?这可能会提高此类查询的效率。您必须将用户提供的输入拆分为空格字符,并动态构造查询以检查列中的这些值:
$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')
您必须拆分用户提供的空格字符输入,并动态构造查询以检查列中的这些值:
$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')
为什么不使用MATCH
MATCH(`cake_name`) AGAINST ('treacle sponge')
为什么不使用MATCH
MATCH(`cake_name`) AGAINST ('treacle sponge')
为了防止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))) {
...
}
有关完整示例,请参见……) 为了防止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))) {
...
}
有关完整示例,请参见……) 这需要一个全文索引,该索引仅在MyISAM中可用,而不是,例如InnoDB。不要忘记将答案标记为已接受,如果这解决了您的问题。这需要一个全文索引,该索引仅在MyISAM中可用,而不是,例如InnoDB。不要忘记将答案标记为已接受,如果这解决了你的问题problem@Haroldo. 您列的数据类型是什么?如果是固定长度字符,则可能需要在添加通配符之前修剪空格
concat(“%”,trim(cakes.cake_name),“%”)
Hi Martin,这是一个VARCHAR 20,其内容物将始终被修剪,但可以在内部包含一个空间,即“bakewell tart”。Uffo的解决方案对我来说很好,但我只想试试你的一种满足好奇心的方式@Haroldo-如果你选择的话,肯定是全文搜索。我的回答效率很低,因为它需要扫描每一条记录。@Haroldo。您列的数据类型是什么?如果是固定长度字符,则可能需要在添加通配符之前修剪空格concat(“%”,trim(cakes.cake_name),“%”)
Hi Martin,这是一个VARCHAR 20,其内容物将始终被修剪,但可以在内部包含一个空间,即“bakewell tart”。Uffo的解决方案对我来说很好,但我只想试试你的一种满足好奇心的方式@Haroldo-如果你选择的话,肯定是全文搜索。我的答案是非常低效的,因为它需要扫描每一条记录。谢谢-我计划很快升级到PDO,所以这将在手上坦克-我计划很快升级到PDO,所以这将派上用场