certmundo.
es‑mx

6 min de lectura

¿Cómo actualizar y eliminar registros en MySQL con PHP?

Actualizar y eliminar registros en MySQL desde PHP se hace con los comandos UPDATE y DELETE, ejecutados de forma segura a través de sentencias preparadas con PDO.

Cuando los datos cambian (y siempre cambian)

Imagina que trabajas en el área de TI de Liverpool. Un cliente cambia su dirección de correo y llama al servicio de atención. Si tu sistema no puede actualizar ese dato en segundos, pierdes tiempo y confianza. Ahora imagina que un producto se descontinuó y necesitas borrarlo del catálogo. Sin DELETE, tu base de datos se llena de basura. Dominar UPDATE y DELETE es tan importante como saber insertar datos.

En la lección anterior aprendiste a validar lo que entra. Ahora aprenderás a modificar y eliminar lo que ya existe, siempre con seguridad.

El sistema LOCALIZAR-MODIFICAR-CONFIRMAR

Todo UPDATE o DELETE exitoso sigue tres pasos en este orden:

  1. LOCALIZAR: Identifica exactamente qué registro vas a tocar. Siempre usa WHERE con el id.
  2. MODIFICAR o ELIMINAR: Ejecuta la sentencia SQL con parámetros enlazados, nunca con texto directo del usuario.
  3. CONFIRMAR: Verifica cuántas filas afectó la operación con rowCount().

Si omites el WHERE en un UPDATE, actualizas toda la tabla. Si lo omites en un DELETE, borras todo. Este sistema te obliga a pensar antes de ejecutar.

Cómo usar UPDATE en PHP

La sintaxis básica de UPDATE en SQL es:

UPDATE tabla SET columna1 = :valor1, columna2 = :valor2 WHERE id = :id;

En PHP con PDO, el flujo completo se ve así:

<?php
// Datos que vienen del formulario (ya validados)
$id     = (int) $_POST['id'];
$nombre = trim($_POST['nombre']);
$correo = trim($_POST['correo']);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=tienda;charset=utf8', 'root', '');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "UPDATE clientes SET nombre = :nombre, correo = :correo WHERE id = :id";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':nombre' => $nombre,
        ':correo' => $correo,
        ':id'     => $id
    ]);

    if ($stmt->rowCount() > 0) {
        echo "Cliente actualizado correctamente.";
    } else {
        echo "No se encontró el cliente o los datos son iguales.";
    }

} catch (PDOException $e) {
    error_log($e->getMessage());
    echo "Ocurrió un error. Intenta más tarde.";
}

Observa que el id se convierte a entero con (int) antes de usarlo. Esto elimina cualquier carácter extraño que pudiera venir del formulario.

Cómo usar DELETE en PHP

Eliminar un registro es más sencillo que actualizar, pero más peligroso si no usas WHERE.

<?php
$id = (int) $_POST['id'];

try {
    $pdo = new PDO('mysql:host=localhost;dbname=tienda;charset=utf8', 'root', '');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql  = "DELETE FROM clientes WHERE id = :id";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':id' => $id]);

    if ($stmt->rowCount() > 0) {
        echo "Cliente eliminado.";
    } else {
        echo "No se encontró ningún cliente con ese ID.";
    }

} catch (PDOException $e) {
    error_log($e->getMessage());
    echo "Ocurrió un error. Intenta más tarde.";
}

Siempre revisa rowCount(). Si regresa 0, nadie fue eliminado. Eso puede significar que el id no existe, o que alguien manipuló el formulario.

Ejemplo real: panel de empleados de FEMSA

Supón que FEMSA tiene una tabla empleados con estas columnas: id, nombre, puesto, salario. Necesitas un panel donde Recursos Humanos pueda actualizar salarios y eliminar empleados que ya no trabajan ahí.

Formulario de edición (editar.php):

<?php
// Recuperar datos del empleado para prellenar el formulario
$id = (int) $_GET['id'];
$pdo = new PDO('mysql:host=localhost;dbname=femsa_rh;charset=utf8', 'root', '');
$stmt = $pdo->prepare("SELECT * FROM empleados WHERE id = :id");
$stmt->execute([':id' => $id]);
$empleado = $stmt->fetch(PDO::FETCH_ASSOC);
?>
<form method="POST" action="procesar_edicion.php">
  <input type="hidden" name="id" value="<?= $empleado['id'] ?>">
  <input type="text" name="nombre" value="<?= htmlspecialchars($empleado['nombre']) ?>">
  <input type="text" name="puesto" value="<?= htmlspecialchars($empleado['puesto']) ?>">
  <input type="number" name="salario" value="<?= $empleado['salario'] ?>">
  <button type="submit">Guardar cambios</button>
</form>

Procesador (procesar_edicion.php):

