我有两个问题,第一个是标题状态,我需要在其中使用AND / OR进行动态查询。我完全理解AND部分(我已经做了很多这些)然而,OR部分对我来说非常混乱,因为看下面这个sql:
$sql = SELECT * FROM table WHERE 1
然后,如果满足条件,则添加OR语句:
if(isset($_POST['OR'])){
$sql. = " OR peaches = :good";
}
然后查询将返回WHERE 1 OR peaches =:good
我再次理解带有AND的部分,但我不明白如何设置OR部分。
This is how I have set up the AND / OR selection (and this works)
我面临的第二个问题是来自同一脚本的代码片段(请阅读代码注释):
$sql .= " GROUP BY anum"; // I always group BY anum no matter what
if ($count !== "") { // if COUNT is not ""
$sql .= " HAVING COUNT(session.anum) :count"; // Then I want the user to be able to choose the operator (> < => =< =) and the dynamic number for it to use
$placeholder[':count'] = $count; // Then add the key :count to an array with the value of $count
}
$dynamic = $this->db->conn_id->prepare($sql);
$dynamic->execute($placeholder);
因为你注意到我给了命名参数(:count) $ count的值,但这确实“不起作用”。
是否可以做我想做的事情($sql .= " HAVING COUNT(session.anum) :count";
)
如果没有,那么我可以这样做:$sql .= " HAVING COUNT(session.anum) $count";
但这会破坏PDO的目的。
任何帮助都会很棒
答案 0 :(得分:2)
问题1:
某些开发人员在拥有可选搜索字词时使用WHERE 1
的原因是TRUE AND <condition>
这样的表达始终等于<condition>
。这是基本的布尔代数。
但OR
表达式并非如此。 TRUE OR <condition>
始终只是TRUE
。您可以修改基本查询以使用WHERE 0
,这样当您附加OR
字词时,它就会显示为WHERE 0 OR <condition>
。任何类似FALSE OR <condition>
的表达式总是等于<condition>
。
如果您需要在同一SQL查询中同时支持AND
和OR
,则需要开始在术语周围添加括号,以便按照您的意图进行评估。我不打算在这个StackOverflow答案中解释boolean algebra和MySQL's operator precedence。但是,如果您混合使用.=
和AND
条款,那么只需在OR
上添加字词就行不通了。
问题2:
参数非常有用,但它们并不能解决动态SQL的所有情况。您可以使用SQL参数代替单个文字值,但不能使用其他内容。
IN( )
谓词)您必须使用字符串插值在HAVING子句中包含用户选择的运算符。
建议您在需要插入动态内容且无法使用参数时,使用白名单来避免SQL注入的风险。
答案 1 :(得分:0)
对于第一个问题,究竟是什么问题?
对于第二个,MySQL manual表示您无法在having
子句中使用函数。
你可以这样做:
SELECT *, COUNT(session.anum) AS total GROUP BY session.anum HAVING total > :count