【问题标题】:PDO replacing mysqliPDO 替换 mysqli
【发布时间】:2013-08-22 00:20:48
【问题描述】:

我确信我需要迁移到 PDO 并且正在努力完成。到目前为止,我有两个问题...

(1) 是否总是适合使用准备好的语句?如果我只是想从一个表中列出一组或多个记录,而该表上只有一个查询,该怎么办?准备好的语句不会减慢第一个查询的速度吗?

(2) 假设我有一个包含 10 个字段的表。我可以声明一个只有六个字段的类,然后使用 PDO::FETCH_CLASS, "foo" 其中 "foo" 是我的缩写类吗?

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    差异被认为可以忽略不计。真的。没有人报告过由准备好的语句引起的性能问题(虽然,真正使用它们的人太少了,不仅告诉其他人使用它们,而且无论如何)。

    IF 这个假想的问题仍然困扰你太多,PDO 为你提供了一种模拟模式,当没有使用真正的准备并且只执行一次到数据库的往返时,就好像根本没有使用准备好的语句.同样安全。

    所以 - 是的,总是使用准备好的语句。养成习惯就好了。

    我发现FETCH_CLASS 的这种愚蠢的语法糖毫无用处,我自己也从未使用过。但是,如果您要求获得懒惰的许可并使用 * 而不是手动列出所有六个必填字段 - 为什么不试试看呢?

    瓷砖上的注释: 虽然没有技术原因来替换 mysqli(因为这个 改进的 mysql 库被认为与 PDO 一样好),但是,因为您很可能会使用原始 API 调用应用程序代码,PDO 确实是旧 mysql ext 更好的替代品

    【讨论】:

    • 我对 PDO 与 mysqli 中准备好的语句的理解是,使用 PDO 可以命名参数;而在 mysqli 他们不能。因此,似乎对 PDO 进行全面探索是迄今为止最好的整体方法。感谢所有花时间回复的人。
    【解决方案2】:
    1. 我认为尽可能优先考虑准备好的语句是一种很好的做法。我在公司的一个大流量项目 (*) 中使用了 PDO,我们发现像 require_once 这样的调用比 PDO 查询更成问题(至少在我们的架构中)。

    2. 是的,但其他 4 个字段仍然可用。例如:

    class Foo {
        private $col1;
        private $col2;
    
        public static function findAll()
        {
            $pdo = new PDO(...);
            $query = $pdo->prepare('SELECT * FROM foo');
            $query->execute();
            return $query->fetchAll(PDO::FETCH_CLASS, 'Foo');
        }
    }
    
    print_r(Foo::findAll());
    

    假设表 'foo' 有 col1、col2、col3 和 col4 列,那么上面的代码将导致:

    Array
    (
        [0] => Foo Object
            (
                [col1:Foo:private] => 1
                [col2:Foo:private] => 2
                [col3] => 3
                [col4] => 4
            )
    ...
    )
    
    • 只是为了给你一些观点:这是一场有点简单的全州在线选举,在大众媒体工具中宣布,持续了大约 40 个小时。我们州的活跃选民超过 800 万,但投票的人数不到 100 万。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 2012-02-26
      • 2021-01-03
      • 1970-01-01
      相关资源
      最近更新 更多