martes, 25 de octubre de 2011

Ejemplo de capa de abstracción de base de datos

Pongo aquí la versión 0.1 de lo que será la capa de abstracción de BBDD de mi proyecto. Para que me deis opiniones e ideas.

Se trata del fichero BBDD_mysql.php. La idea es que dependiendo de la bbdd que requiera el proyecto, se sustituya el fichero entero por otro con las mismas funciones, pero atacando a la bbdd correspondiente. De esta forma no ensucio el código ni realizo comprobaciones a cada llamada a las funciones de acceso a datos. Esto se hará definiendo en config.php una constante con la ruta del fichero con la capa de bbdd correspondiente.

En el siguiente post, colgaré un ejemplo de uso, de momento aquí tenéis el código:


<?php

/*
* Clase BBDD, incluye la capa de abstraccion de BBDD.
*/


$BBDD = ""; //esta variable global guardará la conexion a la BBDD
$BBDD_Resultado = false; //esta variable global guardará el array de retorno de la consulta a la BBDD
$BBDD_Transaccion_Abierta = false; //variable para saber si se está realizando una transacción
$BBDD_Transaccion_Error=false; //variable para controlar si ha habido algun error a lo largo de la transacción. No evaluo si hay transaccion abierta pues gasta más computo una comprobacion que una asignacion booleana.
/* * ***************************************************************************************** */
/* * ***************************************************************************************** */

/**
* Crea y abre una nuevo conexion a la base de datos.
*
* @global string $BBDD La conexion a la base de datos que se almacena en una variable global
* @global boolean $BBDD_Transaccion_Abierta Variable global para saber si estamos realizando una transacción, no abrir ni cerrar conexiones.
* @global boolean $BBDD_Transaccion_Error Variable para controlar si ha habido algun error a lo largo de la transaccion.
*/
function BBDD_Conectar() {
global
$BBDD;
global
$BBDD_Transaccion_Abierta;
global
$BBDD_Transaccion_Error;

if (!
$BBDD_Transaccion_Abierta) {
if (!(
$BBDD = mysql_connect("localhost", "usuario", "password"))) {
echo
"Error conectando a la base de datos.";
exit();
}
if (!
mysql_select_db("mibase", $BBDD)) {
echo
"Error seleccionando la base de datos.";
exit();
}
mysql_set_charset("utf8", $BBDD);
$BBDD_Transaccion_Error=FALSE; //si hago una conexion nueva limpio del posible error de transacciones anteriores
}
}

/* * ***************************************************************************************** */
/* * ***************************************************************************************** */

/**
* Cierra la conexion con la base de datos

* @author José Luis Bestué Marín ==> jlbestue@gmail.com
* @version v0.1 15/09/2011
* @global string $BBDD La conexión a la base de datos se almacena en una variable global
* @global boolean $BBDD_Transaccion_Abierta Variable global para saber si estamos realizando una transacción, no abrir ni cerrar conexiones.
* @global boolean $BBDD_Transaccion_Error Variable para controlar si ha habido algun error a lo largo de la transaccion.
*/
function BBDD_Desconectar() {
global
$BBDD;
global
$BBDD_Resultado;
global
$BBDD_Transaccion_Abierta;
global
$BBDD_Transaccion_Error;

if (!
$BBDD_Transaccion_Abierta) {
if (
$BBDD <> "") {
mysql_free_result($BBDD_Resultado);
mysql_close($BBDD);
$BBDD="";
$BBDD_Transaccion_Error=FALSE;//limpio la variable de error por si hubiera habido alguno.
}
}
}

/* * ***************************************************************************************** */
/* * ***************************************************************************************** */

/**
* Ejecuta una orden Select de SQL, devolviendo el array de resultados.
* @author José Luis Bestué Marín ==> jlbestue@gmail.com
* @version 0.1 24/10/2011
* @example BBDD_Consulta("select * from clientes");
* @param string $Consulta La cadena SQL con la consulta para la base de datos
* @return array Nos devuelve el array con los campos si la consulta es correcta. Si solo queremos usar una consulta a la vez, podemos omitir
* el return, pues nos guarda el valor en una varible "global" a la libreria $BBDD_Resultado, que puede coger por defecto al usar BBDD_LeeRegistro
*/
function BBDD_Consulta($Consulta) {
global
$BBDD_Resultado;
// si la conexion no está abierta, la abro.
if ($BBDD == "") {
BBDD_Conectar();
}

// guardo el array en la variable global $BBDD_Resultado, por si no se quiere usar el valor de retorno.
$BBDD_Resultado = mysql_query($Consulta);

return
$BBDD_Resultado;
}

/* * ***************************************************************************************** */
/* * ***************************************************************************************** */

