我最近发现ATTR_EMULATE_PREPARES
默认在PHP中设置为true。本次论坛包含了几个帖子,其建议设置ATTR_EMULATE_PREPARES
为false,所以这就是我决定做:如何在ATTR_EMULATE_PREPARES关闭时模拟PDO中的DEFAULT参数?
$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
只是为了避免错误?
什么是具体的错误信息?是的,MySQL对哪些语句允许参数化有一些限制。表声明并不真正适用于值绑定和表达式(很像'LIKE'子句)。 – mario
@mario错误信息是关于语法无效的,因为查询中的'?'字符不明白(当语句没有准备好时)。 – user2180613