到目前为止我对 PDO 的理解是,PDO 将在可以的地方使用真正的准备好的语句,在不能的地方模拟它们。我还了解到,就 mysql 而言,如果您正在与支持它们的 mysql 版本进行通信,则将使用真正准备好的语句。
事实上,MySQL PDO 驱动程序的 PHP 手册页也说了同样的内容。http://php.net/manual/en/ref.pdo-mysql.php http://php.net/manual/en/ref.pdo-mysql.php
然而,在另一个问题上我正在帮忙如何用数组中的元素替换所有出现的 char? https://stackoverflow.com/questions/8294585/how-to-replace-all-occurencies-of-char-with-elements-from-array,有人评论说这不是真的,事实上 PDO 在与 MySQL 数据库对话时模拟准备好的语句。
我没有太多运气找到证据来支持其中提出的主张,但我确实发现有一个 PDO::ATTR_EMULATE_PREPARES 属性可以配置为切换准备好的语句模拟。
那么事情的真相是什么呢? PDO 真的不使用 mysql 的准备语句吗?如果不可以,是否可以强制这样做?如果可以,是否应该这样做?我一直认为 mysql 有真正准备好的语句,PDO 会使用它们,正如手册中所声称的那样。说明书不准确吗?
编辑添加:我最近读了几篇文章,至少给出了为什么默认情况下禁用真正准备好的查询的合理理由。 PHP 脚本的生命周期往往很短,仅运行足够长的时间才能生成对请求的响应,之后所有资源都会被释放。对于每个请求只执行一次的任何查询,您实际上必须执行 2 个 SQL 命令(准备命令和执行命令),因此对于只执行一次的任何准备好的语句,您实际上可能会获得比模拟的性能稍差的性能准备好的声明。对于必须在循环中运行的查询,真正的准备好的语句可能会执行得更好,但这种情况在 PHP 通常使用的请求/响应模型类型中相对较少。
我仍然认为真正的准备好的语句更好,但至少我对为什么 PDO 默认使用模拟查询有一个合理的解释。
PDO 真的不使用 mysql 的准备语句吗?
是的,默认情况下(至少在我测试的版本中),但可以手动打开本机模式。
如果不是,是否可以强制这样做
通过雇用PDO::ATTR_EMULATE_PREPARES
设置,这个名字很不言自明。
$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
你应该这样做吗?
这是所有问题中最难的问题。
好吧,我会说 - 是的,你应该这样做。如果您选择 PDO 作为数据库驱动程序,则在仿真模式下使用它是没有意义的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)