动态PDO查询 - 使用AND / OR

时间:2013-05-16 21:49:21

标签: php mysql dynamic pdo

我有两个问题,第一个是标题状态,我需要在其中使用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的目的。

任何帮助都会很棒

2 个答案:

答案 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查询中同时支持ANDOR,则需要开始在术语周围添加括号,以便按照您的意图进行评估。我不打算在这个StackOverflow答案中解释boolean algebraMySQL's operator precedence。但是,如果您混合使用.=AND条款,那么只需在OR上添加字词就行不通了。

问题2:
参数非常有用,但它们并不能解决动态SQL的所有情况。您可以使用SQL参数代替单个文字值,但不能使用其他内容。

  • 不是表格名称
  • 不是专栏名称
  • 不是值列表(如IN( )谓词)
  • 不是SQL关键字
  • 不是表达
  • 不是运营商

您必须使用字符串插值在HAVING子句中包含用户选择的运算符。

建议您在需要插入动态内容且无法使用参数时,使用白名单来避免SQL注入的风险。

答案 1 :(得分:0)

对于第一个问题,究竟是什么问题?

对于第二个,MySQL manual表示您无法在having子句中使用函数。 你可以这样做:

SELECT *, COUNT(session.anum) AS total GROUP BY session.anum HAVING total > :count