使用 PHP PDO 设计数据库抽象类
Posted
技术标签:
【中文标题】使用 PHP PDO 设计数据库抽象类【英文标题】:Database abstraction class design using 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 - 如果你碰巧把它放在答案中,我很乐意选择它。 【参考方案1】:也许对您来说似乎很简单,因为 PDO 本质上是一个数据库抽象类。这意味着:工作已经完成。
【讨论】:
没错,这就是我提出这个问题的原因。那里有很多数据库抽象类和 whizbangs,我似乎错过了一些东西......很高兴知道我并没有完全失去我的摇滚乐。【参考方案2】:是的,这是一个好的开始。 PDO + singleton 是一种常用且很棒的组合。因为我个人不喜欢使用单例所涉及的所有类型,所以我写了a very lightweight database class。
它仅在 PDO 上引入了两个附加功能:使用__callStatic
(DB::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 语句。我在开发中使用过这个项目,强烈推荐。
【讨论】:
以上是关于使用 PHP PDO 设计数据库抽象类的主要内容,如果未能解决你的问题,请参考以下文章