gpt4 book ai didi

php - 动态 PDO 查询 - 使用 AND/OR

转载 作者:行者123 更新时间:2023-11-29 02:28:39 24 4
gpt4 key购买 nike

我有两个问题,第一个问题如标题所述,我需要在其中进行带有 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 的目的。

任何帮助都会很棒

最佳答案

问题 1:
一些开发人员使用 WHERE 1 的原因当他们有可选的搜索词时,像 TRUE AND <condition> 这样的表达式始终等于 <condition> .这是基本的 bool 代数。

但是对于OR却不是这样的表达式。 TRUE OR <condition>总是很简单 TRUE .您可以修改基本查询以使用 WHERE 0这样当你附加一个 OR结果显示为 WHERE 0 OR <condition> .任何类似 FALSE OR <condition> 的表达式始终等于 <condition> .

如果你需要同时支持 ANDOR在同一个 SQL 查询中,您需要开始在术语周围加上括号,以便它们按照您想要的方式进行计算。我不打算解释boolean algebraMySQL's operator precedence在这个 StackOverflow 答案中。但只要简单地附加 .= 就够了当您混合使用 AND 时将无法工作和 OR条款。

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

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

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

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

关于php - 动态 PDO 查询 - 使用 AND/OR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16598065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com