conexion a base de datos con patrón singleton en PHP


Hola, hace mucho que no redactaba un articulo de programación y en esta ocación será referente a la conexión de la base de datos con el patron de diseño singleton.

¿QUE ES SINGLETON?

“El patrón de diseño singleton (instancia única) está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto.
Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.”

fuente: Wikipedia

CONFIGURAR BASE DE DATOS

lo primero que haremos será abrir el navegador web a preferencia y nos vmos a http://localhost/phpmyadmin desde allí crearemosuna base de datos llamada HOLA, ingresamos en ella e ingresamos el siguiente sql:

create table hi ( hihi varchar(50));
insert into hi values (‘mensaje’);

pero si son mas fanaticos de la consola, realizamos los siguientes pasos:

1.- ingresamos a mysql de la siguiente manera:
bastian ~ $ mysql -h localhost -u root -p
Enter password:

2.-ahora que estamos dentro de mysql, creamos la base de datos con el siguiente comando:
mysql> create database hola;
Query OK, 1 row affected (0.04 sec)

3.- ahora revisamos que la base de datos ha sido creada con el siguiente comando:
mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| hola               |
| mysql              |
+--------------------+
3 rows in set (0.00 sec)

4.- ahora accesamos a la base de datos que acabamos de crear de la siguiente manera:
mysql> use hola
Database changed

5.- ahora creamos una tabla llamada HI, con un campo llamado HIHI tipo varchar(50).
mysql> create table hi ( hihi varchar(50));
Query OK, 0 rows affected (0.52 sec)

6.- para comprobar que realmente se creó la tabla dentro de la base de datos escribimos lo siquiente:
mysql> show tables;

+----------------+
| Tables_in_hola |
+----------------+
| hi             |
+----------------+
1 row in set (0.00 sec)

7.- y ahora realizamos un insert para que despues podamos realizar la consulta a la base de datos desde el programa.
mysql> insert into hi values (‘mensaje’);
Query OK, 1 row affected (0.0
0 sec)

MANOS A LA OBRA

bueno, ahora que ya tenemos la base lista para poder ejecutar el codigo extraído de cristalab, el cual pasaré a explicar las clases que usaremos:

config.php
<?php
//Datos de configuración de la conexión a la base de datos

//Servidor
$host=’localhost’;

//Usuario
$user=’root’;

//Password
$password=’contraseña’;

//Base de datos a utilizar
$db=’hola’;

?>

el archivo config.php nos guardará la informacionde configuracion necesaria para la conexion con la base de datos, pues  es una buena practica separar la informacion de la base de datos y el codigo.

Conf.class.php
<?php

class Conf{
private $_domain;
private $_userdb;
private $_passdb;
private $_hostdb;
private $_db;

static $_instance;

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

private function __clone(){ }

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

}

?>

Esta clase es la que nos manejará la conexion con la base de datos utilizando el patron de diseño SINGLETON retornandonos la instancia del objeto por medio de la funcion estatica llamada getInstance(), fijense tambien que hay una funcion llamada __clone(), esta nos devolverá un clon de la instancia de este objeto ya que como sabemos singleton nos prohivirá hacer una copia de este objeto y si por algun modo necesitamos clonarlo ahi tenemos la solucion, solo sirve bajo php5.

Db.class.php
<?php
/* Clase encargada de gestionar las conexiones a la base de datos */
class Db{

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

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

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

/*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(){
$this->link=mysql_connect($this->servidor, $this->usuario, $this->password);
mysql_select_db($this->base_datos,$this->link);
@mysql_query(“SET NAMES ‘utf8′”);
}

/*Método para ejecutar una sentencia sql*/
public function ejecutar($sql){
$this->stmt=mysql_query($sql,$this->link);
return $this->stmt;
}

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

//Devuelve el último id del insert introducido
public function lastID(){
return mysql_insert_id($this->link);
}

}

?>

la clase Db.class.php nos permitirá realizar query’s a la base de datos por medio de las funciones ejecutar($sql), obtener_fila($stmt,$fila) y lastID() las cuales estan muy bien explicadas en los comentarios dentro dela clase.

ejemplo.php
<?php
/*Incluimos el fichero de la clase Db*/
require ‘Db.class.php’;
/*Incluimos el fichero de la clase Conf*/
require ‘Conf.class.php’;

/*Creamos la instancia del objeto. Ya estamos conectados*/
$bd=Db::getInstance();

/*Creamos una query sencilla*/
$sql=’SELECT * FROM hi’;

/*Ejecutamos la query*/
$stmt=$bd->ejecutar($sql);

/*Realizamos un bucle para ir obteniendo los resultados*/
while ($x=$bd->obtener_fila($stmt,0)){
echo $x[‘hihi’].'<br />’;
}

?>

y aqui esta la clase de ejemplo, la cual realizará un select a la tabla HOLA y por medio del  while mostraremos las filas del campo HIHI

y seria, espero les sirva asi como me ha servido a mi

by AngerRising

Comments

  1. Marcos Carrasco says:

    Excelente! muy utiL!

  2. fabricio says:

    muy util en serio

  3. si y ademas que es una buena práctica al momento de programar ya sea en cualqier lenguaje de programación

  4. alvaro_jose_w says:

    Excelente aporte… ya habia llegado a pensar que este patron de diseño no era plaicable en PHP… Gracias…

  5. Santiago says:

    ola, buena explicada, pero no entiendo algo ke dices: fijense tambien que hay una funcion llamada __clone(), esta nos devolverá un clon de la instancia de este objeto…pero aca dices…/*Evitamos el clonaje del objeto. Patrón Singleton*/
    private function __clone(){ }, arriba dice ke permitira hacer clonaje y aca para evitar clonarlo, si lo clonas, cual es la idea del singleton????

  6. es que en si la funcion __clone() te retorna como su nombre lo dice, un clone de la instancia, pero acá como está private no podrás realizar clones

  7. $domain no sirve para nda.

  8. Hola, es posible que config.php sea mas bien una validacion de usuario y contraseña que sea pasada para ser validada y luego usar esas credenciales de validacion para acceder recursos y hacer operaciones ? Gracias

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: