我已经有这个代码:
function searchMovie($query)
{
$this->db->where("film_name LIKE '%$query%'");
$movies = $this->db->get ("films", 40);
if($this->db->count > 0)
{
return $movies;
}
return false;
}
我的提交表单按钮条中的JavaScript代码所有特殊字符,例如;:'/等。从查询字符串中,然后将用户重定向到搜索URI(szukaj/query)。因此,例如,如果Film_name是Raj:Wiara,以及用户搜索Raj:Wiara,则查询看起来像Raj Wiara和用户无法获得任何结果。我正在考虑将查询爆炸成单个单词,然后foreach Word从DB中进行选择,但是它将给出同一电影的多个结果。不想更改JavaScript代码,我认为没有特殊字符,例如:。或者也许在DB中为Film_keywords创建另一列列,并在其中添加所有被分开的电影单词,然后搜索此列?
MySQL的全文搜索功能是您的朋友:
http://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html
将返回一系列比赛并给出一个分数,因此您以最佳匹配顺序返回。
警告:$this->db->where("film_name LIKE '%$query%'");
向SQL注入开放。任何人都可以绕过JavaScript,因此您必须始终清理输入服务器端。最好也使用DB函数完成,而不仅仅是剥离字符 - 因此请检查您使用的任何库以执行此操作。
您确实可以使用此答案的解决方案来爆炸字符串。
function searchMovie($query)
{
$queries = preg_split('/[^a-z0-9.']+/i', $query);
foreach ($queries as $keyword){
$this->db->where("film_name LIKE '%$keyword%'");
}
$movies = $this->db->get ("films", 40);
if($this->db->count > 0)
{
return $movies;
}
return false;
}
这将为您的DB创建多个AND
条件,因此结果将被过滤。