Cristalab

                 ¿Quieres registrarte?

Crear una clase para conectar a la base de datos (III)

Por: marcosdev
11 de Noviembre del 2008
2,724 visitas

Continuemos mejorando nuestra clase. En el último tip, creamos una clase nueva para leer un fichero de configuración. Este fichero contenía los valores que nos interesase para realizar la conexión a la base de datos. Luego estuvimos adaptando el fichero de conexión a la base de datos para que fuera capaz de instanciar el objeto Conf y pudiera tener acceso a los datos necesarios para realizar la conexión.

En esta siguiente parte del tutorial vamos a realizar una sencilla mejora para hacer que nuestra clase sea capaz de conectarse a diferentes tipos de base de datos. En concreto vamos a ver cómo adaptarla para que se conecte a PostgreSQL.

Lo primero que debemos realizar es agregar una nueva variable a nuestro fichero de configuración:

config.php

Código :

//Datos de configuración de la conexión a la base de datos

//Servidor
$host='localhost';

//Usuario
$user='user';

//Password
$password='test';

//Base de datos a utilizar
$db='testDB';

//Qué sistema gestor de base de datos utilizamos, mysql, oracle, ...
$dbType='mysql'


Podemos observar una nueva última variable llamada dbType la cual utilizaremos para saber que tipo de base de datos vamos a utilizar.

Ahora vamos a adaptar nuestra clase Conf para que lea dicho valor y lo guarde ($_dbType). Además agregaremos una función getDBType() para poder obtener dicho valor.

Conf.class.php

Código :

Class Conf{
   private $_domain;
   private $_userdb;
   private $_passdb;
   private $_hostdb;
   private $_db;
   private $_dbType;

   private static $_instance;

   private function __construct(){
      require 'config.php';
      $this->_domain=$domain;
      $this->_userdb=$user;
      $this->_passdb=$password;
      $this->_hostdb=$host;
      $this->_db=$db;
      $this->_dbType=$dbType;
   }

   private function __clone(){ }

   private function __wakeup(){ }

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

   public function getUserDB(){
      $var=$this->_userdb;
      return $var;
   }

   public function getHostDB(){
      $var=$this->_hostdb;
      return $var;
   }

   public function getPassDB(){
      $var=$this->_passdb;
      return $var;
   }

   public function getDB(){
      $var=$this->_db;
      return $var;
   }

   public function getDBType(){
     $var=$this->_dbType;
     return $var;
   }

}


Por último los cambios más significativos vienen dentro de nuestra clase Db. Dentro de las funciones de conectar, ejecutar una query y obtener una fila de resultados es dónde podemos ver cómo en función del valor tipo de base de datos, la clase utiliza unas funciones u otras.

Db.class.php

Código :

