2012-06-06 51 views
1

我需要一些关于如何为我正在处理的项目创建\处理数据库连接的建议\建议。我正在为使用PHP 5.4.3的公司创建一个简单的工作订单系统,现在没有任何类型的身份验证,因为我没有准备好复杂性。到目前为止,我计划在以下结构PHP类中的数据库连接

<? php 
class Db { 
    private static $dbh = null; 

    static function open_connection() { 
     self::$dbh = new PDO(... } 

    static function query($sql) { 
     $result = self::$dbh->... } 

    static function fetch_array($result){ 
     ...} 
... 

} 

class Workorder extends Db { 

    protected static $table_name = ... 
    ... 

    public $wonum; 
    ... 

    function instantiate { 
    //return workorder objects 
    ...} 

    function findallwos { 
    //find all work orders... 
    ...} 

...} 

我认为这将工作正常的页面,我需要显示所有的工作订单或放入新的工作订单。但是我有几个页面需要非常简单的查询,例如,如果我使用的是全局$ dbh变量,那么其中一个报告页面将只包含我们为我们工作的3名技术人员的下拉列表

function create_dropdown() { 
    GLOBAL $dbh; 

    $sql = "select..."; 
    $sth = $dbh->prepare($sql); 
    $sth->execute(); 
    $arry = $sth->fetchAll(PDO::FETCH_ASSOC); 
    ..... 

但是我宁愿远离全局变量,因为最终我想将未来的复杂性添加到这个可能不适用于全局变量的网站。 (包括多个认证用户等)。所以我的问题是:

我不应该像我设计的那样使用Db类,而是使用某种类型的connection_factory类来传递连接吗? (并没有我的工单类是任何东西的延伸)

我应该只使用静态调用Db类来拉简单的查询吗? db::fetch_array...

或者你们有其他建议吗?我遇到了很多不同的方法来解决这个问题,但理想情况下,我想设计这个,这样我就不需要完全重新编码所有东西,当我添加不同的用户时权限等

+0

你有没有考虑过使用现有的,经过测试和验证的解决方案?有时像教条? –

+0

如果你想要一些可扩展的(准备稍后),停止使用静态。你只能失败。 [你需要一个服务?](http://i.stack.imgur.com/azYOV.png) – hakre

+0

@PeterBailey我没有使用库或框架的问题,但因为我还是PHP新手,我宁愿做这个第一个网站的难题就是这样,所以我知道将来如何正确使用图书馆。 – dangel

回答

1

我个人会批评你提供的代码设计是你不要separate concerns,并且没有抽象。不要犯这么多错误,将SQL语句,演示文稿类型和您的业务逻辑混合到您的代码中。在某些情况下,您可能需要切换数据库产品,创建移动版本,添加功能......然后您需要更改数十个文件。

为了防止这些事情在一般情况下,我建议这样的方法:

  • 创建实体及其关系的清洁和轻量级模型和不关心的持久性(即数据库),访问(例如,简单的类Workorder,其中包含Employee类,...)
  • 编写定义模型上必要的持久性操作的接口(即saveWorkorder(Workorder $ workorder),getAllWorkorders() ,loadWorkorder(),...)。在你的代码中,只提及这些接口及其提供的方法,而不参考具体的实现
  • 现在,使用某个数据库实现持久化接口的类。不要忘记将基本的数据库操作封装在类中,并且您将在许多持久性类中使用它们。

我希望我的回答不太含糊,但软件设计是一个非常广泛的领域,很难涵盖所有方面的一个单一的答案。和所有关于软件设计的问题一样,没有正确或错误的解决方案,因为它很大程度上取决于具体项目,要求,个人编码风格等。如果你打算做更多类似的项目,它可能会花费时间来获得一个框架(如Zend Framework,Symphony,CakePHP等等)的知识,因为它们提供了你有很多现成的功能,你可以使用开箱即用,如数据库连接器,视图和业务逻辑的分离,...