2012-01-24 99 views
0

我有我想要一個表如內的多個列來比較搜索表單域:MySQL查詢中的多個LIKE比較? - MySQL和PHP

+----------+-------+---------+------+------------+ 
| name  | owner | species | sex | birth  | 
+----------+-------+---------+------+------------+ 
| Claws | Gwen | cat  | m | 1994-03-17 | 
| Bowser | Diane | dog  | m | 1989-08-31 | 
| Whistler | Gwen | cat  | m | 1997-12-09 | 
+----------+-------+---------+------+------------+ 

我所做的查詢有多個LIKE比較但它只是似乎找到數據行了前兩列。

第一個比較是 「」,然後 「所有者」,然後 「」,然後 「」。

只有輸入與前兩列匹配的字符串時纔會查找行,但如果輸入的字符串與最後一列中的某一列匹配,則不會返回任何內容。

下面是該查詢:

SELECT * FROM contact 
WHERE name LIKE \"%$search%\" 
OR owner LIKE \"%$search%\" 
OR species LIKE \"%$search%\" 
OR sex LIKE \"%$search%\" 
GROUP BY name, owner,species, sex 

我唯一的猜測是MySQL可能限制多少「OR」是你可以使用嗎?

如果用戶輸入的字符串與任何列數據匹配,我的查詢應該從表中返回一行。

這是我的PHP代碼它

include("database.class.php"); 

    //search string assigned from POST field 
    $search = $_POST['contact_search']; 

    $db = new database(); 

    $db->select('quote_system'); 

    $result = $db->query("SELECT * FROM contact WHERE name LIKE \"%$search%\" OR owner LIKE \"%$search%\" OR species LIKE \"%$search%\" OR sex LIKE \"%$search%\" GROUP BY name, second_name, owner, species, sex"); 

    print_r($result); 

    while ($row = $db->fetch_assoc($result)) 
    { 
     echo $row['name']; 
     echo $row['owner']; 
     echo $row['species']; 
     echo $row['sex']; 
     echo "<br/>"; 

    } 

櫃面那裏有這裏的任何混亂是一些例子,說明這個問題:

用戶輸入字符串「魔爪」 - 在>字符串匹配數據「name」列 - >打印該列所在的行

用戶輸入字符串「m」 - >字符串只匹配「sex」列中的數據 - >沒有顯示!

謝謝你的時間!

+0

哦,不,另一個SQLi –

+0

只是一個提示。不要這樣做。您的查詢沒有可用的索引,這意味着全表掃描*多次*。 – Layke

+0

@Martin - SQLi? – kaleeway

回答

1

您的查詢

$result = $db->query(" 
    SELECT * FROM contact 
    WHERE first_name LIKE \"%$search%\" 
    OR second_name LIKE \"%$search%\" 
    OR company_name LIKE \"%$search%\" 
    OR email LIKE \"%$search%\" 
    GROUP BY first_name, second_name, company_name, email 
"); 

似乎屬於另一個表。另外,你爲什麼GROUP BY?也許,你的意思是ORDER BY?

+0

是錯誤的SQL我粘貼,我現在更新 – kaleeway

+1

我使用groupby刪除重複的行返回 – kaleeway

+0

使用選擇DISTINCT ...爲此。 – ACNB