Indice

Volver al Indice Bases de Datos

MySQL es la base de datos por excelencia en PHP. Si bien es cierto que existen bases de datos mucho más potentes. MySQL cuenta con las herramientas adecuadas para no tener nada que envidiar.

En este artículo daremos un conjunto de funciones para conectar nuestra web con una Base de Datos MySQL. Si tenemos una buena colección de funciones podemos llegar a ahorrarnos muchisimo trabajo.

Recomendaciones

Es recomendable seguir un patrón a la hora de asignar nombres a las tablas. Como asignar los nombres en minusculas y en singular. De este modo evitaremos confusiones.

Otra de las cuestiones fundamentales es la asignación de las claves primarias. Es importante recordar el nombre de la clave. Por este motivo nosotros siempre utilizamos “id_” seguido del nombre de la tabla como clave primaria.
Normalmente utilizaremos valores enteros con el atributo auto_increment.

Ahora veremos un ejemplo de una tabla que utilizaremos para almacenar los diferentes usuarios.

CREATE TABLE `ejemplo` (
  `id_ejemplo` int(11) NOT NULL auto_increment,
  `nombre` varchar(255) NOT NULL default '',
  `apellidos` varchar(255) NOT NULL default '',
  `email` varchar(255) NOT NULL default '',
  `fecha` date NOT NULL default '0000-00-00',
  PRIMARY KEY  (`id_ejemplo`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


Como podemos la tabla anterior contiene el nombre, apellidos, email y fecha de alta del usuario.

Volver al Indice database.php


Seguidamente declararemos el nombre de la Base de Datos, Usuario y el Password como constantes para poder modificarlo en cualquier momento.

define('_HOST','localhost'); //Host de la Conexion...
define('_BD','test'); //Base de Datos...
define('_USR','root'); //Usuario de conexion...
define('_PSR',''); //Password de conexion...

BDConexion


Con la finalidad de poder hacer una conexión con la base de datos de manera sencilla y sin complicaciones nos hemos creado una función para la conexión.
Dicha función retorna un resultado con el valor de la consulta (si la hay).

//Conexión a base de datos...
function BDConexion($sSQL) {
   //echo "<br>$sSQL";
   mysql_connect(_HOST, _USR, _PSR);
   $result = mysql_db_query(_BD, $sSQL);
   return @$result;
   mysql_free_result($result);
}


ejemplo

//Ejecucion de sql...
BDConexion("update ejemplo set nombre = 'jose'");

//Consultas sql...
$result = BDConexion('select * from ejemplo');
while ($r = mysql_fetch_array($result)) {
        echo $r['nombre'];
}


BDRetId


En algunas ocasiones en el momento de realizar un insert en una tabla nos interesa saber que valor tendrá la clave primaria.
La siguiente funcion es equivalente a la anterior, pero en este caso retorna la clave primaria del registro cambiado.

//Conexion a base de datos retornando id del ultimo registro...
function BDRetId($sSQL) {
   //echo "<br>$sSQL";
   $con = mysql_connect(_HOST, _USR, _PSR);
   mysql_select_db(_BD, $con);
   if (mysql_query($sSQL, $con)) {
      $ret = mysql_insert_id($con);
   } else {
      $ret = null;
   }
   return $ret;
}


ejemplo

$clave = BDRetId('insert into ejemplo values (...)');
echo "La clave que tiene el nuevo registro es $clave";


BDInsert


Una de las tareas clasicas con la que nos encontramos cuando programamos usando una base de datos es la generación de sql.
Muchas veces tenemos que hacer largas sentencias sql para introducir los datos.

Las inserciones sql siempre cumplen con un patrón determinado.

En esta linea podemos ver un ejemplo sql del alta de un usuario. Crear toda la sentencia sql por cada uno de los formularios puede llevarnos mucho trabajo.

INSERT INTO usuario (id_usuario, nombre, apellidos, sexo, fecha) VALUES
('SELECT MAX(id_usuario) FROM usuario','jose','rodriguez','1','2004-05-16');


Con el proposito de automatizar la generación del código sql he creado una función que nos permite saltarnos este paso.
La función toma como parámetro la tabla donde se desea introducir algo y un array con los datos a introducir.

//Inserción de un campo y retorna el id...
function BDInsert($tabla, $contenido) {
    $sSQL = "insert into `$tabla` (`id_$tabla`";
    $sSUF = '';

    reset($contenido);
    while (list($llave, $valor) = each($contenido)) {
       $sSQL .= ',`' . $llave . '`';
       $sSUF .= ',\'' . $valor . '\'';
    }

    $sSQL .= ") values ('select max(id_$tabla) from $tabla'" . $sSUF . ')';

    //echo "<br>$sSQL";
    return BDRetId($sSQL);
}


Aparte la función cumple con la peculiaridad que retorna el valor de la clave primaria del registro introducido.

Para comprender mejor su funcionamiento podremos un ejemplo.

//Montamos el array con los datos a introducir...
$usr['nombre'] = 'jose';
$usr['apellidos'] = 'rodriguez';
$usr['sexo'] = 1;
$usr['fecha'] = '2004-05-16';

//Ejecutamos el insert sobre la tabla usuario...
$clave = BDInsert('usuario', $usr);

//Es equivalente a escribir...
//INSERT INTO usuario (id_usuario, nombre, apellidos, sexo, fecha) VALUES
//('SELECT MAX(id_usuario) FROM usuario','jose','rodriguez','1','2004-05-16');

echo "he introducido el registro: $calve";


BDUpdate


Siguiendo el metodo anterior, también nos puede interesar poder generar una sentencia update de una tabla de forma automática.

Normalmente cuando realizamos un update especificamos sobre que fila concreta deseamos hacer el cambio. Basandose en el ejemplo anterior, haremos un cambio en un usuario.

//SQL, actualizar un usuario...
UPDATE FROM usuario SET nombre = 'jose', apellidos = 'maria', sexo = '1',
fecha = '2004-05-16' WHERE id_usuario = 3


Ahora veremos la función que genera automaticamente toda la sentencia anterior. Es igual que BDInsert pero con un parámetro adicional, el usuario concreto a modificar. En este caso el 3.

//Update en Tabla
function BDUpdate($tabla, $contenido, $id) {
    $sSQL = "update `$tabla` set";

    reset($contenido);
    while (list($llave, $valor) = each($contenido)) {
        $sSQL .= ' ' . $llave . ' = \'' . $valor . '\',';
    }

    $sSQL = substr($sSQL, 0 , strlen($sSQL) -1);
    $sSQL .= " where id_$tabla = '$id'";

    //echo "<br>$sSQL";
    return BDConexion($sSQL);
}


La función anterior tiene las mismas restricciones que BDInsert.
Un posible ejemplo de como utilizar esta función, seria:

//Montamos el array con los datos a actualizar...
$usr['nombre'] = 'jose';
$usr['apellidos'] = 'rodriguez';

//Ejecutamos el update sobre la tabla usuario...
BDUpdate('usuario', $usr, 3);

//Es equivalente a escribir...
//UPDATE FROM usuario SET nombre = 'jose', apellidos = 'rodriguez' WHERE id_usuario = 3


ObtPOST/ObtGET


Hasta ahora hemos conseguido introducir nuestros datos de un modo rapido y eficaz.
De todos modos todo esto todavia se podria automatizar más.

Podriamos crearnos un sistema con el cual con solo decir el nombre de nuestro formulario metiera todos los datos directamente en la base de datos sin tener que hacer ningún proceso adicional.
Ese es el proposito de las funciones ObtPOST y ObtGET.

La funcion ObtPOST captura todos los datos recividos via POST y los introduce en un array. Este array lo podemos convinar con BDInsert y BDUpdate para almacenar los datos de una forma dinámica.

//Obtener todo del metodo POST excluyendo $a y meterlo en un array...
function ObtPOST($a) {
   if ($_POST) {
          $c = split(',', $a);
          foreach ($_POST as $k => $v) {
           if (array_search($k, $c) === false) {
                 $pro[$k] = Seguro($v);
           }
          }
          return $pro;
    } else return null;
}


Cuando capturamos los datos via GET o POST siempre hay q tener en cuenta que podemos tratar con un usuario mal intencionado.
Siempre es necesario verificar los datos recividos. Por eso la funcion ObtPOST llama a la tipica función de seguridad.

//Retorna el valor validado por cuestiones de seguridad...
function Seguro($value) {
     $value = str_replace('<', '<', $value);
     $value = str_replace('>', '>', $value);
     $value = str_replace('"', '"', $value);
     $value = str_replace('\'', '\\\'', $value);
     $value = str_replace('javascript:', '', $value);
     return $value;
}


Para terminar podemos ver un pequeño ejemplo del uso de todo esto de modo coordinado.

ejemplo.html

Cuando creemos nuestros formularios tenemos que poner el nombre de los campos de nuestra base de datos.
Por ejemplo nosotros tenemos una tabla usuario con el nombre, apellidos y la fecha. En el formulario solo ponemos el nombre y los apellidos...

<form action='ejemplo.php' method='post'>
<input name="nombre" type="text" value="">
<input name="apellidos" type="text" value="">
<input name="enviar" type="submit" value="Enviar"><input name="reset" type="reset" value="Borrar">
</form>


ejemplo.php

  //Capturo todos los datos del formulario menos el boton de enviar y el de borrar...
  $usr = ObtPOST('enviar,reset');

  //Añado la fecha a los datos recividos...
  $usr['fecha'] = date('Y-m-d');

  BDInsert('usuario', $usr);


La principal ventaja de usar este sistema es que si tenemos la necesidad de introducir un nuevo campo en el formulario no tendremos que tocar nuestra programación.
Nos bastará con realizar los cambios en la base de datos y en nuestro formulario.

El equivalente a ObtPOST pero obteniendo los datos via get, seria este

//Obtener todo del metodo GET excluyendo $a y meterlo en un array...
function ObtGET($a) {
   if ($_GET) {
          $c = split(',', $a);
          foreach ($_GET as $k => $v) {
           if (array_search($k, $c) === false) {
                 $pro[$k] = Seguro($v);
           }
          }
          return $pro;
    } else return null;
}