假设我的数据库中有一些记录,数据如下:
约翰·默多克
我是John Murdoch
我的名字是约翰,我的第二个名字是默多克
我有一个搜索表单,我输入"john murdoch",它将运行这个查询:
$search //contain the search string in this case is john murdoch
$sql = mysqli_query($sql, "SELECT * FROM table WHERE column LIKE '%$search%'");
while($row = mysql_fetch_assoc($sql)){
echo $row['first']."<br>";
}
这将只返回前两行,因为只有这些行有两个单词在一起。我怎样才能返回另一行,即使单词是分开的?我知道我可以打开字符串并检查每个片段,但我正在寻找一种更稳定和有效的方法。
只需在查询前用通配符%
替换标点符号和空格。
$search = str_replace ( array( '.', ' ', "'", '-' ), '%', $search );
这仍然要求在文本中第一个单词出现在第二个单词之前。因此,如果你搜索的是"Murdoch John",你将不会返回任何结果。
更好的答案是在列上使用FULLTEXT搜索(在MySQL中必须这样做),并对列执行MATCH()
查询,如下所示:
在每个单词前加一个加号(表示需要这个单词)
$words = '+' . str_replace( ' ', ' +', $search );
和你的查询:
SELECT * FROM table MATCH ( column ) AGAINST ( '$words' IN BOOLEAN MODE)
更多信息在这里:http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html
SELECT * FROM table WHERE `column` LIKE '%john%' AND `column` LIKE '%murdoch%'
我将像这样构造这个查询:
$search_terms = array('john','murdoch');
$field_to_search = 'some_column';
$sql = 'SELECT * FROM table WHERE' . "'n";
$sql .= '`' . $field_to_search . '` LIKE ''%'
. implode('%'' AND `' . $field_to_search . '` LIKE ''%',$search_terms)
. '%''';
PHP可以用于任意数量的搜索词。它需要匹配所有,因为它与AND
相连。
这里是一个php提琴的链接:http://phpfiddle.org/main/code/igv-3qc