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

ORandAND条件を括弧で囲んでグループ化する必要があります。

$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値が外部から取得された場合、クエリは脆弱です。予防方法については、以下の記事をご覧ください。を使用すると、値を一重引用符で囲む必要がなくなります。PreparedStatements

于 2013-01-31T02:28:50.423 に答える
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";

試してみてください... Or 条件と and があります。

于 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

2 番目のクエリでこの問題が発生しない理由は、 と が混在ANDしていないためですOR


さらに、特定の質問とは関係ありませんが)、などの両端句には非常に注意する必要があります。それらはまともなサイズのテーブルの真のパフォーマンスキラーであり、パフォーマンスを大幅に改善する方法があります.likelike '%something%'

この場合、テーブルが小さい場合は問題にならないかもしれませんが、注意が必要です。

于 2013-01-31T02:33:27.147 に答える