使用 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 上引入了两个附加功能:使用__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 语句。我在开发中使用过这个项目,强烈推荐。

【讨论】:

以上是关于使用 PHP PDO 设计数据库抽象类的主要内容,如果未能解决你的问题,请参考以下文章

PHP系列数据库抽象层pdo

初识PDO数据库抽象层

面向对象第七天----数据库抽象层PDO

pdo

PHP5中PDO的简单使用

PDO