2009-12-15 78 views
0

我的代碼是這樣的,數據庫搜索問題PHP

$query = "SELECT * FROM `cars` WHERE (color LIKE '%". $key ."%' OR name LIKE '%". $key ."%') AND enabled = 'yes' ORDER BY `ID`"; 

數據庫是這樣

ID  color  name  enabled 
---- ------  --------  --------- 
1  red  red car  yes 
2  blue  blue car  yes 
3  brown  brown car  yes 

R當我用鑰匙 「紅」,它返回第一個字段搜索

(ID 1),但如果我搜索「紅色汽車」它什麼都不返回。

我該如何搜索2字段?

感謝

編輯:固定支架,但仍我不能得到超過1個字鍵的結果。

沒有運氣

$query = "SELECT * FROM `cars` WHERE (MATCH (color,name) AGAINST ('$key' IN BOOLEAN MODE)) AND enabled = 'yes' ORDER BY `ID`"; 

EDIT 2試過這樣:彼得是正確的。查詢中沒有問題。奇怪的是 我用這個

$key = $_GET['key']; 

如果$ _GET [「關鍵」]超過1個字,$關鍵是返回空的一個原因。

+0

不用說,你應該小心SQL注入。 – Joe 2009-12-15 16:19:36

+1

我不認爲這是原因,但是你確實應該在你的WHERE標準中放置圓括號。您的AND和OR的解決順序可能不是您所期望的。 – 2009-12-15 16:19:56

回答

2

我不能重複你的錯誤。這是我花了

步驟

新表

CREATE TABLE `cars` (
    `ID` int(10) unsigned NOT NULL auto_increment, 
    `color` varchar(45) NOT NULL, 
    `name` varchar(45) NOT NULL, 
    `enabled` varchar(45) NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

然後附加價值

INSERT INTO `cars` (`ID`, `color`, `name`, `enabled`) VALUES 
    (1,'red','red car','yes') 
, (2,'blue','blue car','yes') 
, (3,'brown','brown car','yes'); 

然後測試查詢

mysql> SELECT * FROM `cars` 
    -> WHERE (color LIKE '%red%' OR name LIKE '%red%') 
    -> AND enabled = 'yes' 
    -> ORDER BY `ID`; 
+----+-------+---------+---------+ 
| ID | color | name | enabled | 
+----+-------+---------+---------+ 
| 1 | red | red car | yes  | 
+----+-------+---------+---------+ 
1 row in set (0.00 sec) 

mysql> SELECT * FROM `cars` 
    -> WHERE (color LIKE '%red car%' OR name LIKE '%red car%') 
    -> AND enabled = 'yes' 
    -> ORDER BY `ID`; 
+----+-------+---------+---------+ 
| ID | color | name | enabled | 
+----+-------+---------+---------+ 
| 1 | red | red car | yes  | 
+----+-------+---------+---------+ 
1 row in set (0.00 sec) 

也許別處尋找你的錯誤

+0

那麼問題是什麼? – 2009-12-15 17:37:33

+0

問題是$鍵是空的是如果$ _GET ['鍵']有超過1個單詞:S – 2009-12-15 17:40:29

0

你的SQL是錯誤的:

$query = "SELECT * FROM `cars` WHERE (color LIKE '%". $key ."%' OR name LIKE '%". $key ."%') AND enabled = 'yes' ORDER BY `ID`"; 

你需要把括號中的顏色和名稱,否則你可能會發現你會返回行,當啓用場是假的。

+0

我解決了這個問題,thx – 2009-12-15 16:36:57

1

你可以使用準備好的語句,以防止SQL注入:

$statement = $db_connection->prepare("SELECT * FROM `cars` WHERE (color LIKE ? OR name LIKE ?) AND enabled = 'yes' ORDER BY `ID`"); 
$statement->bind_param("s", "%".$key."%"); 
$statement->execute(); 
+0

嘿thx這 – 2009-12-15 16:39:43

2

「編輯2:彼得是對的。在查詢中沒有 問題。奇怪的是我使用 這個

$ key = $ _GET ['key'];

如果$ _GET [「關鍵」]超過1個字, $關鍵是返回空的一個原因。」

你是如何在$ _GET傳遞?您是否使用窗體或只是在你的變量中輸入

blah.php?關鍵=測試+和

blah.php?關鍵=測試和

+0

是的,這是問題,我傳遞它與查詢加載函數,比我意識到空間應該被替換爲「 +「然後我用JavaScript替換功能,它現在完美thx所有 – 2009-12-15 21:28:27