2010-06-09 19 views
6

Hola chicos, soy bastante nuevo para el pdo, así que básicamente armé una clase de conexión simple usando información del libro introductorio que estaba leyendo pero ¿esta conexión es eficiente? Si alguien tiene alguna sugerencia informativa, realmente lo agradecería.¿Alguna sugerencia para mejorar mi clase de conexión 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

que sería cambiar el nombre de '$ persistent' pública a' pública $ isPersistent' (cuestión de gustos allí) y también ajustar el constructor de 'if' línea en lugar de leer simplemente' $ this > isPersistent = $ persistente; '. Las otras variables 'públicas '($ con, $ dbType, $ host, $ user, $ senha, $ db) probablemente sean' privadas '. Cuando se implementa una "fábrica", generalmente es para que otras clases, métodos, etc. que la utilizan no tengan que saber o preocuparse por las conexiones, nombres de usuario, contraseñas, etc. –

+0

lo agradezco. – Scarface

+0

¿sabes si este proceso es eficiente? hay una mejor manera? Todavía no he tenido tiempo de aprender los patrones de codificación y OOP con más profundidad, así que solo estoy buscando un lugar donde comenzar para poder mantener mi sitio hasta que lo actualice. – Scarface

Respuesta

2

Al implementar una "fábrica" ​​por lo general es para que otras clases, métodos, etc. usarlo no tiene que conocer o preocuparse por las conexiones, los nombres de usuario, contraseñas, etc.

lo haría algo más como:

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(); 
     } 
    } 
} 

Luego utiliza la conexión devuelta por CreateNewConnection() de la forma que necesite.

No revisé si el código anterior se compila, podría haber algunos errores tipográficos/problemas, pero se entiende. Ahora necesita dar un paso más e implementar algo así como el patrón de repositorio :)

+0

apreciarlo nate – Scarface

2

Usted puede encontrar este artículo útil, es por Erik Wurzer y que fue publicada en Nettuts, que es uno de mis otros sitios web favoritos (además de esto).
Why you Should be using PHP’s PDO for Database Access

Espero que esto ayude.

+0

buen artículo jnk pero también muestran el simple proceso de conexión que estaba usando. Supongo que es un buen lugar para comenzar. – Scarface

2

Mi sugerencia es que implemente un singleton para restringir la instanciación de PDO a un solo objeto. Se podría tener este aspecto:

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

¿cuál es el beneficio de cambiar? – Scarface

+0

Este patrón está destinado a evitar instancias múltiples. Al trabajar con una conexión de base de datos, normalmente desea abrir esa conexión solo una vez, no cada vez que solicita el objeto PDO. Es por eso que los métodos constructor y __clone no son públicos. Su instanciación siempre es manejada por getInstance(). – nuqqsa

Cuestiones relacionadas