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



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

示例:

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

相关内容

  • 没有找到相关文章

最新更新