2014-10-28 58 views
1

我在我的网站上有一个搜索栏,并构建一个页面,以显示在搜索中具有LIKE描述和LIKE部分名称的部分。mysql其中like和statment不起作用

is_sold永远是1或0

part_status的一个int总是会批准了1个网页,搜索,或类别名单上显示时。

这里是我的sql语句

$result = mysql_query(" 
SELECT * 
FROM part 
WHERE part_name LIKE '%" . $get_search . "%' 
    OR part_desc LIKE '%" . $get_search ."%' 
    AND is_sold = 0 
    AND part_status = 1 
ORDER BY id DESC 
") 

它列出了部分没有问题,如果他们批准,不管他们出售与否。

遇到的问题Im为,并在此我为“is_sold”(设置INT数字到底是出售部分和“part_status”(如果部分由管理员批准)。

+5

[**请不要在新代码**中使用'mysql_ *'函数](http://bit.ly/phpmsql)。他们不再被维护[并且被正式弃用](http://j.mp/XqV7Lp)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。如果你选择PDO,[这里是一个很好的教程](http://j.mp/PoWehJ)。 – esqew 2014-10-28 14:10:21

+0

我想你需要在适当的'OR'标准周围添加括号。 – sgeddes 2014-10-28 14:13:45

+1

感谢@esqew的教程链接,目前它在我的本地主机上,但是当我切换到公共场合时,我一定会转换为准备好的语句。 – 2014-10-28 14:14:08

回答

3

你混合andor没有任何(),这意味着MySQL是要去申请其内部运算符优先级规则:http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html

你可能想:

((part_name LIKE x) OR (part_desc LIKE X)) AND (is_sold = 0) AND (part_status = 1) 

注01周围多余的括号组件。

+1

括号是可选的还是强制的使用AND语句? – 2014-10-28 14:18:45

+0

没有。都不是。但是当你混合不同的操作符并且需要它们以不同的顺序工作时,它们是强制性的,而PHP将解析/执行它们。就我个人而言,我总是将它们放入。让我不得不记住任何语言的优先规则, m in,并且明确地表明了**我希望它们被执行。 – 2014-10-28 14:21:29

2

的问题是你的ORAND组合:

WHERE part_name LIKE '%" . $get_search . "%' 
    OR part_desc LIKE '%" . $get_search ."%' 
    AND is_sold = 0 
    AND part_status = 1 

现在,当第二个条件匹配 - 在OR条件 - 整个语句评估为true

你需要的东西,如:

WHERE (part_name LIKE '%" . $get_search . "%' 
     OR part_desc LIKE '%" . $get_search ."%') 
    AND is_sold = 0 
    AND part_status = 1 
+2

哦,我的错误在于,所以当OR语句中的两个变量匹配时,它们在括号内变成TRUE。然后它进入AND。谢谢@ jeroen。 – 2014-10-28 14:15:46

1

虽然我esqew同意(你真的不应该使用的mysql_query),试试这个:

$result = mysql_query(" 
SELECT * 
FROM part 
WHERE (part_name LIKE '%" . $get_search . "%' 
    OR part_desc LIKE '%" . $get_search ."%') 
    AND is_sold = 0 
    AND part_status = 1 
ORDER BY id DESC 
") 
2

你必须用括号来组织你的条件() ,像这样

$result = mysql_query(" 
SELECT * 
FROM part 
WHERE (part_name LIKE ('%" . $get_search . "%') 
    OR part_desc LIKE ('%" . $get_search ."%')) 
    AND is_sold = 0 
    AND part_status = 1 
ORDER BY id DESC 
");