PDO,Mysql和本地准备的语句
到目前为止,我对PDO的理解是,PDO将使用真实的准备好的语句,并在无法使用的地方模拟它们。 我还了解到,在涉及mysql的情况下,如果您正在与支持它们的mysql版本进行通信,则会使用真实的准备好的语句。
事实上,MySQL PDO驱动程序的PHP手册页也是如此。 http://php.net/manual/en/ref.pdo-mysql.php
然而,在另一个SO问题上,我正在帮助如何用数组中的元素替换char的所有事件? ,有人发表评论说这不是真的,事实上PDO在与MySQL数据库交谈时模拟预准备语句。
我没有多少运气找到证据来支持这些声明,但我确实发现有一个PDO :: ATTR_EMULATE_PREPARES属性可以配置为切换准备好的语句模拟。
那么问题的真相是什么? PDO是否真的不使用MySQL准备好的语句? 如果没有,是否可以被迫这样做,如果是的话,你应该这样做吗? 我一直认为,正如手册中所声称的,由于mysql具有PDO将使用它们的真实准备语句。 手册是否不准确?
编辑要添加 :我最近阅读了几篇文章,至少给出了一个体面的理由,为什么真正准备好的查询默认是禁用的。 PHP脚本通常是短暂的,只能运行足够长的时间才能生成对请求的响应,然后解除分配所有资源。 对于任何查询,每个请求只执行一次,你实际上必须执行2条SQL命令(prepare命令和execute命令),因此对于只执行一次的准备好的语句,实际上可能会比仿真的性能稍差准备好声明。 对于必须在循环中运行的查询,实际准备的语句可能会表现更好,但这种情况在PHP通常用于的请求/响应模型类型中相对较少。
我仍然认为准备好的声明是可取的,但至少我有一个合理的解释,为什么PDO默认使用模拟查询。
PDO是否真的不使用MySQL准备好的语句?
是的,默认情况下(至少在我测试过的版本中),但可以手动打开纯模式。
如果没有,它是否可以被迫这样做
通过使用PDO::ATTR_EMULATE_PREPARES
设置,名称非常PDO::ATTR_EMULATE_PREPARES
。
$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
你应该这样做吗?
这是他们所有人中最难的问题。
那么,我会说 - 是的,你应该。 如果您选择PDO作为您的数据库驱动程序,则在仿真模式下使用它没有意义。