繁体   English   中英

PDO,Mysql和本机准备语句

[英]PDO, Mysql and native prepared statements

到目前为止,我对PDO的理解是PDO将在可能的地方使用真正的预备语句,并在不可以的地方模拟它们。 我还了解到,在涉及mysql的情况下,如果您正在与支持它们的mysql版本进行通信,则将使用真正的预处理语句。

实际上,MySQL PDO驱动程序的PHP手册页说明了很多。 http://php.net/manual/zh/ref.pdo-mysql.php

但是,在另一个SO问题上,我在帮助如何用数组元素替换char的所有出现? ,有人评论说这是不正确的,事实上,PDO在与MySQL数据库对话时会模拟准备好的语句。

我没有太多运气找到证据来支持提出的声明,但是我确实发现有一个PDO :: ATTR_EMULATE_PREPARES属性可以配置为切换准备好的语句仿真。

那么事情的真相是什么? PDO真的不与mysql一起使用准备好的语句吗? 如果不是,是否可以强迫这样做?如果这样做,您应该这样做吗? 我一直认为,正如手册中所声称的那样,由于mysql具有PDO将使用它们的真正准备好的语句。 手册不正确吗?

编辑 :最近我阅读了几篇文章,至少对合理地禁用实际准备好的查询为何提供了合理的理由。 PHP脚本的生存期很短,只能运行很长时间才能生成对请求的响应,然后将其所有资源释放。 对于任何查询,每个请求仅执行一次,实际上您必须执行2条SQL命令(prepare命令和execute命令),因此对于仅执行一次的任何Prepared语句,您实际上可能会获得比模拟结果稍差的性能。准备好的声明。 对于必须在循环中运行的查询,实际的预准备语句可能会更好地执行,但是这种情况在通常用于PHP的请求/响应模型中相对较少。

我仍然认为最好使用真正的预备语句,但至少我对PDO为什么默认使用模拟查询有一个合理的解释。

PDO真的不与mysql一起使用准备好的语句吗?

是的,默认情况下(至少使用我测试过的版本),但是纯模式可以手动打开。

如果没有,是否可以强迫这样做

通过使用PDO::ATTR_EMULATE_PREPARES设置,该名称非常不言自明。

$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

你应该那样做吗?

这是所有人中最困难的问题。
好吧,我会说-是的,你应该。 如果选择PDO作为数据库驱动程序,则在仿真模式下使用它是没有意义的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM