一尘不染

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

mysql

我使用的是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(!!!)个用法构建了查询。每次添加占位符时,都需要在许多地方检查代码以使其正常。

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


阅读 290

收藏
2020-05-17

共1个答案

一尘不染

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

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

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

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

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

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

2020-05-17