Borrar datos de una tabla.

Resumen.

En nuestras bases de datos a menudo se generan registros sin valor, registros estos que solo hacen sobrecargar nuestra base de datos de manera inútil. En casos así, debemos proceder a eliminar los registros no válidos, lo que podemos hacer de manera individual, en grupo e incluso dejar la tabla completamente vacía. En este artículo veremos como debemos proceder y que precauciones debemos tomar cuando nos enfrentamos a este tipo de situaciones.

Artículo.

En este aspecto vamos a tratar uno de los aspectos mas delicados a los que nos enfrentaremos a la hora gestionar nuestro sitio Web, la eliminación de datos de nuestras tablas.

Eliminar datos es una tarea muy sencilla en términos de programación y es muy similar a la actualización de datos a la que ya le hemos dedicado un artículo. Su sintaxis es la siguiente:

$_BORRAR_SQL = "DELETE FROM $tablaX WHERE email = '$email'";
mysqli_query($Conex_BD, $_BORRAR_SQL);


Mediante la cláusula DELETE indicamos a MySQL que vamos a eliminar un cierto registro o un cierto grupo de registros, FROM nos permite indicar en que tabla vamos a borrar los registros y mediante WHERE indicamos una condición para eliminar uno o varios registros.

En el caso expuesto, la condición es eliminar el registro cuando el campo email tome el valor guardado en la variable $email. En este caso, y dado que en la tabla de referencia el campo email es único, solo se eliminará un registro. Pero si el condicional fuera sobre el campo sexo, que le hemos asignado valores 1 (para los hombres) y 2 (para las mujeres) tomaría la siguiente forma:

WHERE sexo = '1'


Y en este caso eliminaríamos todos los usuarios varones de nuestra tabla de datos. Por tanto, debemos tener mucho cuidado a la hora de programar esta consulta, ya que como se puede imaginar, nos podemos encontrar por un simple error ante sorpresas muy desagradables. Es tanto el cuidado que debemos tener, que a la hora de publicar el código hemos asignado a la variable tabla el nombre $tablaX, en lugar $tb1, como venimos haciendo a lo largo de este curso, el motivo, tratar de minimizar el riesgo de que accidentalmente podamos borrar registros de manera no intencionada.

La consulta de eliminación de registros puede ser mejorada si el condicional es compuesto. Por ejemplo, digamos que vamos a eliminar todos los usuarios que no han validado su cuenta, y por tanto, son estos registros inútiles, podemos hacer de la siguiente manera:

DELETE FROM $tablaX WHERE validaok = 'no' AND f_regis < '2022-12-31 23:59'


De esta forma eliminaremos todos los registros que no han validado su cuenta y son anteriores a le fecha especificada.

Cuando solo deseamos eliminar un registro es buena costumbre usar la cláusula LIMIT, dado que de esta forma además de asegurarnos de no eliminar más de un registro, también detenemos la consulta una vez encontrado el dato especificado.

"DELETE FROM $tablaX WHERE email = '$email' LIMIT 1"


Un detalle que me parece importante comentar es el relativo a un campo que prácticamente existe en todas las tablas, me refiero al campo id, que suele ser de tipo autoincremental de valor entero, como ocurre en la tabla de referencia mencionada anteriormente.

"DELETE FROM $tablaX WHERE id = '$id' LIMIT 1"


El problema que tiene este campo, es que es intuitivo, me refiero por ejemplo a que si yo tengo un id para eliminar mi cuenta de usuario, y mi id es por ejemplo el 3564, si no hubiera una escrupulosa validación podría enviar cualquier valor de id (ej: 1527, 2304, 692) y eliminaría este registro o cualquier otro. El problema podría ser mucho mas grave si las variables a eliminar pasan a través del método GET, por lo que siempre deberemos usar el método POST a la hora de enviar datos mediante un formulario para realizar esta acción.

Veremos ahora cual podría ser la estructura de un código para eliminar registros de usuarios no validados. Para ello debemos tener en cuenta que este formulario solo será accesible para usuarios identificados, por lo que recogeremos la variable id_usuario que fue generada en el proceso de identificación como variable de sesión. El código, considerando la tabla de referencia, podría ser algo como el siguiente:

<?php

include('archivos/func_conexionBD.php');

$email = $_POST['email'];
$confirmar = $_POST['confirmar'];
$id_usuario = $_SESSION['id_usuario']; // Recuperamos sesion

if($confirmar == 'si'){
$Conex_BD = ConectaBD();
$_BORRAR_SQL = "DELETE FROM $tablaX WHERE email = '$email' AND id_usuario = '$id_usuario'";
mysqli_query($Conex_BD, $_BORRAR_SQL);
DesconectaBD($Conex_BD);
echo "<p>El usuario ha sido eliminado.</p>";
}else{
echo "<p>El usuario NO ha sido eliminado.</p>";
}
?>


¿Qué hemos hecho? Recibimos desde un formulario por POST las variables “e-mail” y “confirmar”. La variable “confirmar” puede ser por ejemplo un campo radio o select que pregunte al usuario algo así como “¿Realmente desea darse de baja?” y a menos que el usuario marque la opción “si” la baja (eliminación del registro) no se producirá.

Respecto a la variable “id_usuario”, dado que este formulario solo deberá estar disponible para usuarios logados, ha sido propagada como sesión, así que tras recuperarla indicamos en la consulta que debe haber una correspondencia en el registro entre esa variable y el email, de esta forma, si un usuario introduce un e-mail de otro usuario, la baja no se producirá.

El defecto de este código es que, aunque se de el caso de no eliminarse por haber introducido un e-mail que no corresponde al usuario identificado, el sistema seguirá informando que se ha eliminado el registro. Esto lo podemos solucionar mediante este código.

Como consejo sobre eliminación de datos para este caso concreto, baja de usuarios, agregaría que lo mas interesante podría ser pedir al usuario su clave de acceso, de esta forma nos aseguramos que es él quien realmente quien ha realizado la baja.

DELETE FROM $tablaX WHERE id_usuario = '$id_usuario' AND clave = '$clave'


Por supuesto, todas estas precauciones no son precisas para eliminar todos los registros, sencillamente es una forma de aplicar métodos de seguridad a nuestras aplicaciones, métodos estos, que según los casos, no siempre serán necesarios, mientras que otras en otras situaciones pueden no ser suficientes. Recordamos también al lector un aspecto no mencionado en este artículo, la importancia de la validación de los datos, en este caso concreto, debe ser muy cuidadosa.

Para cerrar este capitulo nos referiremos a dos cláusulas tan útiles como PELIGROSAS si no nos andamos con mucho OJO, me refiero a:

TRUNCATE: que eliminará todos los registros de la tabla, la deja vacía y en caso de un id autoincremental, se reiniciaría con los nuevos registros. La estructura de la tabla se conservaría intacta.

TRUNCATE FROM $tablaX // OJO, PELIGRO


DROP: si bien en el caso anterior solo desaparecen los registros, en este caso, también desaparece la tabla sin quedar rastro alguno de ella, por tanto, muchísimo OJO con su uso si no quieres convertirte en cliente honorífico de Laboratorios Bayer.

DROP FROM $tablaX // OJO, MAS PELIGRO


Y con esto finalizamos este artículo dedicado a la eliminación de datos, espero os resulte útil.
Tags: DELATE || TRUNCATE || DROP || borrar || eliminar

Comentarios.

Sin comentarios, publica el tuyo.