Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySql:我可以查询吗;其中'$str';例如%table.col%“;?_Php_Mysql - Fatal编程技术网

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,所以这将派上用场