<?php
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header('Location: lista.php');
    exit;
}

$id      = (int) $_POST['id'];
$nombre  = trim($_POST['nombre']);
$puesto  = trim($_POST['puesto']);
$salario = (float) $_POST['salario'];

// Validaciones básicas
if (empty($nombre) || empty($puesto) || $salario <= 0) {
    echo "Todos los campos son obligatorios y el salario debe ser mayor a $0.";
    exit;
}

try {
    $pdo = new PDO('mysql:host=localhost;dbname=femsa_rh;charset=utf8', 'root', '');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "UPDATE empleados SET nombre = :nombre, puesto = :puesto, salario = :salario WHERE id = :id";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':nombre'  => $nombre,
        ':puesto'  => $puesto,
        ':salario' => $salario,
        ':id'      => $id
    ]);

    echo "Empleado actualizado. Nuevo salario: $" . number_format($salario, 0) . ".";

} catch (PDOException $e) {
    error_log($e->getMessage());
    echo "Error interno. Contacta al administrador.";
}

Con este ejemplo, si el área de Recursos Humanos sube el salario de una coordinadora de $18,500 a $21,000, el cambio queda registrado al instante y de forma segura.

Errores comunes al usar UPDATE y DELETE

Conocer los errores más frecuentes te ahorra horas de depuración.

Error 1: Olvidar el WHERE

-- ¡PELIGRO! Esto actualiza TODOS los registros de la tabla
UPDATE clientes SET correo = 'nuevo@correo.com';

Siempre incluye WHERE id = :id. Sin esa cláusula, afectas toda la tabla en un solo comando.

Error 2: Usar el id directamente del usuario sin convertirlo

// MAL: vulnerable a inyección
$sql = "DELETE FROM clientes WHERE id = " . $_POST['id'];

// BIEN: seguro y tipado
$id  = (int) $_POST['id'];
$sql = "DELETE FROM clientes WHERE id = :id";

Siempre convierte el id a entero antes de usarlo. Eso bloquea cualquier intento de inyección en ese campo.

Error 3: No verificar rowCount() después de UPDATE

Si el usuario envía exactamente los mismos datos que ya están guardados, MySQL no hace ningún cambio y rowCount() regresa 0. Eso no es un error, pero debes comunicárselo al usuario para que no piense que algo salió mal.

Error 4: Borrar sin confirmación del usuario

En un panel real, nunca ejecutes DELETE directamente al hacer clic en un botón. Usa una pantalla de confirmación o un modal que pregunte: ¿Estás seguro de eliminar a este empleado? Esto evita borrados accidentales que son difíciles de revertir.

Construye tu panel CRUD completo

Ya tienes las cuatro operaciones:

  • Create → INSERT (lección 6)
  • Read → SELECT (lección 5)
  • Update → UPDATE (esta lección)
  • Delete → DELETE (esta lección)

Con estas cuatro piezas puedes construir cualquier panel administrativo: catálogo de productos para Mercado Libre, directorio de empleados para Bimbo, gestión de clientes para FEMSA. El patrón es siempre el mismo: conectar, preparar, ejecutar, verificar.

Una buena práctica es centralizar tu conexión a la base de datos en un solo archivo conexion.php y cargarlo con require_once en cada script. Así, si cambias las credenciales, solo modificas un archivo.

<?php
// conexion.php
function obtenerPDO() {
    $pdo = new PDO('mysql:host=localhost;dbname=tienda;charset=utf8', 'root', '');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    return $pdo;
}

Después en cualquier script:

require_once 'conexion.php';
$pdo = obtenerPDO();

Esto convierte tu código en algo profesional y fácil de mantener.

El dato que cambia es inevitable; lo que no debe cambiar es la seguridad con la que lo manejas.

Puntos clave

  • Aplica siempre el sistema LOCALIZAR-MODIFICAR-CONFIRMAR: identifica el registro con `WHERE id = :id`, ejecuta la sentencia con parámetros enlazados y verifica el resultado con `rowCount()`.
  • Nunca omitas el `WHERE` en un `UPDATE` o `DELETE`. Sin esa cláusula, afectas toda la tabla en una sola instrucción y los datos se pierden o sobreescriben por completo.
  • Convierte siempre el `id` recibido del formulario a entero con `(int) $_POST['id']` antes de usarlo en cualquier sentencia SQL. Esto bloquea intentos de inyección en ese campo.
  • Usa `rowCount()` después de cada `UPDATE` o `DELETE` para confirmar si la operación realmente afectó algún registro. Un resultado de `0` puede significar que el ID no existe o que los datos no cambiaron.
  • Centraliza tu conexión PDO en un archivo `conexion.php` y cárgalo con `require_once`. Así construyes un panel CRUD completo y fácil de mantener en cualquier proyecto.

Comparte esta lección: