Guardar datos en una BD.

Resumen.

Una vez que ya tenemos nuestra base de datos con al menos una tabla creada y hemos llegado a conectarnos con ella desde PHP, lo siguiente que tenemos que hacer es guardar datos en ella. Guardar datos es muy fácil, no obstante debemos tener mucho cuidado con este proceso, ya si no somos precavidos, estamos creando un gran agujero de seguridad para nuestro sitio Web.

Artículo.

Para poder tener un sitio Web interactivo, es preciso que los usuarios puedan realizar acciones como crear una cuenta de usuario, por poner un ejemplo.

Grabar datos en una tabla es muy sencillo, tan sencillo como esto:
En PHP 5. $campos = 'campo1,campo2,campo3…'; $variables = "'$variable1', $variable2', $variable3'…"; $_GUARDAR_SQL = "INSERT INTO $tabla ($campos) VALUES ($variables)"; mysql_query($_GUARDAR_SQL);
En PHP 7. $campos = 'campo1,campo2,campo3…'; $variables = "'$variable1', $variable2', $variable3'…"; $_GUARDAR_SQL = "INSERT INTO $tabla ($campos) VALUES ($variables)"; mysqli_query($Conex_BD,$_GUARDAR_SQL);
Pero que sea sencillo no debe hacernos pensar que no hay mas que copiar este código, sustituir los nombres de los campos y las variables y todo listo. La cosa es un poco mas compleja, veamos detalladamente los pasos que debemos seguir.

Empecemos por recordar los campos de nuestra tabla, que eran estos:
id, usuario, email, clave, time, cd_validar, ip, id_usuar, validaok, bloqueo, sexo, f_regis
Como podemos ver, tenemos 12 campos que ya fueron explicados en este artículo y también vemos que de esos 12 campos, solo son tres los que tiene que aportar el usuario, que son: usuario, e-mail y sexo. ¿Qué pasa con los demás campos, como los generamos?

id.- Como ya se dijo, este lo genera la propia base de datos, dado que es autoincremental.

clave.- La clave la vamos a tratar con mucho cuidado, y la generaremos como un aleatorio de 6 caracteres, pero no solo eso, ya que podemos decir que guardar una clave en una base de datos tal y como la introduce el usuario es una imprudencia, la vamos a codificar con su valor hexadecimal (compuesto por los valores 0 al 9 y letras abcdef). Esta codificación dobla el tamaño de la cadena de caracteres, es decir, si tenemos una clave de 6 caracteres, en hexadecimal tendrá 12 caracteres.

time.- Tomará el valor que nos da la función nativa time().

cd_validar.- Este valor, nos permitirá que los usuarios validen su cuenta a través de un enlace que se enviará a su e-mail en el proceso de registro, y lo crearemos como un aleatorio de 20 caracteres.

ip.- La dirección IP es muy importante para poder tener unas referencias respecto a la ubicación desde donde se registra el usuario usando alguna función de geolocalización. La IP la capturamos mediante la función $_SERVER['REMOTE_ADDR'].

id_usuar.- Esta es la clave que hemos definido como primaria, por lo que la vamos a tratar con especial atención. Para descartar incluso una improbable pero hipotética repetición vamos a tomar otros valores del registro, los vamos a fundir en uno solo y el resultado lo vamos a codificar como valor hexadecimal con la función nativa md5(). En nuestro caso uniremos el nombre de usuario, el e-mail, el time o tiempo UNIX y la dirección IP. Así hay absolutas garantías de que este valor jamás se repetirá. Este valor será el que en el proceso de identificación se propagara como variable de sesión y/o cookie para mantener identificado a cada usuario.

validaok y bloqueo.- Estas dos variables las definimos directamente con el valor “no”. La variable validaok pasará a tomar el valor “si” cuando el usuario haya validado su cuenta. La variable bloqueo pasará a tomar el valor si, cuando el administrador del sitio Web tenga un motivo para denegar el acceso a un usuario, por ejemplo, por una conducta inapropiada a la hora de publicar comentarios.

f_regis.- Cuando un usuario se registra, que menos que recoger la fecha del registro, eso lo haremos con la función date('Y-m-d H:i') recogiendo los datos de manera apropiada para las bases de datos y con la hora y minutos del registro.

Los tres datos (usuario, e-mail y sexo) que introduce el usuario los enviamos por el método POST, para un caso como este, nunca usar el método GET o REQUEST.

Para generar los valores aleatorios vamos a precisar de una función para generar estos valores, es esta.

Para codificar la clave en hexadecimal también vamos a precisar dos funciones, una de codificación y otra de descodificación, ya que nuestra clave va a ser recuperable. Quien no desee una clave recuperable, puede usar cualquiera de las funciones de codificación hexadecimal mediante la función hash() o la clásica md5().

También vamos a precisar una función para realizar la validación de los datos.

Lo explicado hasta aquí queda reflejado en el siguiente código:
include('archivos/func_conexionBD.php'); include('archivos/funcion_aleatorio.php'); include('archivos/funcion_hexadecimal.php'); include('archivos/funcion_validar.php'); // --- Variables que vamos a guardar en la base de datos // $id - Esta variable no le asignamos valor ya que // al ser autoincremental la genera la base de datos $usuario = $_POST['usuario']; // La recibimos del formulario $email = $_POST['email']; // La recibimos del formulario $clave = Cod_Hexad(Gen_Aleator(1, 6)); $time = time(); $cd_validar = Gen_Aleator(4, 20); $ip = $_SERVER['REMOTE_ADDR']; // Esta funcion no opera en local, solo en remoto $id_usuar = md5($usuario.$email.$time.$ip); $validaok = 'no'; $bloqueo = 'no'; $sexo = $_POST['sexo']; // La recibimos del formulario $f_regis = date('Y-m-d H:i');
Una vez hecho esto, lo siguiente que tenemos que hacer es validar los datos provenientes del formulario. Para ello hemos incluido también una función para validar mediante expresiones regulares.

La aplicaremos de la siguiente manera:

$valida_usuario = Validar_Datos($usuario,'/^[a-z0-9-_]{4,25}$/i'); $valida_email = Validar_Datos($email,'/(^[a-z0-9._-]{2,40})+(@[a-z0-9._-]{4,30})+\.[a-z]{2,4}$/i'); $valida_sexo = Validar_Datos($sexo,'/^[12]{1}$/');
Con el condicional isset reconocemos si los datos son válidos, ya que en caso de no ser válido alguno, la función de validación devuelve null.
if(isset($valida_usuario,$valida_email,$valida_sexo)){ // Los datos superan la validacion $campos = 'usuario, email, clave, time, cd_validar, ip, id_usuar, validaok, bloqueo, sexo, f_regis'; $variables = "'$usuario', '$email', '$clave', '$time', '$cd_validar', '$ip', '$id_usuar', '$validaok', '$bloqueo', '$sexo', '$f_regis'"; $Conex_BD = ConectaBD(); // Conectamos la base de datos $_GUARDAR_SQL = "INSERT INTO $tb1 ($campos) VALUES ($variables)"; mysqli_query($Conex_BD,$_GUARDAR_SQL); DesconectaBD($Conex_BD); // Desconectamos la base de datos echo '<p>Datos guardados con exito.</p>'; }else{ // Los datos NO superan la validacion echo '<p>Algun dato <b>NO</b> es valido, intentelo de nuevo.</p>'; }
Un detalle que comentar es una costumbre mía, me refiero a las variables $campos y $variables. Estados dos variables no seria preciso definirlas tal cual se ha hecho, pero cuando hay mas de 4 o 5 campos en la BD, me resulta mas cómodo guardar los nombres de los campos en una variable, y las variables a guardar dentro de otra. De esta forma la consulta de registro queda bastante simplificada INSERT INTO $tb1 ($campos) VALUES ($variables), donde $tb1 es la variable que contiene el nombre de la tabla donde guardaremos los datos.

Llegados a este punto, y para finalizar este artículo diremos que esto es lo mínimo respecto a como guardar datos en una base de datos. Otro aspecto importante a tener en cuenta es que aunque la tabla esta diseñada para no guardar valores repetidos en los campos usuario y email, si un usuario introdujera un dato ya existente, el registro no se efectuaría, pero el usuario no sabría que no estaba registrado, por tanto, este método precisa aún de mejoras.

Os dejo aquí el código completo.
<?php // Guardamos datos en una tabla include('archivos/func_conexionBD.php'); include('archivos/funcion_aleatorio.php'); include('archivos/funcion_hexadecimal.php'); include('archivos/funcion_validar.php'); // --- Variables que vamos a guardar en la base de datos // $id - Esta variable no le asignamos valor ya que // al ser autoincremental la genera la base de datos $usuario = $_POST['usuario']; // La recibimos del formulario $email = $_POST['email']; // La recibimos del formulario $clave = Cod_Hexad(Gen_Aleator(1, 6)); $time = time(); $cd_validar = Gen_Aleator(4, 20); $ip = $_SERVER['REMOTE_ADDR']; // Esta funcion no opera en local, solo en remoto $id_usuar = md5($usuario.$email.$time.$ip); $validaok = 'no'; $bloqueo = 'no'; $sexo = $_POST['sexo']; // La recibimos del formulario $f_regis = date('Y-m-d H:i'); // Validamos los datos provenientes del formulario $valida_usuario = Validar_Datos($usuario,'/^[a-z0-9-_]{4,25}$/i'); $valida_email = Validar_Datos($email,'/(^[a-z0-9._-]{2,40})+(@[a-z0-9._-]{4,30})+\.[a-z]{2,4}$/i'); $valida_sexo = Validar_Datos($sexo,'/^[12]{1}$/'); if(isset($valida_usuario,$valida_email,$valida_sexo)){ // Los datos superan la validacion $campos = 'usuario, email, clave, time, cd_validar, ip, id_usuar, validaok, bloqueo, sexo, f_regis'; $variables = "'$usuario', '$email', '$clave', '$time', '$cd_validar', '$ip', '$id_usuar', '$validaok', '$bloqueo', '$sexo', '$f_regis'"; $Conex_BD = ConectaBD(); // Conectamos la base de datos $_GUARDAR_SQL = "INSERT INTO $tb1 ($campos) VALUES ($variables)"; mysqli_query($Conex_BD,$_GUARDAR_SQL); DesconectaBD($Conex_BD); // Desconectamos la base de datos echo '<p>Datos guardados con exito.</p>'; }else{ // Los datos NO superan la validacion echo '<p>Algun dato <b>NO</b> es valido, intentelo de nuevo.</p>'; } ?>
Otro aspecto importante a tener en cuenta es la validación con expresiones regulares, a ese tema, dada su extensión, nos referiremos en otros artículos.

Respecto a la validación, aunque no es un método de validación en cuento tal, si resulta interesante mencionar el uso de la función strip_tags(). Esta función elimina todas las etiquetas existentes, por ejemplo, si pasamos el valor <div class= "nombre">Juan Pérez</div>, la función devolverá “Juan Pérez”. Como hemos dicho, no es un método de validación en cuento tal, pero si es un método muy sencillo de evitar algunos ataques strip_tags($_POST['mensaje']);.
Tags: INSERT INTO || VALUES || guardar || almacenar || seguridad || validación || strip_tags

Comentarios.

Sin comentarios, publica el tuyo.