我最近发现PHP中默认将ATTR_EMULATE_PREPARES
设置为true。这个论坛包含几个帖子,建议将ATTR_EMULATE_PREPARES
设置为false,这就是我决定做的事情:
$this->pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
这是一个简单的更改,设置此属性不会影响系统中存在的任何SQL查询。毕竟,在查询SELECT column1, column2 FROM table WHERE column3 = ?
中,如果参数是由MySQL服务器解释的实际参数或由PDO提供的(转义)值替换,则查询结果无关紧要。
然而,今天我遇到了一个奇怪的错误。我有一个查询ALTER TABLE table ADD COLUMN column INT NULL DEFAULT ?
,在将标志设置为不模拟查询参数后突然失败。
我怀疑,由于某种原因,DEFAULT
值不能作为参数;它必须是硬编码的值。因此,当PDO模拟语句时,MySQL服务器会收到查询,而不会注意到DEFAULT
值最初是参数而不是硬编码值。如果没有仿真,MySQL服务器会抛出语法错误,因为它不支持DEFAULT
参数值。
所以我的问题是:是否可以让PDO 不模拟查询语句,但只能模拟DEFAULT
值?或者我应该在创建包含DEFAULT
子句的数据库架构调整查询时自己尝试这样的模拟吗?
或者我应该只是再次打开ATTR_EMULATE_PREPARES
以避免错误?
答案 0 :(得分:0)
不,没有这样的方法。
如果您严格要关闭仿真模式,则可以在执行数据修改查询和数据库不支持预准备语句的其他语句时临时还原其状态。执行此特定查询后,将仿真模式恢复为关闭状态。
或者您可以永久保持仿真模式。这里唯一的不便是无法在execute()中绑定LIMIT参数。