首页 > 数据库 > mysql教程 > PDO MySQL:准备语句还是查询缓存?您应该优先考虑哪一个?

PDO MySQL:准备语句还是查询缓存?您应该优先考虑哪一个?

Patricia Arquette
发布: 2024-12-11 03:08:09
原创
894 人浏览过

PDO MySQL: Prepared Statements or Query Cache? Which Should You Prioritize?

PDO MySQL:利用查询缓存和预准备语句安全性

MySQL 提供本机预准备语句和查询缓存以实现优化和安全。然而,问题出现了:在 PDO 配置中应该优先考虑哪些?

揭穿神话

普遍的看法是:

  • PDO 的预准备语句模拟提供了更好的性能。
  • MySQL 的本机预准备语句增强了安全性防止 SQL 注入。
  • MySQL 的原生准备语句提供更好的错误报告。

但是,这些语句可能不适用于最新的 MySQL 和 PHP 版本。

性能与安全性

在性能方面,MySQL 版本 5.1.17 或更高的允许使用准备好的语句进行查询缓存。因此,可以利用较新的 MySQL 和 PHP 版本同时利用性能和安全性。

关于安全性,本机准备好的语句不提供针对 SQL 注入的额外保护。 PDO 已经转义了查询参数值,并且此过程不受 EMULATE_PREPARES 设置的影响。

错误报告

本机准备好的语句在准备过程中会触发语法错误,而模拟准备时语句将此类错误推迟到执行时间。这会影响您编写的代码,尤其是使用 PDO::ERRMODE_EXCEPTION 时。

其他注意事项

  • 本机预准备语句在准备期间会产生固定成本。因此,如果不重用预准备语句,则模拟预准备语句可能会提供轻微的性能优势。
  • 本机预准备语句的查询计划可能会被缓存和共享,但在 MySQL 中尚不知道这种情况发生。

建议

对于较旧的 MySQL 和 PHP 版本,建议模拟准备好的语句。但是,对于较新的版本,应使用本机准备好的语句(通过关闭仿真)。

自定义 PDO 连接函数

下面是 PDO 连接的代码片段具有最佳设置的功能:

function connect_PDO($settings) {
    $emulate_prepares_below_version = '5.1.17';

    $dsnpairs = [];
    foreach ($settings as $k => $v) {
        if ($v !== null) {
            $dsnpairs[] = "{$k}={$v}";
        }
    }

    $dsn = 'mysql:'.implode(';', $dsnpairs);
    $dbh = new PDO($dsn, $settings['user'], $settings['pass']);

    $serverversion = $dbh->getAttribute(PDO::ATTR_SERVER_VERSION);
    $emulate_prepares = (version_compare($serverversion, $emulate_prepares_below_version, '<'));
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, $emulate_prepares);

    return $dbh;
}
登录后复制

通过利用此功能或根据您的特定偏好对其进行自定义,您可以在性能之间实现理想的平衡以及 PDO 连接的安全性。

以上是PDO MySQL:准备语句还是查询缓存?您应该优先考虑哪一个?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板