2011-10-07 27 views
0

我有兩個關於我的腳本和搜索的問題。我有這樣的腳本:通過mysql數據庫搜索有問題

$searchTerms = explode(' ', $varSearch); 
$searchTermBits = array(); 
foreach($searchTerms as $term){ 
    $term = trim($term); 
    if(!empty($term)){ 
     $searchTermBits[] = "column1 LIKE '%".$term."%'"; 
    } 
} 

$sql = mysql_query("SELECT * FROM table WHERE ".implode(' OR ', $searchTermBits).""); 

我有一個數據名字「巖助威攀登這裏」

如果我輸入「攀巖」這個數據顯示一列1。這是完美的,但如果我只是鍵入「岩石」,它不顯示。這是爲什麼?

另外,如何爲關鍵字添加另一個「column2」來搜索?

謝謝!

回答

1

搜索字符串中的「rocks」不起作用,因爲字符串「rocks」不存在於數據中。看着它,這對你有意義,因爲你知道「岩石」的複數是「岩石」,但數據庫不知道這一點。你可以嘗試

一種選擇是去除搜索詞S,但你遇到的其他問題與 - 例如,「漿果」複數的「漿果」,如果你刪除S,你會正在尋找「berrie」,這不會讓你更進一步。

您可以通過添加更多的線,如

$searchTermBits[] = "column1 LIKE '%".$term."%'"; 

,並與你想搜索的內容替換".$term."添加更多的搜索詞。例如,

$searchTermBits[] = "column1 LIKE '%climb%'"; 

另一件需要注意的事項...寫下來,您的代碼容易受到SQL注入的影響。以此爲例...如果網站訪問者在搜索詞中鍵入'; DROP TABLE tablename;您剛剛刪除了數據。

你應該做的是修改searchTermBits[]線看起來像:

$searchTermBits[] = "column1 LIKE '%" . mysql_real_escape_string($term) . "%'"; 

這將防止任何污穢損害您的數據。

+1

The'';使用mysql_query時,drop table'' bit是**不是**,因爲該函數將允許1且只有1個查詢運行。然而,你**可能會遇到麻煩,或者(1 = 1)UNION選擇密碼,用戶名,用戶的電子郵件 - 敏感數據流到屏幕的那種查詢。 – Johan

+0

我曾考慮SQL注入。我沒有在這裏顯示,因爲簡單。不過謝謝你提到它。此外,我不喜歡只使用「爬」,因爲這將是一個動態的頁面,我會使用多個單詞,並在我的數據庫中有多個單詞。但是我試圖弄明白它在搜索岩石時會顯示出岩石,我怎麼能夠做到這樣的腳本? – hellomello

+0

「爬」線就是一個例子。只要你喜歡,你可以有許多$ searchTermBits [] =「...」行 - 你正在創建一系列條件。所以你可以添加$ term1,$ term2,$ term3等。 –

0
  1. 你COLUMN1數據rock cheer climbing here您的搜索條件%Rocks%它不適合所有爲rocks是不是在你的COLUMN1數據

  2. 爲您做COLUMN1您可以添加COLUMN2然後把它放在一起通過使用AND運算(column1 LIKE "%rock%" OR column1 LIKE "%climb%") AND (column2 LIKE "%rope%" OR column2 LIKE "%powder%")

TIPS: 如果您的表/架構中使用xx_xx_ci覈對(那麼這是平均不區分大小寫,MySQL不關心區分大小寫),但如果其他則需要確保搜索詞必須區分大小寫(mysql區分大小寫)。

0

假設你給出的數據是準確的,它不應該匹配,因爲你使用的是「Rocks」,而字符串中的單詞是「rock」。默認情況下,mysql不會執行區分大小寫的匹配,所以可能不是這種情況。

此外,爲了避免sql注入,你絕對應該使用mysql_real_escape_string來逃避你的內容。

添加第二列也很容易。只需爲每個搜索項添加兩個條目到您的數組中,一個用於column1和一個用於column2。