gpt4 book ai didi

mysql - 用于 MySQL 全文搜索的转义字符串

转载 作者:IT老高 更新时间:2023-10-29 00:09:03 26 4
gpt4 key购买 nike

我正在使用 Laravel 4 并设置了以下查询:

if(Input::get('keyword')) {
$keyword = Input::get('keyword');
$search = DB::connection()->getPdo()->quote($keyword);
$query->whereRaw("MATCH(resources.name, resources.description, resources.website, resources.additional_info) AGAINST(? IN BOOLEAN MODE)",
array($search)
);
}

此查询在正常使用下运行良好,但是,如果用户输入诸如 ++ 之类的字符串,则会抛出错误。看着 MySQl docs , 有一些关键字,例如+- 有特定的用途。是否有一个函数可以从字符串中转义这些类型的特殊字符,以便它可以像上面那样用于全文搜索而不会引发任何错误?

这是一个抛出错误的例子:

{"error":{"type":"Illuminate\\Database\\QueryException","message":"SQLSTATE[42000]: Syntax error or access violation: 1064 syntax error, unexpected '+' (SQL: select * from `resources` where `duplicate` = 0 and MATCH(resources.name, resources.description, resources.website, resources.additional_info) AGAINST('c++' IN BOOLEAN MODE))","file":"\/var\/www\/html\/[...]\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Connection.php","line":555}}

我尝试过的解决方案:

$search = str_ireplace(['+', '-'], ' ', $keyword);

$search = filter_var($keyword, FILTER_SANITIZE_STRING);

$search = DB::connection()->getPdo()->quote($keyword);

我假设我需要使用正则表达式。这里最好的方法是什么?

最佳答案

在 bool 搜索模式下,只有单词和运算符才有意义。运营商是:+ , - , > < , ( ) , ~ , * , " , @distance 。经过一番研究,我发现单词字符是:大写,小写字母,数字(数字)和_ .我认为您可以使用以下两种方法之一:

  1. 用空格替换所有非单词字符(我更喜欢这种方法)。这可以通过正则表达式来完成:

    $search = preg_replace('/[^\p{L}\p{N}_]+/u', ' ', $keyword);
  2. 用空格替换字符运算符:

    $search = preg_replace('/[+\-><\(\)~*\"@]+/', ' ', $keyword);

只有单词被全文搜索引擎索引,才能被搜索到。非单词字符不会被索引,因此将它们留在搜索字符串中是没有意义的。

引用文献:

关于mysql - 用于 MySQL 全文搜索的转义字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26507087/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com