【问题标题】:Database abstraction class design using PHP PDO使用 PHP PDO 设计数据库抽象类
【发布时间】:2011-03-17 08:54:27
【问题描述】:

我正在设计一个 Web 应用程序(真的,这是一种爱好,我正在尝试自学设计,还有什么比这样做更好的方法 :)。无论如何,我正在考虑如何处理我的数据库。我对PDO 很满意,并且我正在考虑在我的抽象类中利用 PDO。我正在考虑制作一个单例,以便只有一个数据库连接。这个单例会创建一个 PDO 连接。

在那之后,我不明白为什么我需要做太多其他事情。然后我可以使用数据库处理程序来调用 PDO 函数。我可能需要一些辅助函数,但是当它真正开始时,我只会使用 PDO 来进行实际的 SQL 查询。

这种方法有问题吗?与我使用的抽象类相比,它似乎过于简单。

【问题讨论】:

  • 数据库抽象是一个荒谬的神话。 ORM 是另一个故事,同样邪恶,但至少是真实的。
  • @Gordon,你能详细说明为什么我不需要单例吗?我一直听说你需要单例来确保没有同时写入之类的东西。
  • 一个 DB Singleton 不会解决任何并发问题。如果有的话,它可以确保您对于创建它的请求只有一个 PDO 实例。但为此您不需要 Singleton。 Just create a wrapper that lazy connects when needed 在您的引导程序中并将实例设置为您的 DAL 超类型。这样,您就不会将自己限制为只有一个 PDO 实例,以防您在某个时候需要第二个。
  • 谢谢 Gordon - 如果你碰巧把它放在答案中,我很乐意选择它。

标签: php oop pdo database-abstraction


【解决方案1】:

也许对您来说似乎很简单,因为 PDO 本质上是一个数据库抽象类。这意味着:工作已经完成。

【讨论】:

  • 没错,这就是我提出这个问题的原因。那里有很多数据库抽象类和 whizbangs,我似乎错过了一些东西......很高兴知道我并没有完全失去我的摇滚乐。
【解决方案2】:

是的,这是一个好的开始。 PDO + singleton 是一种常用且很棒的组合。因为我个人不喜欢使用单例所涉及的所有类型,所以我写了a very lightweight database class

它仅在 PDO 上引入了两个附加功能:使用__callStaticDB::query() 而不是DB::instance()->query())访问(惰性)PDO 实例和两个更容易引用的函数(DB::q('INSERT INTO table (name) VALUES (?s)', $_POST['insecure_name']))。也许你想看看两者,它真的很方便;)

【讨论】:

    【解决方案3】:

    你不需要单例。

    数据库 Singleton 不会解决任何并发问题。如果有的话,它可以确保您只有一个 PDO 实例用于创建它的请求。它提供了全球访问,许多人认为这是一件坏事。另外you have to make some extra effort when testing the Singleton.

    在您的引导程序中需要时只需 create a wrapper that lazy connects and stores the instance 并将实例设置为您的 DAL supertype,例如 TableDataGateway。此外,这样您就不会仅限于一个 PDO 实例,以防万一您在某个时候需要第二个。

    【讨论】:

      【解决方案4】:

      您可能还对php-pdo-wrapper-class 项目感兴趣。它是一个轻量级的数据库类,它扩展了 PDO,添加了几种方法——插入、更新、删除、选择(以及其他一些方法)——用于简化常见的 SQL 语句。我在开发中使用过这个项目,强烈推荐。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-14
        • 2012-01-04
        • 2018-09-05
        • 2011-03-13
        • 1970-01-01
        • 2011-02-19
        • 2012-07-20
        • 1970-01-01
        相关资源
        最近更新 更多