Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 动态PDO查询-带和/或_Php_Mysql_Dynamic_Pdo - Fatal编程技术网

Php 动态PDO查询-带和/或

Php 动态PDO查询-带和/或,php,mysql,dynamic,pdo,Php,Mysql,Dynamic,Pdo,我有两个问题,第一个问题是,我需要使用和/或在其中进行动态查询。我完全理解AND部分(我已经做了很多),但是,OR部分对我来说非常混乱,因为查看以下sql: $sql = SELECT * FROM table WHERE 1 然后,如果您添加了OR语句(如果满足条件): if(isset($_POST['OR'])){ $sql. = " OR peaches = :good"; } 然后查询将返回其中1或peaches=:good 我再次理解带有AND的部件,但我不理解如何设置OR

我有两个问题,第一个问题是,我需要使用和/或在其中进行动态查询。我完全理解AND部分(我已经做了很多),但是,OR部分对我来说非常混乱,因为查看以下sql:

$sql = SELECT * FROM table WHERE 1
然后,如果您添加了OR语句(如果满足条件):

if(isset($_POST['OR'])){
   $sql. = " OR peaches = :good";
}
然后查询将返回其中1或peaches=:good

我再次理解带有AND的部件,但我不理解如何设置OR部件

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

$sql.=“按anum分组”//不管发生什么事,我总是按anum分组
如果($count!==“”){//如果count不是“”
$sql.=“HAVING COUNT(session.anum):COUNT”;//然后我希望用户能够选择操作符(><=>==)和要使用的动态编号
$placeholder[':count']=$count;//然后将key:count添加到值为$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的目的


任何帮助都很好

问题1:
一些开发人员在使用可选搜索词时使用
WHERE 1
的原因是
TRUE和
之类的表达式始终等于
。这是基本的布尔代数

表达式的情况并非如此
TRUE或
总是简单地
TRUE
。您可以修改基本查询以使用
WHERE 0
,这样当您附加
术语时,它将显示为
WHERE 0或
。任何表达式,如
FALSE或
总是等于

如果需要在同一SQL查询中同时支持
以及
,则需要开始在术语周围加括号,以便它们按照您想要的方式进行计算。我不打算在这个答案中解释。但只要说,当您混合使用
以及
术语时,简单地将术语附加在
=
中是行不通的

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

  • 不是表名
  • 不是列名
  • 非值列表(如()
谓词中的
  • 不是SQL关键字
  • 不是表情
  • 非操作员
  • 必须使用字符串插值在HAVING子句中包含用户选择的运算符


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

    对于第一个问题,问题到底是什么

    对于第二种情况,表示不能在具有
    子句的
    上使用函数。
    您可以这样做:

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

    我在读字符串插值。至于白名单,我想检查变量$count,看看它是否包含任何其他内容,然后5个运算符和1-10之间的数字应该足以作为白名单,这样我就可以在HAVING子句之后将变量添加到查询中,否?是的,应该可以。只要你过滤输入,它就不会包含任何你不期望的内容。非常感谢。当我在这里结束时,我将接受您的答案并更新OPU。事实上,您可以在HAVING子句中使用包含聚合函数或标量函数的表达式。当
    SQL\u MODE=ONLY\u FULL\u group\u BY
    有效时,本手册提到使用组不明确表达式。Yor
    具有
    语句会遗漏用于比较的运算符…$count作为运算符+数字正确,但不会显示错误?
    SELECT *, COUNT(session.anum) AS total GROUP BY session.anum HAVING total > :count