2016-09-18 28 views
1

我最近发现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只是为了避免错误?

+0

什么是具体的错误信息?是的,MySQL对哪些语句允许参数化有一些限制。表声明并不真正适用于值绑定和表达式(很像'LIKE'子句)。 – mario

+0

@mario错误信息是关于语法无效的,因为查询中的'?'字符不明白(当语句没有准备好时)。 – user2180613

回答

0

不,没有这样的方式。

如果您严格希望保持模拟模式关闭,那么在执行数据修改查询和其他数据库不支持预准备语句的语句时,您可以暂时恢复其状态。执行此特定查询后,将仿真模式恢复为关闭状态。

或者您可以永久保持仿真模式。这里唯一的不便是无法在execute()中绑定LIMIT参数。