我使用的是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(!!!)个用法构建了查询。每次添加占位符时,都需要在许多地方检查代码以使其正常。
有任何设置或调整可以绕过此设置吗?
就在这里。您可以打开仿真模式,并且可以多次使用相同的占位符。
因此,仅在关闭仿真时才能观察到所描述的行为。我真的不明白为什么会这样,但是这是Wez Furlong(PDO作者)的解释:
进行更改的原因有两个:首先,如果在绑定中重用同一变量,则在使用某些驱动程序时可能会导致崩溃。无法保证做正确的事,有时可以使用触发崩溃的方法作为安全漏洞的攻击手段。 第二个原因是可移植性。一些驱动程序将在内部执行此检查并出错。如果您针对不执行此操作的驱动程序进行编码,则您的代码将不适用于未执行此操作的驱动程序。 http://paul-m-jones.com/archives/243#comment-740
进行更改的原因有两个:首先,如果在绑定中重用同一变量,则在使用某些驱动程序时可能会导致崩溃。无法保证做正确的事,有时可以使用触发崩溃的方法作为安全漏洞的攻击手段。
第二个原因是可移植性。一些驱动程序将在内部执行此检查并出错。如果您针对不执行此操作的驱动程序进行编码,则您的代码将不适用于未执行此操作的驱动程序。
http://paul-m-jones.com/archives/243#comment-740