Eliminar datos en MySQL usando PDO en PHP

26/07/2024 | MySQL, PHP | 0 comentarios

Elimina registros en MySQL usando PDO en PHP. Usa consultas preparadas para evitar inyecciones SQL y manejar errores eficientemente.

Descargar archivos


Eliminar registros en una base de datos es una operación común en el desarrollo de aplicaciones web, no es una tarea muy compleja pero hay que tener cuidado respecto a la seguridad e integridad de datos, veamos como hacerlo de manera segura y eficiente.

Requisitos Previos

  • Un servidor web con soporte para PHP.
  • Un servidor de base de datos MySQL y una tabla con data.
  • Credenciales de la base de datos
  • Conocimientos básicos de SQL.

Para empezar se requiere la conexión con la base de datos, para mas detalle puedes leer Guía para conectar PHP a una base de datos con PDO.


<?php
// parameters
$dsn = 'mysql:host=localhost;port=3306;dbname=dbname';
$username = 'dbuser';
$password = 'password';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'",
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);

try {
    $pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
    echo $e->getMessage();
    die();
}

Eliminar datos en MySQL

Para eliminar datos en MySQL se usa la directiva DELETE FROM, además se usa la clausula WHERE para filtrar los datos que se quiere eliminar, como ejemplo eliminamos el registro que tenga el campo id igual a 3:

DELETE FROM users WHERE id = 3

Ahora usamos PHP para crear la consulta SQL y enviarla con PDO de la siguiente manera:


$id = 3;

$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->bindParam('id', $id, PDO::PARAM_INT);
$stmt->execute();

Estamos usando bindParam para vincular la variable $id con el parámetro de la consulta, además usamos PDO::PARAM_INT para convertir el dato a un entero y evitar que la consulta genere un error por un tipo de dato incorrecto. Finalmente, ejecutamos la consulta usando $stmt->execute().

Ejemplo completo

Primero consultamos los usuarios de nuestra tabla:


// query users
$stmt = $pdo->prepare("SELECT * FROM users");
$stmt->execute();

Luego creamos una lista con los usuarios, mostramos el nombre del usuario y un enlace para eliminar el registro, este enlace contiene un parámetro GET con el id del usuario.


<ul>
    <?php while (($result = $stmt->fetch()) !== false): ?>
    <li>
        <?php echo $result->name; ?> 
        (<a href="delete.php?action=delete&id=<?php echo $result->id; ?>">Eliminar</a>)
    </li>
    <?php endwhile; ?>
</ul>

Luego, creamos el script para eliminar datos, para ello obtenemos y filtramos como entero el id del usuario, preparamos la consulta para eliminar y finalmente ejecutamos la sentencia SQL.


// delete data
$action = $_GET['action'];
if ($action == 'delete') {
    $id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
    if ($id <= 0) {
        echo 'Debe seleccionar un usuario valido';
        die();
    }

    try {
        $stmt = $pdo->prepare("DELETE FROM users WHERE id=:id");
        $stmt->bindParam('id',  $id, PDO::PARAM_INT);
        $stmt->execute();

        echo "Registro eliminado correctamente";
    } catch (PDOException $e) {
        echo "Error al eliminar: " . $e->getMessage();
    }
}

Uniendo los bloques de código (conexión a base de datos, listado de usuario y eliminar el registro) tendríamos el siguiente script completo:


<?php
// file: delete.php

// prepare connection
$dsn = 'mysql:host=localhost;port=3306;dbname=dbname';
$username = 'dbuser';
$password = 'password';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'",
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION
);

try {
    $pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
    echo $e->getMessage();
    die();
}

// delete data
$action = $_GET['action'];
if ($action == 'delete') {
    $id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
    if ($id <= 0) {
        echo 'Debe seleccionar un usuario valido';
        die();
    }

    try {
        $stmt = $pdo->prepare("DELETE FROM users WHERE id=:id");
        $stmt->bindParam('id',  $id, PDO::PARAM_INT);
        $stmt->execute();

        echo "Registro eliminado correctamente";
    } catch (PDOException $e) {
        echo "Error al eliminar: " . $e->getMessage();
    }
}

// query users
$stmt = $pdo->prepare("SELECT * FROM users");
$stmt->execute();
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Delete MySQL</title>
</head>
<body>
<ul>
    <?php while (($result = $stmt->fetch()) !== false): ?>
    <li>
        <?php echo $result->name; ?> 
        (<a href="delete.php?action=delete&id=<?php echo $result->id; ?>">Eliminar</a>)
    </li>
    <?php endwhile; ?>
</ul>
</body>
</html>

Recomendaciones

Para eliminar datos hay que tener cuidado por que se puede terminar eliminando datos de manera accidental, por lo que debes tener en cuenta:

  • Puedes mostrar una pantalla de Confirmación de eliminación, para que el usuario confirme el proceso y evitar eliminación accidental.
  • Evitar enviar los ids a eliminar como parámetros GET, los usuarios pueden manipular el parámetro y eliminar datos sin previa validación.
  • Siempre filtra y valida los de datos antes de usarlos en la consulta de eliminación, de lo contrario podemos recibir ataques de inyección SQL.
  • Se puede implementar eliminación lógica: activo / inactivo, esto permite que se puedan recuperar los datos posteriormente cambiando de estado.
  • Para eliminar registros asegúrate que no existan datos dependientes. Por ejemplo no deberías eliminar una categoría si existen productos en la categoría.
  • Utiliza tokens de seguridad (valores aleatorios, únicos en cada solicitud) para eliminar registros, envíalos en cada solicitud y valídalos antes de eliminar un registro.

Conclusión

Eliminar registros en MySQL usando PDO en PHP es un proceso sencillo. Al utilizar PDO, podemos beneficiarnos de su soporte para consultas preparadas, lo que nos ayuda a prevenir inyecciones SQL y a escribir código más limpio y mantenible.

Envíar Comentario

En este sitio los comentarios se publican previa aprobación del equipo de Kodetop. Evita los comentarios ofensivos, obscenos o publicitarios. Si deseas publicar código fuente puedes hacerlo entre las etiquedas <pre></pre>