gpt4 book ai didi

php - PDO、Mysql 和原生准备好的语句

转载 作者:可可西里 更新时间:2023-11-01 06:33:30 28 4
gpt4 key购买 nike

到目前为止,我对 PDO 的理解是,PDO 将在可能的地方使用真正的准备好的语句,并在不能的地方模拟它们。我还了解到,在涉及 mysql 的地方,只要您与支持它们的 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 命令(准备命令和执行命令)所以对于任何只执行一次的准备好的语句你实际上可能会比模拟的性能稍差准备好的声明。对于必须在循环中运行的查询,真正的准备好的语句可能会执行得更好,但这种情况在 PHP 通常用于的请求/响应模型类型中相对较少。

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

最佳答案

Does PDO really not use prepared statements with mysql?

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

If not, can it be forced to do so

通过使用 PDO::ATTR_EMULATE_PREPARES 设置,这个名字是不言自明的。

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

should you do that?

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

关于php - PDO、Mysql 和原生准备好的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8296399/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com