/**
* Lee el siguiente registro. Si es EOF, limpia el array y cierra la conexion con la BBDD
* @author José Luis Bestué Marín ==> jlbestue@gmail.com
* @version 0.1 25/10/11
* @example $BBDD_LeeRegistro();
* @global boolean $BBDD_Resultado Es una variable de la capa de abstracción por si no se pasa un array, que lo use por defecto.
* @param boolean $resultado
* @return type
*/
function BBDD_LeeRegistro($resultado="") {
global
$BBDD_Resultado;

// si no le he pasado el array del que sacar los datos, usa el por defecto $BBDD_Resultado
if ($resultado == "") {
$resultado = $BBDD_Resultado;
}

$registro = mysql_fetch_array($resultado, MYSQL_ASSOC);

//si es el ultimo libero el array y cierro la conexion a la BBDD
if (!$registro) {
BBDD_Desconectar();
}

return
$registro;
}

/* * ***************************************************************************************** */
/* * ***************************************************************************************** */

/**
* Ejecuta una orden SQL tipo Insert o Update que afecte a una única fila.
* @author José Luis Bestué Marín ==> jlbestue@gmail.com
* @version 0.1 25/10/11
* @example BBDD_Inset_Update('UPDATE cliente SET ultima_visita=now() WHERE ID=22');
* @global string $BBDD Base de datos a la que se conectará.
* @global boolean $BBDD_Transaccion_Error Variable para controlar si ha habido algun error a lo largo de la transaccion.
* @param string $Consulta Instruccion SQL a procesar
*/
function BBDD_Insert_Update($Consulta) {
global
$BBDD;
global
$BBDD_Transaccion_Error;

// si la conexion no está abierta, la abro.
if ($BBDD == "") {
BBDD_Conectar();
}

mysql_query($Consulta);

//si hay error lo aviso en la variable $BBDD_Error por si hubiera transaccion
if (mysqlerror()){$BBDD_Transaccion_Error=TRUE;}
$resultado = mysql_affected_rows();

if (
$resultado != 1) {
//logear error SQL
exit();
}

//desconecto de la BBDD

BBDD_Desconectar();
return
$resultado;
}
/* * ***************************************************************************************** */
/* * ***************************************************************************************** */

/**
*Ejecutar una instruccion SQL Delete, Update o similar que afecte a varias filas
* @author José Luis Bestué Marín ==> jlbestue@gmail.com
* @version 0.1 25/10/11
* @example BBDD_Update_Delete("DELETE * FROM logs");
* @global string $BBDD
* @param type $Consulta
* @return int Numero de filas afectadas.
*/
function BBDD_Update_Delete($Consulta) {
global
$BBDD;
// si la conexion no está abierta, la abro.
if ($BBDD == "") {
BBDD_Conectar();
}

mysql_query($Consulta);

//si hay error lo aviso en la variable $BBDD_Error por si hubiera transaccion
if (mysqlerror()){$BBDD_Error=TRUE;}

$resultado = mysql_affected_rows();

//desconecto de la BBDD
BBDD_Desconectar();
return
$resultado;
}
/* * ***************************************************************************************** */
/* * ***************************************************************************************** */
/**
* Inicia una transacción en la base de datos
* @author José Luis Bestué Marín ==> jlbestue@gmail.com
* @version 0.1 25/10/11
* @example BBDD_IniciaTransaccion();
* @global boolean $BBDD_Transaccion_Abierta Variable global para saber si estamos realizando una transacción, y no abrir ni cerrar conexiones.
* @global boolean $BBDD_Transaccion_Error Variable para controlar si ha habido algun error a lo largo de la transaccion.
*/
function BBDD_IniciaTransaccion(){
global
$BBDD_Transaccion_Abierta;
global
$BBDD_Transaccion_Error;

if (!
$BBDD_Transaccion_Abierta){
BBDD_Conectar();
mysql_query("BEGIN");
$BBDD_Transaccion_Abierta=TRUE;
$BBDD_Transaccion_Error=FALSE;
}

}
/* ****************************************************************************************** */
/* ****************************************************************************************** */

/**
* Finaliza una transaccion abierta, y dependiendo de si ha habido errores, hace un rollback o un commit.
* @author José Luis Bestué Marín ==> jlbestue@gmail.com
* @version 0.1 25/10/11
* @example if (BBDD_CierraTransaccion) {echo 'Ha habido un error y se ha cancelado la transacción';}
* @global boolean $BBDD_Transaccion_Abierta Variable global para saber si estamos realizando una transacción, no abrir ni cerrar conexiones.
* @global boolean $BBDD_Transaccion_Error Variable para controlar si ha habido algun error a lo largo de la transaccion.
* @return boolean Devuelve si ha habido error (True es ERROR)
*/
function BBDD_CierraTransaccion(){
global
$BBDD_Transaccion_Abierta;
global
$BBDD_Transaccion_Error;

if (!
$BBDD_Transaccion_Abierta){

if (
$BBDD_Transaccion_Error){
mysql_query("ROLLBACK");
} else {
mysql_query("COMMIT");
}

$BBDD_Transaccion_Abierta=FALSE;
}
//devuelvo el error si lo hubiera por si se quiere controlar.
return $BBDD_Transaccion_Error;

}



?>

No hay comentarios: