Datos duplicados.

Resumen.

En el capitulo anterior hablamos de grabar datos en la base de datos, pero a veces es preciso comprobar la existencia de un dato antes de grabarlo. A eso vamos a dedicar este artículo, que en principio debería haber ido antes de guardar ningún dato, no obstante, no se hizo por no extender demasiado el artículo relacionado con guardar datos.

Artículo.

Cuando hablamos de la creación de tablas vimos que algunos campos no pueden tener valores duplicados. Si bien MySQL impide que se guarden en un mismo campo valores iguales, el problema está en que MySQL no informa al usuario de que tal dato no ha sido grabado, por tanto deberemos interactuar con PHP para ofrecer esta información.

Para llevar a cabo esta tarea precisaremos del uso de una consulta que nos devuelva un valor estricto, y en función de este valor, mediante una estructura condicional, determinar que acción llevamos a cabo.

Como vemos, la lógica del procedimiento es muy simple, ahora veremos como llevamos esto a cabo, que tipo de consulta necesitaremos y como la aplicaremos.
// En PHP5 $dato = 'mi_mail@dominio.com'; $Verifica_Dato = "SELECT * FROM $tb1 WHERE email = '$dato'"; $Verif_Dato = mysql_query($Verifica_Dato); $N_Dato = mysql_num_rows($Verif_Dato); if($N_Dato > 0) {     // Existe el dato     echo "El dato <b>$dato</b> existe."; } else {     // No existe el dato     echo "El dato <b>$dato</b> NO existe."; }
Y adaptado a PHP7 y el código completo quedaría de la siguiente forma:
<?php /* Comprobamos la existencia de un dato en PHP7 */ include('archivos/func_conexionBD.php'); $dato 'mail@dominio.com'; $Conex_BD ConectaBD(); $Verifica_Dato "SELECT * FROM $tb1 WHERE email = '$dato'"; $Verif_Dato mysqli_query($Conex_BD$Verifica_Dato); $N_Dato mysqli_num_rows($Verif_Dato); DesconectaBD($Conex_BD); if($N_Dato 0) {     // Existe el dato     echo "El dato <b>$dato</b> existe."; } else {     // No existe el dato     echo "El dato <b>$dato</b> NO existe."; } ?>
En este código vemos una tarea muy común, comprobar si un e-mail está o no registrado, lo que hemos hecho es muy sencillo. A parte de incluir las funciones de conexión y desconexión de la base de datos y hacerle la llamada, lo primero que hemos hecho ha sido definir una consulta en la variable $Verifica_Dato.

Con SELECT y asterisco (*) estamos diciendo que seleccione todos los campos. Con FROM $tb1, estamos diciendo que vamos a realizar la consulta en la tabla definida en esa variable. Y con WHERE estamos diciendo que el campo email tiene que contener el valor de la variable $dato. Esta es la forma típica de definir una consulta en MySQL, y en sus múltiples formas, esto es lo que haremos siempre a la hora de efectuar consultas a bases de datos.

Centrándonos en la forma de definir esta consulta, hay algo que se puede mejorar, y es que con el * estamos diciendo que busque en todos los campos cuando en realidad lo que nos interesa es el campo email, para hacer esto solo tenemos que sustituir el asterisco por el nombre del campo, quedaría de la siguiente forma:

"SELECT email FROM $tb1 WHERE email = '$dato'";
De esta forma optimizamos la consulta haciendo que solo se ejecuten las consultas precisas, y aun podemos optimizarla mas. Dado que en nuestra tabla el campo email es de tipo único, podemos agregar la cláusula LIMIT 1, con lo que indicamos que una vez se encuentre el dato, se detenga la búsqueda.

"SELECT email FROM $tb1 WHERE email = '$dato' LIMIT 1";
Estos dos aspectos mencionados no deben ser pasados por alto aunque no afecten al funcionamiento aparente de nuestro código, hace que las consultas sean mas eficientes, mas rápidas y menos costosas en lo que a recursos de servidor se refiere. En bases de datos pequeñas, esto puede no tener ningún efecto significativo, pero si nuestra Web alcanza un éxito notorio y los usuarios registrados pasan de unas pocas decenas a varios miles o cientos de miles, la consulta podría verse ralentizada, lo cual no es nada deseable. Si nuestras tablas alcanzan un volumen considerable debería usar count() en lugar de mysqli_num_rows(), el motivo, menor consumo de recursos de servidor.

Vamos ahora como ejercicio didáctico a ampliar la consulta efectuada, aunque esta consulta puede resultar poco practica. Veamos, dado que en nuestra base de datos, tanto el usuario como el email son campos únicos, podemos comprobar con una sola consulta si cualquiera de los dos está registrado, para ello precisaremos usar el operador OR.

SELECT usuario,email FROM $tb1 WHERE usuario = '$usuar' OR email = '$mail' LIMIT 1
En esta consulta hemos seleccionado los campos usuario y email, y tras el condicional WHERE comprobamos si existe el usuario o el email. Si cualquiera de los dos existe, nos indicara sus existencia, el pego, que así, tal cual, no sabemos cual de los dos existe ó si existen los dos. Por eso decíamos que esta consulta puede resultar poco práctica.

Para saber cual de los dos valores está registrado deberíamos hacer una consulta sobre uno de ellos, y si ese dato no esta registrado, dentro de su condicional efectuar otra consulta para el otro dato. De esta forma podríamos saber cual está registrado.

Llegados a este punto, ya tenemos todo lo necesario para guardar el registro de nuestros usuarios en nuestra base de datos. Dentro de este código expuesto, es donde pondríamos el código de registro en nuestra base de datos. Por supuesto ni que decir tiene que los datos procedentes del formulario de registro deberían estar antes de la estructura condicional aquí mencionada.

Por último, es importante hacer constar que el registro de usuarios es una de las etapas mas delicadas de un sitio Web. Si lo que vamos a registrar son los artículos de un blog o los productos de una tienda online, la asignación de una clave primaria lo suficientemente aleatorizada o con garantías de no repetirse esta, o las posibles claves únicas, no hacen precisa la comprobación de repetición de valores únicos.
Tags: Duplicado || condicional || mysqli_num_rows || count

Comentarios.

Sin comentarios, publica el tuyo.