2009-12-15 38 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