2013-05-30 86 views
1

说我有我的数据库中的一些记录数据,像这样:获取多个结果LIKE

约翰·默多克
我是约翰·默多克
我的第一个名字是约翰和我的第二个名字是默多克

我有一个搜索表单和我输入“约翰·默多克”将运行此查询:

$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>"; 
} 

这将仅返回前两行,因为它只是那些两个词彼此相邻的行。即使单词分裂了,我怎样才能返回其他行?我知道我可以爆炸字符串并检查每一部分,但我正在寻找一种更稳定和有效的方式来做到这一点。

回答

3

只需在查询前用通配符%替换标点符号和空格即可。

$search = str_replace (array('.', ' ', "'", '-'), '%', $search);

但这仍需要第一个字出现在第二个字之前的文本。所以如果你的搜索是“默多克约翰”,你不会返回任何结果。

更好的答案是采用全文检索的列(必须在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

+0

我使用MySQL的,我只是说和mysqli所以人们不要去的话题,并告诉我太停止使用MySQL的功能,使用FULLTEXT给我警告:mysql_fetch_assoc()期望参数1是资源,布尔在 –

+1

中给出@Ashley Bowman尝试在你的'$ sql ='line后面添加这个:'if($ sql === false)echo mysqli_error()'或者任何mysqli错误功能是。你可能发送了错误的SQL,导致'$ sql'被设置为'false' –

0
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