【问题标题】:Does PDO always use emulated prepared statements by default?默认情况下,PDO 是否总是使用模拟的准备好的语句?
【发布时间】:2012-05-16 10:54:47
【问题描述】:

PDO 具有选项PDO::ATTR_EMULATE_PREPARES,它控制是否应仅在 DB 不支持或始终不支持的情况下模拟准备好的语句。但是,它没有提到它是否总是默认模拟它们。

通常人们会假设只有在必要时才使用仿真,但由于它是 PHP,所以不能仅仅因为它是理智的而假设...

【问题讨论】:

  • 谁能告诉我仿真是什么意思?它有多糟糕?
  • ->prepare() 调用期间不会进行错误检查,PDO 需要转义您的参数,而不是单独将它们传输到数据库。当您准备一条语句并执行多次时,它也不会从数据库可能能够执行的优化中受益。
  • @Shubham 在这种情况下,这意味着使用字符串转义而不是实际准备好的语句。转义 allows for SQL injection,而准备好的语句完全阻止它。

标签: php pdo prepared-statement


【解决方案1】:

取决于数据库驱动程序。它们是默认为 MySql 模拟的 always(当然您可以手动关闭该选项);在 Postgres 中,正确的默认设置是 detected dynamically

【讨论】:

  • 这令人困惑。您的代码参考与文档有所不同:PDO_MYSQL 将利用 MySQL 4.1 及更高版本中存在的本机准备语句支持。如果您使用的是旧版本的 mysql 客户端库,PDO 将为您模拟它们。 (php.net/manual/en/ref.pdo-mysql.php)
  • @ZombieHunter:如果代码说的与文档不同,那么显然文档(或其解释)是错误的。在这种特定情况下,恕我直言,它应该是“可以利用”。文档一直都是错误的(PHP 比其他的更常见,这是典型的...sigh);我已经记不清有多少次自己在文档中发现彻头彻尾的谎言了。
  • 我知道我宁愿相信您引用的代码而不是文档,但不敢相信。这真的很痛苦,您必须先检查 PHP 中的所有内容,然后才能信任它:-/
  • "如果代码说明的内容与文档不同,那么显然文档(或其解释)是错误的"——不一定:代码可能有问题。一般来说,我认为文档是正确行为的规范;任何与代码不一致的地方都是实现错误。
  • PDO MySQL 似乎有numerous open bugs 与使用非模拟准备好的语句相关。也许这就是他们不愿意默认打开它的原因之一。
猜你喜欢
  • 2020-03-26
  • 1970-01-01
  • 2011-07-17
  • 2011-08-02
  • 2016-07-20
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多