/* Clase encargada de gestionar las conexiones a la base de datos */
Class Db{

   private $servidor;
   private $usuario;
   private $password;
   private $base_datos;
   private $tipo;
   private $link;
   private $stmt;
   private $array;

   private static $_instance;

   /*La función construct es privada para evitar que el objeto pueda ser creado mediante new*/
   private function __construct(){
      $this->setConexion();
      $this->conectar();
   }

   /*Método para establecer los parámetros de la conexión*/
   private function setConexion(){
      $conf = Conf::getInstance();
      $this->servidor=$conf->getHostDB();
      $this->base_datos=$conf->getDB();
      $this->usuario=$conf->getUserDB();
      $this->password=$conf->getPassDB();
      $this->tipo=$conf->getDBType();
   }

   /*Evitamos el clonaje del objeto. Patrón Singleton*/
   private function __clone(){ }

   private function __wakeup(){ }

   /*Función encargada de crear, si es necesario, el objeto. Esta es la función que debemos llamar desde fuera de la clase para instanciar el objeto, y así, poder utilizar sus métodos*/
   public static function getInstance(){
      if (!(self::$_instance instanceof self)){
         self::$_instance=new self();
      }
      return self::$_instance;
   }

   /*Realiza la conexión a la base de datos.*/
   private function conectar(){
      switch ($this->tipo){
         case 'mysql':     $this->link=mysql_connect($this->servidor, $this->usuario, $this->password);
                            mysql_select_db($this->base_datos,$this->link);
                            @mysql_query("SET NAMES 'utf8'");
                  break;

       case 'postgress':   $this->link=pg_connect("host=".$this->servidor." dbname=".$this->base_datos." user=".$this->usuario." password=".$this->password)
                        break;
       break;
      }
   }

   /*Método para ejecutar una sentencia sql*/
   public function ejecutar($sql){
      switch ($this->tipo){
         case 'mysql':     $this->stmt=mysql_query($sql,$this->link);
                  break;
         case 'postgress': $this->stmt=pg_Euery($this->link,$sql);
                   break;
         break;
      }
      return $this->stmt;
   }

   /*Método para obtener una fila de resultados de la sentencia sql*/
   public function obtener_fila($stmt,$fila){
      switch ($this->tipo){
         case 'mysql':     if ($fila==0){
                               $this->array=mysql_fetch_array($stmt);
                            }else{
                               mysql_data_seek($stmt,$fila);
                               $this->array=mysql_fetch_array($stmt);
                            }
                            break;
         case 'postgress': if ($fila==0){
                     $this->array=pg_fetch_row($stmt);
                   }else{
                      $this->array=pg_fetch_row($stmt,$fila);
                   }
                   break;
          break;
      }
      return $this->array;
   }

}


En el siguiente y última parte, veremos cómo controlar los errores.

Un saludo

Ficheros del ejemplo (en formato UTF-8 )

Temas relacionados:

Crear una clase para conectar a la base de datos
Crear una clase para conectar a la base de datos (II)


Artículos Relacionados


Etiquetas php clases

Comentarios | Enviar un comentario
No sería mejor armar una jerarquia teniendo como subclases de Db a Mysql y PosgreSQL ?
Saludos!
Por: Quique-blog

Anonymous :

No sería mejor armar una jerarquia teniendo como subclases de Db a Mysql y PosgreSQL ?
Saludos!
Si llevemos al milímetro la teoría de clases, si que sería necesario. Cómo he comentado en varias ocasiones esto es un ejemplo para dar ideas y mostrando como ir construyendo una clase. Como han comentado otros compañeros, también existen librerías y clases ya fabricadas que permiten realizar lo que estamos desarrollando el estos tutoriales y mucho más (seguridad, ORM, eventos de errores,...).

Creo que estos tips que estoy haciendo ayudaran a mucha gente a ir utlizando y entendiendo las clases, a entender lo que son los patrones de diseño, diferencias entre crear e instanciar objetos,visibilidad y tipos de variables,...

Quiero recordar que la gran mayoría de la gente que programa en PHP todavía lo hace de una manera muy mala, muy desorganizada, desestructurada, con poco código reutilizable,.. Esto es sólo un pequeño aporte para conseguir una web mejor.

Un saludo
Por: marcosdev
Después de leerme los 3 tutos que has colgado, mis mas sinceros agradecimientos a tu trabajo, generosidad y tiempo.
Como bien dices, aún los hay que empiezan y que buscan donde pueden aprender a modular la programación.
A los que aportan indicaciones que se puede mejorar o hacer diferente, veo una solución bien sencilla, crear un nuevo tip con su "segunda" solución, posiblemente orientada también a otro "target" de publico.
Saludos a todos,
Por: deivieb
marcos, concuerdo totalmente con Quique...

Si tu idea es enseñar a usar objetos, tenes que enseñar como se usan de manera correcta, no como lo haces en un tu ejemplo poniendo un case tan "harcodeado"... por otro lado como van a aprender sobre patrones si no saben q es un objeto... creo que debes replantear tu forma de querer enseñar a usar objetos (q en cuando a actitudo en querer hacerlo te felicito).

Saludos!
Por: alfathenus-blog
un poco complicado y enredoso
Por: duque-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.