当前位置: 首页 > 面试题库 >

为什么PDO不允许多个同名占位符?

万俟英锐
2023-03-14
问题内容

我使用的是PHP,而MySQL使用的是PDO。有时我需要准备一个在此查询中多次使用一个变量(占位符)的语句。

例:

SELECT * FROM messages WHERE from_id = :user OR to_id = :user

但是,如果我尝试准备该语句,则会出现错误,因此我需要采用以下方式:

SELECT * FROM messages WHERE from_id = :user1 OR to_id = :user2

调用此语句,我将需要具有以下数组:

array('user1'=>$user_id, 'user2'=>$user_id);

对我来说真是太蠢了!为什么MySQL(PDO?)不允许我多次使用一个占位符,并迫使我使用需要更多控制权的额外变量?

如果查询相对简单(如我在上面发布的内容),则可以轻松处理,但是现在我使用单个变量的5(!!!)个用法构建了查询。每次添加占位符时,都需要在许多地方检查代码以使其正常。

有任何设置或调整可以绕过此设置吗?


问题答案:

有任何设置或调整可以绕过此设置吗?

就在这里。您可以打开仿真模式,并且可以多次使用相同的占位符。

因此,仅在关闭仿真时才能观察到所描述的行为。我真的不明白为什么会这样,但是这是Wez Furlong(PDO作者)的解释:

进行更改的原因有两个:首先,如果在绑定中重用同一变量,则在使用某些驱动程序时可能会导致崩溃。无法保证做正确的事,有时可以使用触发崩溃的方法作为安全漏洞的攻击手段。

第二个原因是可移植性。一些驱动程序将在内部执行此检查并出错。如果您针对不执行此操作的驱动程序进行编码,则您的代码将不适用于未执行此操作的驱动程序。

http://paul-m-jones.com/archives/243#comment-740



 类似资料:
  • 问题内容: 我在同一文件中有以下程序。我已经同步了run()方法。 输出是 我的问题是,为什么同步方法同时允许“我的线程1”和“我的线程4”线程访问? 问题答案: 方法在实例级别工作。 类的每个实例都有自己的锁。每次输入实例的任何方法都将获取该锁。这样可以防止多个线程 在同一个实例上 调用方法(请注意,这还可以防止在同一个实例上调用 不同的 方法)。 现在,由于您有两个类实例,因此每个实例都有自己

  • 在Java中,不允许多重继承,但是在Java8之后,接口可以有默认方法(可以实现方法本身),就像抽象类一样。在此上下文中,还应该允许it多重继承。

  • 问题内容: 我经常发现自己想要这样做。当您要存储一些有用的信息或其他状态时,它可能非常有用。 所以我的问题是,是否有很好的理由来禁止这样做? 谢谢 编辑:非常感谢所有这些答案。因此,听起来这没有正确或错误的答案。 假设我接受这些类都不是子类的事实,那么 不 将Control类标记为final,而是禁止子类的意义是什么-有效地将异常/错误从编译时降级为运行时? 编辑^ 2:对此,请参阅我自己的回答:

  • 如果字符串包含以下内容,则该字符串是有效的浮点数: 可选“-”(U+002D)字符。 按照给定的顺序,下列一项或两项: 一个或多个ASCII数字的序列。 一个单一的“。(u+002e)字符。 一个或多个ASCII数字的序列。 “E”(U+0065)字符或“E”(U+0045)字符。 可选“-”(U+002D)字符或“+”(U+002B)字符。 一个或多个ASCII数字的序列。 null 在IE11

  • 问题内容: W3指定表列(带有元素)仅允许使用四个CSS规则- 边框,背景,宽度和可见性。 有人知道这个决定的原因吗?如果可以使用边框和背景,为什么不使用字体和颜色呢? 问题答案: IanHixie在这里详细解释:为什么只有四个属性应用于表列的奥秘。相关报价: 文本的颜色取决于其元素的“颜色”属性。除非指定,否则“ color”属性(基本上)默认为“ inherit”,这意味着“采用父元素的值”。

  • 问题内容: 我读了这个问题,并认为如果可以写的话,很容易解决(不是没有它就不能解决): 我不确定在很多情况下它是否有用,但是我想知道为什么它没有用,以及其他语言中是否存在类似的东西。 你们有什么感想? 编辑: 澄清一下:是的,我知道,这在Java中是不可能的,我也不是很想念它。这不是我期望的工作,并且惊讶于出现编译器错误。我只是有这个主意,喜欢讨论它。 问题答案: 它违反了封装。你不应该能够绕过父