gpt4 book ai didi

php - 如何在 ATTR_EMULATE_PREPARES 关闭时模拟 PDO 中的 DEFAULT 参数?

转载 作者:行者123 更新时间:2023-11-30 22:12:39 25 4
gpt4 key购买 nike

我最近发现 ATTR_EMULATE_PREPARES 在 PHP 中默认设置为 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 以避免出错吗?

最佳答案

不,没有这样的方法。

如果你确实想保持模拟模式关闭,你可以在执行数据修改查询和其他你的数据库不支持准备语句的语句时临时恢复它的状态。执行此特定查询后关闭仿真模式。

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

关于php - 如何在 ATTR_EMULATE_PREPARES 关闭时模拟 PDO 中的 DEFAULT 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39552902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com