Controlador de base de datos MySQL

Cuando se empieza una web dinámica de cero y se pretende prescindir de frameworks, es bueno ponerse a pensar como va ha ser la interactuación entre el servidor web y el sistema gestor de bases de datos.

Siempre tienes la opción de ir abriendo y cerrando conexiones contra la bd, cuando lo necesites, en medio del código, pero mi propia experiencia me dice que es mejor centralizarlo todo en una función o clase que gestione la conexión al SGBD y, si se ha de realizar un cambio, lo hagas en un solo sitio para que así se aplique a todo el proyecto.

En la mayoría de proyectos en los que he participado, la formula era apache + MySQL Server por lo que una de mis propuestas es la de esta función que os detallo a continuación:

En la primera parte del fichero, definimos las constantes donde indicaremos los parámetros a utilizar para conectarnos al MySQL Server

1
2
3
4
5
6
<?php
  define('DB_USER','Usuario de la base de datos');
  define('DB_PASS','Contraseña de la base de datos');
  define('DB_NAME','Nombre de la base de datos a atacar');
  define('DB_HOST','IP donde esta alojada la base de datos');
?>

La función LimpiarSql limpiara los valores que le pasemos. Esta función sera muy útil para limpiar valores recogidos por formularios para así, evitar el SQL Injection.

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function LimpiarSql( $valor, $usar_trim = 1, $usar_urldecode = 1 ){
  $valor = strip_tags( $valor );
 
  $conn = @mysql_connect( DB_HOST, DB_USER, DB_PASS );
 
  if( get_magic_quotes_gpc() ) $valor = stripslashes( $valor );
    $valor = mysql_real_escape_string( $valor, $conn );
 
    @mysql_close();
 
    if ( $usar_urldecode ){
      $valor = urldecode( $valor );
    }
    if ( $usar_trim ){
      $valor = trim( $valor );
    }
    return $valor;
}

Y he aquí las 2 funciones que gestionan la conexión. EjecutarSql y InsertarSQL, ejecutaran la sentencia sql que se le pase por parámetro. La diferencia entre estas funciones es que la función EjecutarSQL devolverá solo true (1) o false (0) si ha podido ejecutar la sentencia sql correctamente y la función InsertarSQL retornara false (0) si no ha podido ejecutar el sql pasado o, en caso de que todo halla ido bien, retornara el id de la fila insertada en el mysql.

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
* Ejecuta una sentencia SQL en una SGBD MYSQL Configurado
* Atención: $sql no ha de ser nulo.
*
* Retorna el resultado de la sentencia sql en formato resource.
* Mas info en http://es.php.net/manual/en/function.mysql-query.php
* Si hay un fallo al conectar a la BD, retorna -1;
*/
function EjecutarSql( $sql ){
  $resultado = -1;
  $conn = @mysql_connect( DB_HOST, DB_USER,DB_PASS );
  if ( ! $conn ){
    $resultado = -1;
  } else {
    if ( ! @mysql_select_db( DB_NAME ) ){
      $resultado = -1;
    } else {
      $resultado = mysql_query( $sql );
    }
  }
  @mysql_close();
  return $resultado;
}
 
/*
* Ejecuta una sentencia SQL insert en una SGBD MYSQL Configurado
* Atención: $sql no ha de ser un nulo.
*
* Retorna el id de la sentencia introducida
* Si hay un fallo en el inser retorna 0;
* Si hay un fallo al conectar a la BD, retorna -1;
*/
function InsertarSql( $sql ){
 
  $id = 0;
  $conn = @mysql_connect( DB_HOST, DB_USER,DB_PASS );
  if ( ! $conn ){
    $id = -1;
  } else {
    if ( ! @mysql_select_db( DB_NAME ) ){
      $id = -1;
    } else {
      $resultado = mysql_query( $sql );
      if ( $resultado ){
        $id = mysql_insert_id();
      }
    }
  }
  @mysql_close();
  return $id;
}
?>

Hay que tener en cuenta que estas dos funciones no comprueban si la sentencia sql es valida o contiene errores por lo que es importante, cuando se este construyendo el sql, antes de llamara a estas funciones, que se verifique que es valida y se limpien los parámetros con la función LimpiarSQL para evitar errores.

También hay que tener presente que cada función es para lo que es. Si tenemos una sentencia SQL que hace un SELECT, no tiene sentido que se la pasemos a la función InsertarSql porque probablemente nos dará un valor erroneno.

A continuación os detallo un ejemplo de como usar estas funciones

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
include('controlador-bd.php'); //Sería la suma del código que hemos descrito arriba.
 
$movil = LimpiarSql( $_REQUEST["movil"] );
 
$sql = "SELECT * FROM usuario WHERE telefono = '$movil' LIMIT 1";
$resUsuario = EjecutarSql( $sql );
 
if ( $resUsuario != 0 && ! mysql_num_rows( $resUsuario ) ){
  $sql = "INSERT INTO usuario (telefono) VALUES ('$movil')";
  $idres = InsertarSql( $sql );
  if( $idres != 0 ){
    echo "Inserción de sql realizada correctamente con el id $idres";
  } else {
    echo 'Error al insertar el sql.';
  }
} else {
  echo 'Error al ejecutar la sentencia sql.';
}
?>

Bueno, no es una gran función pero nos puede sacar de más de un apuro a la hora de empezar esos proyectos cortos y simples que no requieren de una gran ingeniería.

Descargar controlador-bd.php

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *