我正在使用 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 文档 http://dev.mysql.com/doc/refman/5.6/en/fulltext-boolean.html,有一些关键字,例如+
and -
有特定目的。是否有一个函数可以从字符串中转义这些类型的特殊字符,以便可以在如上所述的全文搜索中使用它而不会引发任何错误?
以下是引发错误的示例:
{"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);
我假设我需要使用正则表达式。这里最好的方法是什么?