2017-02-15 107 views
3

我使用PHP和MySQL与PDO。有时我需要准备一个语句,其中有一个变量(占位符)在此查询中多次使用。为什么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(!!!)使用。每次我添加占位符时,我都需要在很多地方检查代码,以确保它正常。

是否有任何设置或调整来绕过此?

回答

6

是否有任何设置或调整来绕过此?

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

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

这个改变是由于两个原因造成的;首先,如果你重新使用绑定中的相同变量,那么在使用某些驱动程序时可能会导致崩溃。无法保证做正确的事情,并且有办法引发崩溃有时可以用作安全漏洞的攻击媒介。

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

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

+0

谢谢YCS!我最好避免使用仿真,因为准备好的语句执行速度应该较慢。对? –

+0

那么,仿真模式实际上*更快*但我不会说差异是显着的。上面的链接是我的文章,我讨论所有的利弊为每个模式 –

+0

更快?!哇,意想不到的事......在这种情况下,我会去找一个关于这个的阅读......谢谢! –

相关问题