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

Vla*_*aya 5 php mysql pdo placeholder

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

例:

SELECT * FROM messages WHERE from_id = :user OR to_id = :user
Run Code Online (Sandbox Code Playgroud)

但是,如果我将尝试准备此语句,我将出现错误,因此我需要以这样的方式执行此操作:

SELECT * FROM messages WHERE from_id = :user1 OR to_id = :user2
Run Code Online (Sandbox Code Playgroud)

要调用此语句,我需要有一个这样的数组:

array('user1'=>$user_id, 'user2'=>$user_id);
Run Code Online (Sandbox Code Playgroud)

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

如果查询相对简单(如我上面发布的那样),这可以很容易地处理,但现在我用5(!!!)使用单个变量构建了一个查询.每次添加占位符时,我都需要在很多地方检查代码以使其正常.

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

You*_*nse 10

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

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

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

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

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

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