2010-06-09 24 views
6

嗨,大家好,我对于pdo来说很新,所以我基本上只是使用我正在阅读的介绍性书籍中的信息将一个简单的连接类放在一起,但这种连接是否有效?如果有人有任何丰富的建议,我会很感激。任何改善我的PDO连接类的建议?

class PDOConnectionFactory{ 

    public $con = null; 
    // swich database? 
    public $dbType = "mysql"; 

    // connection parameters 

    public $host = "localhost"; 
    public $user = "user"; 
    public $senha = "password"; 
    public $db = "database"; 


    public $persistent = false; 

    // new PDOConnectionFactory(true) <--- persistent connection 
    // new PDOConnectionFactory()  <--- no persistent connection 
    public function PDOConnectionFactory($persistent=false){ 
     // it verifies the persistence of the connection 
     if($persistent != false){ $this->persistent = true; } 
    } 

    public function getConnection(){ 
      try{ 
       $this->con = new PDO($this->dbType.":host=".$this->host.";dbname=".$this->db, $this->user, $this->senha, 
       array(PDO::ATTR_PERSISTENT => $this->persistent)); 
       // carried through successfully, it returns connected 
       return $this->con; 
      // in case that an error occurs, it returns the error; 
      }catch (PDOException $ex){ echo "We are currently experiencing technical difficulties. ".$ex->getMessage(); } 

    } 

    // close connection 
    public function Close(){ 
     if($this->con != null) 
      $this->con = null; 
    } 

}

+1

我会重新命名'公共$ persistent'到'公共$ isPersistent'(口味有物质),也可以调整构造'if'线,而不是看只是简单的'$这个 - > isPersistent = $ persistent;'。其他'公共'变量($ con,$ dbType,$ host,$ user,$ senha,$ db)可能应该是'private'。在实施“工厂”时,通常是这样的,其他类,方法等使用它不必知道或关心连接,用户名,密码等。 – 2010-06-09 21:43:20

+0

欣赏它。 – Scarface 2010-06-09 22:08:02

+0

你知道这个过程是否有效吗?有没有更好的办法?我还没有时间更深入地学习编码模式和面向对象编程,所以我只是在寻找一个可以开始的地方,所以我可以维持我的网站,直到我更新它。 – Scarface 2010-06-09 22:11:26

回答

2

当执行一个“工厂”,通常它是如此,其他类,方法等使用它不必知道或关心的连接,用户名,密码等

我会做什么更像是:

static class PDOConnectionFactory { 
    // database 
    private $dbType = "mysql"; 

    // connection parameters 
    private $host = "localhost"; 
    private $user = "user"; 
    private $senha = "password"; 
    private $db = "database"; 

    // new CreateNewConnection(true) <--- persistent connection 
    // new CreateNewConnection()  <--- no persistent connection 
    public function CreateNewConnection($persistent = false) { 
     try { 
      $con = new PDO($dbType . ":host=" . $host . ";dbname=" . $db, $user, $senha, array(PDO::ATTR_PERSISTENT => $persistent)); 
      // carried through successfully, it returns connected 
      return $con; 
     } 
     catch (PDOException $ex) { 
      // in case that an error occurs, it returns the error; 
      echo "We are currently experiencing technical difficulties. We have a bunch of monkies working really hard to fix the problem. Check back soon: " . $ex->getMessage(); 
     } 
    } 
} 

然后,您可以使用CreateNewConnection()以任何您需要的方式返回的连接。

我没有检查上面的代码是否编译,可能会有一些错别字/问题,但你明白了。现在你需要更进一步,并实施类似存储库模式的东西:)

+0

感谢它nate – Scarface 2010-06-09 22:19:53

2

您可能会发现这篇文章有用,它是由Erik Wurzer和它被张贴在NETTUTS,这是我最喜欢的其他网站之一(除此之外)。
Why you Should be using PHP’s PDO for Database Access

希望这会有所帮助。

+0

好文章jnk,但他们也显示我正在使用的简单连接过程。我想这是一个很好的开始。 – Scarface 2010-06-09 22:12:14

2

我的建议是,你实现一个单例来限制PDO实例化为一个单一的对象。这可能是这样的:

class Database { 

    protected static $_instance; 
    protected $_connection; 
    protected $_dns = 'mysql:host=localhost;dbname=mydbname'; 
    protected $_username = 'myusername'; 
    protected $_password = 'mypassword'; 

    /** 
    * Singleton pattern implementation makes "new" unavailable 
    */ 
    protected function __construct() 
    { 
     $this->_connection = 
      new PDO($this->_dns, $this->_username, $this->_password); 
    } 

    public function getConnection() 
    { 
     return $this->_connection; 
    } 

    public static function getInstance() 
    { 
     if (null === self::$_instance) { 
      self::$_instance = new self(); 
     } 
     return self::$_instance; 
    } 

    /** 
    * Singleton pattern implementation makes "clone" unavailable 
    */ 
    protected function __clone() 
    {} 
} 


$dbc = Database::getInstance()->getConnection(); 
+0

切换的好处是什么? – Scarface 2010-06-09 22:59:25

+0

此模式旨在避免多个实例。使用数据库连接时,通常只需要打开一次该连接,而不是每次请求PDO对象。这就是为什么构造函数和__clone方法不公开。它的实例总是由getInstance()处理。 – nuqqsa 2010-06-10 09:21:02