0

谁能建议为什么在这个 MySQL 查询中忽略大于运算符?

$sql = "SELECT *
FROM `items`
WHERE `short_description` LIKE '%".$term."%'
    OR `description` LIKE '%".$term."%'
    AND `quantity` > 0
ORDER BY year DESC, denomination ASC, description ASC $max";

我在同一个网站上有一个类似的查询

$sql = "SELECT *
FROM `items`
WHERE `category` = '".$cat_id."'
    AND `quantity` > 0
ORDER BY year DESC, denomination ASC, description ASC;";

一切都很好,除了第一次查询的数量比较,它让我很难过。

4

4 回答 4

1

尝试

$sql = "SELECT *
FROM `items`
WHERE (`short_description` LIKE '%".$term."%'
    OR `description` LIKE '%".$term."%')
    AND `quantity` > 0
ORDER BY year DESC, denomination ASC, description ASC $max";

我认为你的OR陈述是问题所在。

于 2013-01-31T02:30:50.920 回答
0
"SELECT * FROM items WHERE (short_description LIKE '%".$term."%' OR description LIKE 
'%".$term."%') 
AND quantity > 0 
ORDER BY year DESC, denomination ASC, description ASC $max";

试试看……你有一个或条件和一个和。

于 2013-01-31T02:30:12.257 回答
0

它没有被忽视,只是你误解了它是如何应用的。表达方式:

WHERE `short_description` LIKE '%".$term."%' (call this XX,)
OR `description` LIKE '%".$term."%'          (          YY,)
AND `quantity` > 0                           (      and ZZ.)

被解释为:

where XX or (YY and ZZ)

而您可能想要的是:

where (XX or YY) and ZZ

因此,您必须按如下方式覆盖默认解释:

WHERE (`short_description` LIKE '%".$term."%' OR
       `description` LIKE '%".$term."%')
  AND `quantity` > 0

您的第二个查询没有这个问题的原因是因为您没有混合ANDOR.


此外,虽然与您的具体问题无关),但您应该非常警惕like诸如like '%something%'. 它们是体面大小的表的真正性能杀手,并且有一些方法可以显着提高性能。

在这种情况下,如果您的桌子很小,这可能并不重要,但请记住这一点。

于 2013-01-31T02:33:27.147 回答
0

您应该通过将它们括在括号中来对您的OR和条件进行分组,AND

$sql = "SELECT * FROM `items` 
         WHERE  (`short_description` LIKE '%".$term."%' OR 
                 `description` LIKE '%".$term."%')  AND 
                  `quantity` > 0 
          ORDER BY year DESC, denomination ASC, description ASC $max";

后续问题:是$max包含LIMIT子句的变量吗?

作为旁注,SQL Injection如果变量的值(s)来自外部,则查询很容易受到攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

于 2013-01-31T02:28:50.423 回答