3

我有两个问题,第一个问题是我需要在其中使用 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 部分。

这就是我设置 AND / OR 选择的方式(这有效)

我面临的第二个问题是来自同一脚本的代码片段(请阅读代码注释):

$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 的目的。

任何帮助都会很棒

4

2 回答 2

2

问题 1:
一些开发人员WHERE 1在有可选搜索词时使用的原因是表达式 likeTRUE AND <condition>总是等于<condition>。这是基本的布尔代数。

OR但表达式 不是这样。TRUE OR <condition>总是简单TRUE的。您可以修改要使用的基本查询,WHERE 0这样当您附加一个OR术语时,它就会显示为WHERE 0 OR <condition>. 任何表达式 likeFALSE OR <condition>总是等于<condition>.

如果您需要在同一个 SQL 查询中同时支持两者ANDOR则需要开始在术语周围加上括号,以便它们以您想要的方式进行评估。我不会在这个 StackOverflow 答案中解释布尔代数MySQL 的运算符优先级。但是可以说,当您混合使用and术语时,简单地附加术语 with.=是行不通的。ANDOR

问题2:
参数非常有用,但并不能解决动态SQL的每一种情况。您可以使用 SQL 参数代替单个文字值,但仅此而已。

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

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

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

于 2013-05-16T21:56:03.200 回答
0

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

其次,MySQL 手册说您不能在having子句上使用函数。你可以这样做:

SELECT *, COUNT(session.anum) AS total GROUP BY session.anum HAVING total > :count
于 2013-05-16T21:59:12.097 回答