Eliminar datos de MySQL
Aprende a eliminar datos de una base de datos MySQL con PHP usando la sentencia DELETE, prepared statements y mysqli o PDO.
Eliminar datos en MySQL con PHP
La sentencia SQL DELETE elimina una o más filas de una tabla. En PHP se envía esa sentencia a MySQL a través de una conexión a base de datos existente y — dado que las eliminaciones son irreversibles — siempre se deben filtrar con una cláusula WHERE y vincular cualquier valor proporcionado por el usuario mediante un prepared statement para protegerse contra la inyección SQL.
Esta guía cubre el flujo de trabajo completo con la extensión mysqli: conectar, construir el DELETE, ejecutarlo de forma segura, leer cuántas filas se vieron afectadas y (opcionalmente) cerrar la conexión. También muestra el equivalente en PDO, que la mayoría de los proyectos modernos prefieren.
La sentencia DELETE de un vistazo
DELETE FROM table_name
WHERE column_name = 'value';table_name— la tabla de la que deseas eliminar filas.- La cláusula
WHEREdetermina cuáles filas se eliminan. Los valores de tipo string deben estar entre comillas simples. - Si se omite
WHERE, se eliminan todas las filas de la tabla. No hay forma de deshacer esto, así que trata unDELETEsinWHEREcomo si fueraTRUNCATE.
Si eres nuevo en el filtrado de filas, lee primero PHP MySQL Where — la misma sintaxis de condición aplica a DELETE, UPDATE y SELECT.
Paso 1: Conectarse a tu base de datos MySQL
Antes de eliminar cualquier cosa necesitas una conexión abierta. mysqli_connect() devuelve un manejador de conexión, o false en caso de error:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database_name";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}Reemplaza localhost con el host de tu servidor, las credenciales con tu inicio de sesión y database_name con la base de datos que contiene la tabla. Para una mirada más detallada a las opciones, consulta PHP MySQL Connect.
Paso 2: Eliminar una fila de forma segura con un prepared statement
Nunca pegues un valor proporcionado por el usuario directamente en la cadena SQL — así es como ocurre la inyección SQL. En su lugar, coloca un marcador ? en la consulta y vincula el valor a él. MySQL entonces trata el valor estrictamente como datos, nunca como SQL.
<?php
// 1. Prepare the DELETE with a placeholder
$stmt = mysqli_prepare($conn, "DELETE FROM users WHERE id = ?");
// 2. Bind the value: "i" = integer, "s" = string, "d" = double, "b" = blob
$id = 42; // e.g. the id of the record to remove
mysqli_stmt_bind_param($stmt, "i", $id);
// 3. Execute and report the result
if (mysqli_stmt_execute($stmt)) {
$deleted = mysqli_stmt_affected_rows($stmt);
echo "Deleted {$deleted} record(s).";
} else {
echo "Error deleting record: " . mysqli_stmt_error($stmt);
}
mysqli_stmt_close($stmt);Reemplaza users e id con tu propia tabla y columna. La cadena de tipo pasada a mysqli_stmt_bind_param() debe coincidir con los valores vinculados: usa "i" para el id entero del ejemplo, "s" para texto.
mysqli_stmt_affected_rows() te indica cuántas filas fueron realmente eliminadas. Si devuelve 0, ninguna fila coincidió con tu cláusula WHERE — útil para distinguir entre "eliminado" y "nada que eliminar."
Paso 3: Eliminar con PDO (la alternativa moderna)
PDO funciona de la misma manera y es portable entre motores de base de datos. Los marcadores con nombre hacen la intención más clara:
<?php
$pdo = new PDO("mysql:host=localhost;dbname=database_name", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->execute([':id' => 42]);
echo $stmt->rowCount() . " record(s) deleted.";rowCount() es el equivalente de affected_rows en PDO. Establecer ERRMODE_EXCEPTION hace que PDO lance excepciones en caso de errores en lugar de fallar silenciosamente.
Paso 4: Cerrar la conexión (opcional)
PHP cierra la conexión automáticamente cuando termina el script, pero puedes liberarla anticipadamente en scripts de larga ejecución:
<?php
mysqli_close($conn);Errores comunes
- Olvidar
WHERE.DELETE FROM users;vacía toda la tabla. Siempre verifica la cláusula antes de ejecutarla en datos de producción. - Construir SQL con concatenación de cadenas.
"DELETE FROM users WHERE name = '$name'"es vulnerable a inyección SQL. Usa marcadores en su lugar. - Asumir que se eliminó una fila. Comprueba
affected_rows/rowCount(); una cláusulaWHEREque no coincide no elimina nada y aún así "tiene éxito." - Eliminar filas de las que depende otra tabla. Una clave foránea con
ON DELETE RESTRICTbloqueará la eliminación; conON DELETE CASCADEtambién eliminará las filas relacionadas. Conoce tu esquema primero. - Eliminaciones suaves. Cuando puedas necesitar los datos de vuelta, agrega un indicador
is_deletedy usaUPDATEen su lugar — consulta PHP MySQL Update Data.
Conclusión
Eliminar datos en MySQL con PHP es un flujo de trabajo claro de cuatro partes: conectar, preparar un DELETE parametrizado, ejecutarlo y leer el conteo de filas afectadas. Las reglas innegociables son: siempre delimitar la eliminación con una cláusula WHERE y siempre vincular la entrada del usuario a través de un prepared statement. Para eliminar las filas coincidentes de manera diferente, compara con PHP MySQL Insert Data y PHP MySQL Select Data, o profundiza en seguridad en PHP MySQL Prepared Statements.