2013-05-30 109 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