2011-03-29 200 views
0

我有一個PHP搜索頁面,我可以輸入一個字符串進行搜索。 另外我寫了一個頁面,顯示與數據庫中的字符串匹配的結果。 SQL查詢使用MySQL數據庫和PHP搜索

$query = "select * from table_name WHERE Name LIKE '$srch' || Last LIKE '$srch' || email LIKE '$srch' || comment LIKE '$srch'"; 

如果搜索字符串爲「約翰·戴維」,我想顯示包含 無論是「約翰」或「大衛」,而不是隻顯示結果中的每個記錄中同時包含「約翰·大衛「,因爲我有John Samuel,David Grecco,Jennifer Davidson等人的記錄。

回答

0

你可以將你的字符串分解爲單詞,並對它們分別進行搜索。

$where_clause = ""; 
foreach($words as $key=>$word){ 
    $or = ""; 
    if (isset($words[$key+1])){ 
    $or = " OR"; 
    } 
    $where_clause = "Name LIKE '$srch' || Last LIKE '$srch' || email LIKE '$srch' || comment LIKE '$srch' {$or}"; 
} 

我認爲這將是正確的

+0

yes..i將字符串分解爲數組。我如何將它與數據庫中的每個值進行比較?您可以請在這裏發佈一些示例代碼 – SK0004 2011-03-29 19:27:19

+0

您可以爲每個單詞生成帶有OR狀態網的WHERE子句。或者對每個單詞運行查詢,然後合併結果。我會在一分鐘後發佈一個例子 – Headshota 2011-03-29 19:30:12

+0

得到了一個像Warning一樣的錯誤:爲foreach()提供的無效參數() – SK0004 2011-03-29 19:46:55

2

你可能想要做布爾模式MySQL的全文搜索。見http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

編輯:爲了詳細說明,您的查詢就會變成:

$query = "SELECT * FROM table_name WHERE 
      MATCH (Name,Last,email,comment) 
      AGAINST('$srch' IN BOOLEAN MODE)"; 

如果還是對你的工作,那麼你將要在您正在搜索的列添加FULLTEXT索引。

0

我個人並沒有使用它,但是你可能有幸運用mySQL的REGEXP運算符。

從MySQL的REGEXP

正則表達式運算符EXPR NOT REGEXP拍拍,EXPR NOT RLIKE拍拍

這是同爲NOT(表達式REGEXP PAT)。

EXPR REGEXP輕拍,EXPR RLIKE輕拍

執行字符串表達式模式匹配EXPR針對圖案 輕拍。該模式可以是一個擴展的正則表達式,本節後面討論的 的語法。如果expr與 pat返回1;否則返回0.如果expr或pat爲NULL,則結果 爲NULL。 RLIKE是REGEXP的同義詞,爲mSQL 兼容性提供。

該模式不必是文字字符串。例如,它可以是指定爲字符串表達式或表列的 。

注意因爲MySQL在字符串中使用C轉義語法(例如, 「\ n」表示換行符),所以您必須加倍使用您在REGEXP字符串中使用的任何「\」。

REGEXP不區分大小寫,除非與二進制字符串一起使用。

mysql> SELECT'Monty!' REGEXP'。 '; - > 1 mysql> SELECT'new \ n * line'REGEXP'new \ *。\*線'; - > 1 mysql> SELECT'a'REGEXP'A','a'REGEXP BINARY'A'; - > 1 0 mysql> SELECT'a'REGEXP'^ [a-d]'; - > 1當決定字符的類型並執行 比較時,REGEXP和RLIKE使用參數的字符集和歸類。