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