5年前(真的!)Wez Furlong是PDO的首席开发者,他写道:
我建议您在使用时使用以下属性PDO::MYSQL,可在当前PHP 5.1.3候选版本中使用快照:
$ db -> setAttribute (PDO:: ATTR_EMULATE_PREPARES,真的);
这会导致使用PDO本机查询解析器而不是本地准备语句api在mysql客户端,并有效地消除这些问题
原理见http://wezfurlong.org/blog/2006/apr/using-pdo-mysql/
然而,他无法回答问题是否已经得到纠正,现在PDO正在使用Mysqlnd(至少我认为是)。
有人知道吗?
是的,如果您将ATTR_EMULATE_PREPARES
设置为false
(或0
),它将使用真正的预处理语句。
。它仍然有所有的回退逻辑。因此,如果来自服务器的准备失败,mysqli::prepare就会失败,而PDO则不会,因为它会退回到模拟准备。这样做的原因是PDO可以在不支持它的MySQL版本上使用预处理语句,以及不支持预处理的语句(如ALTER
)。
所以它将使用真正的准备语句,只要MySQL允许(再次,只有当ATTR_EMULATE_PREPARES
为false)…