2011-04-21 38 views
1

我有一個輸入框,可以在我的表中輸入和搜索多個單詞。php通過mysql字段進行字符串匹配

假設用戶輸入'people places things'作爲他們的搜索條件,這些應該被提交給我的php函數,該函數通過我的'名詞'表和'描述'和'標題'字段搜索可能的匹配項。然後該函數應該按照找到的匹配數降序排列結果。

我有這麼遠(缺少了很多,可能甚至不正確的方法):

$lcSearchVal = "people places things"; 
$lcSearchVal = explode(' ', $lcSearchVal); 

foreach($lcSearchVal as $lcSearchWord){ 
    $qry_suggest = mysql_query('SELECT * FROM nouns 
          WHERE Active 
          AND (' . strpos($lcSearchWord, "description") > 0 . ' 
           OR ' . strpos($lcSearchWord, "title") > 0 . ') ' 
          ); 
} 

我不知道做什麼或從這裏到,雖然去... 。請幫忙!

+0

在嘗試解決此問題之前,您應該先看看這個問題:http://dev.mysql.com/doc/refman/5.5 /en/fulltext-search.html – Dereleased 2011-04-21 21:20:41

回答

3

您使用的是行不通的查詢 - 你正在使用PHP函數與純字符串進行比較並在查詢中追加比較結果。所有DB會看到是這樣的:

SELECT * FROM nouns WHERE Active AND (-1 OR 0)

...因爲PHP strpos函數返回字符串中發現的數字位置(或-1,如果沒有找到您需要在數據庫中使用的比較函數。本身,所以,你是不是以後的PHP函數在所有的,而你想要MySQL的比較函數

僅供參考,這裏是他們的列表:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html

下面是一個示例是,很乾脆,搜索對於匹配,你可以相當多地改進這個代碼,但是這應該給你一個想法:

$lcSearchVal = "people places things"; 
$lcSearchVal = explode(' ', $lcSearchVal); 

$sql = 'SELECT * FROM nouns WHERE Active=1 AND ('; 

$parts = array(); 
foreach($lcSearchVal as $lcSearchWord){ 
    $parts[] = '`description` LIKE "%'.$lcSearchWord.'%"'; 
    $parts[] = '`title` LIKE "%'.$lcSearchWord.'%"'; 
} 

$sql .= implode(' OR ', $parts).')'; 
print $sql; 

更動它:http://codepad.org/fcNH5qyu

另外請注意,您的WHERE Active條款是無效的 - 你必須給它一個比較。我假設在我的示例中,Active字段是數字1或0.

+0

認爲這是我想要的,我只需要按匹配數排序結果..你知道如何添加? – sadmicrowave 2011-04-21 21:33:43

0

您不能將PHP函數與SQL混合使用。您的查詢是要看起來像:

... WHERE Active AND (1 or 0) ... 

我猜你會想成才這樣的:

$lcSearchWord = mysql_real_escape_string($lcSearchWord); 

... WHERE Active=1 AND (description LIKE '%$lcSearchWord$%' OR title LIKE '%$lcSearchWord$%') ...