到目前为止,我对PDO的理解是,PDO将在真实准备的语句可用的地方使用它,并在不能使用的地方模拟它们。我还了解到,在涉及mysql的情况下,如果您正在与支持它们的mysql版本进行通信,则会使用真实的准备好的语句。PDO,Mysql和本地准备的语句
事实上,MySQL PDO驱动程序的PHP手册页也是这么说的。 http://php.net/manual/en/ref.pdo-mysql.php
但是,在另一个SO问题上,我在How to replace all occurencies of char with elements from array?上提供了帮助,有人提出这样的说法并非如此,事实上PDO在与MySQL数据库交谈时模拟准备好的语句。
我没有太多的运气找到证据来支持那里的声明,但我确实发现有一个PDO :: ATTR_EMULATE_PREPARES属性可以配置为切换准备好的语句模拟。
所以事情的真相是什么? PDO是否真的不使用MySQL准备好的语句?如果没有,是否可以被迫这样做,如果是的话,你应该这样做吗?我一直认为,正如手册中所声称的,由于mysql具有PDO将使用它们的真实准备语句。手册是否不准确?
编辑添加:我最近阅读了一些文章,至少给出了一个合理的理由,说明为什么实际准备好的查询默认是禁用的。 PHP脚本通常是短暂的,只能运行足够长的时间才能生成对请求的响应,然后解除分配所有资源。对于任何查询,每个请求只执行一次,你实际上必须执行2条SQL命令(prepare命令和execute命令),因此对于只执行一次的准备好的语句,实际上可能会比仿真的性能稍差准备好声明。对于必须在循环中运行的查询,实际准备的语句可能会表现更好,但这种情况在PHP通常用于的请求/响应模型类型中相对较少。
我仍然认为实际准备好的声明是可取的,但至少我有一个合理的解释,为什么PDO默认使用模拟查询。
感谢您的回复。但它确实乞讨的问题,但如果它支持它,那么为什么它默认关闭? – GordonM
这是兼容性问题,我相信。 –