为什么PDO不允许多个具有相同名称的占位符?

时间:2017-02-15 08:25:43

标签: php mysql pdo placeholder

我使用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个(!!!)单变量的使用。每次添加占位符时,我都需要在很多地方检查代码以使其正常。

是否有任何设置或调整可以绕过这个?

1 个答案:

答案 0 :(得分:10)

  

是否有任何设置或调整可以绕过这个?

是的,有。 You can turn emulation mode ON并且能够多次使用相同的占位符。

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

  

这项改变有两个原因;首先,如果在绑定中重复使用相同的变量,则在使用某些驱动程序时可能会导致崩溃。不可能保证做正确的事情,并且有一种方法来触发崩溃有时可以用作安全漏洞的攻击媒介。

     

第二个原因是便携性。一些驱动程序会在内部执行此检查并输出错误。如果您针对不强制执行此操作的驱动程序进行编码,那么您的代码将不适用于那些不执行此操作的驱动程序。

     

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