UPDATE en un CRUD con PHP y MySQL: editar empleados con PDO (modo edición + PK bloqueada) ✏️

En un CRUD real, crear y listar registros es solo el inicio.

Lo que lo vuelve verdaderamente útil es poder editar información existente sin romper nada (ni la base de datos, ni la experiencia del usuario).


En este paso vamos a implementar la operación:

UPDATE (editar/actualizar)


Y lo haremos de forma profesional, tal como está en tu caso de estudio:

  • Cargar un empleado con ?edit=
  • Entrar en modo edición (el formulario se rellena solo)
  • Bloquear el campo PK (codigo) para evitar inconsistencias
  • Ejecutar un UPDATE seguro con PDO y parámetros
  • Mantener el estado de edición tras guardar cambios

¿Por qué es importante “editar bien”?


Editar un registro parece sencillo, pero ahí es donde se cometen errores típicos:

  • Cambiar la clave primaria por accidente
  • No cargar datos correctamente
  • Actualizar el registro equivocado
  • Perder el estado del formulario y confundir al usuario
  • Exponer el sistema a inyección SQL

Nuestro objetivo es evitar todo eso.



1) Cargar el registro a editar con ?edit=


En tu CRUD, al hacer clic en “Editar”, se manda al usuario a una URL como:

crud-caso-de-estudio.php?edit=EMP001


Y en PHP capturas el parámetro:

if (isset($_GET['edit'])) {
  $codigo = trim($_GET['edit']);
  $stmt = $pdo->prepare("SELECT * FROM empleados WHERE codigo = ? LIMIT 1");
  $stmt->execute([$codigo]);
  $edit = $stmt->fetch();

  if ($edit) {
    $isEdit = true;
  } else {
    flash("❌ Empleado no encontrado.", "danger");
    header("Location: crud-caso-de-estudio.php");
    exit;
  }
}


Qué hace esto

  • Obtiene el codigo desde la URL
  • Busca el empleado exacto con SELECT ... WHERE codigo = ?
  • Si existe, activa el modo edición ($isEdit = true)
  • Si no existe, muestra error y redirige al listado

✅ Importante: usamos LIMIT 1 por eficiencia.



2) Mantener estado de edición: $isEdit


Tu CRUD usa un patrón muy limpio:

  • $isEdit = false → modo “nuevo empleado”
  • $isEdit = true → modo “editar empleado”

Esto permite que:

  • Cambie el título del formulario
  • Cambie el botón
  • Cambie la acción del POST (create vs update)
  • Se rellenen los valores automáticamente


Ejemplo del título:

<?= $isEdit ? "✏️ Editar empleado" : "➕ Nuevo empleado" ?>

3) Rellenar el formulario automáticamente


Cuando $isEdit es true, el formulario toma los valores del array $edit:

<input type="text" name="nombres"
  value="<?= e($isEdit ? $edit['nombres'] : '') ?>">

Esto hace que el usuario no tenga que “volver a escribir todo”.



4) Bloquear el campo PK (codigo) al editar


Este punto es clave y está muy bien aplicado en tu proyecto.

El campo codigo es la clave primaria.

Si lo permites editar, puedes generar:

  • duplicados
  • referencias rotas
  • inconsistencias
  • confusión

Por eso, en edición lo dejas como readonly:

<input
  type="text"
  name="codigo"
  value="<?= e($isEdit ? $edit['codigo'] : '') ?>"
  <?= $isEdit ? 'readonly' : '' ?>
>

✅ Este enfoque es perfecto para un caso de estudio claro y seguro.



5) Diferenciar UPDATE vs CREATE desde el formulario


Para que el mismo formulario sirva para crear y editar, usas un campo hidden:

<input type="hidden" name="action" value="<?= $isEdit ? 'update' : 'create' ?>">

Entonces:

  • Si estás creando → action=create
  • Si estás editando → action=update

Eso simplifica muchísimo el CRUD.



6) Ejecutar el UPDATE seguro con parámetros


Cuando llega el POST, tu código detecta:

if ($action === 'update') {

Y ejecuta el UPDATE con consulta preparada:

$stmt = $pdo->prepare("
  UPDATE empleados SET
    nombres = ?,
    lugar_nacimiento = ?,
    fecha_nacimiento = ?,
    direccion = ?,
    telefono = ?,
    puesto = ?,
    estado = ?
  WHERE codigo = ?
");

$stmt->execute([
  $nombres,
  $lugar_nacimiento,
  $fecha_nacimiento,
  $direccion,
  $telefono,
  $puesto,
  $estado,
  $codigo
]);

Por qué esto es seguro

  • No concatenas variables dentro del SQL
  • PDO manda los datos por separado
  • Evitas inyección SQL

7) Mantener el estado de edición después de guardar


Esto es un detalle “pro” que mejora la experiencia.

Después de actualizar, rediriges a:

header("Location: crud-caso-de-estudio.php?edit=" . urlencode($codigo));
exit;

Eso permite que:

  • El usuario vea el formulario aún en edición
  • Se mantenga el contexto
  • No “se pierda” después de guardar

Y además muestras un flash:

flash("✏️ Empleado actualizado correctamente.", "primary");

8) ¿Qué pasa si hay errores en validación mientras editas?


Otro detalle importante: si falla la validación y estabas editando, tu redirección conserva el modo edición:

$redir = "crud-caso-de-estudio.php" . ($action === 'update' ? "?edit=" . urlencode($codigo) : "");
header("Location: $redir");
exit;

Esto evita el típico error de UX:

“Guardé mal y me mandó a crear uno nuevo”.

Flujo completo del UPDATE


Así funciona todo el proceso:

  1. Usuario hace clic en Editar
  2. URL: ?edit=EMP001
  3. PHP carga el empleado (SELECT)
  4. Se activa modo edición
  5. Formulario se rellena solo (y bloquea codigo)
  6. Usuario edita campos
  7. POST con action=update
  8. Validación
  9. UPDATE con PDO
  10. Flash + redirección a ?edit=...

Errores comunes al implementar UPDATE (y cómo evitarlos)


Actualizar sin WHERE

Terminas modificando todos los registros.

Permitir editar la PK sin control

Puedes romper el sistema y crear inconsistencias.

Concatenar variables en SQL

Riesgo alto de inyección SQL.

No mantener modo edición

Confunde al usuario y empeora la usabilidad.

Tu proyecto evita estos errores correctamente.



Conclusión:


La operación UPDATE en este CRUD está hecha de forma limpia y segura:

  • Carga de registro con ?edit=
  • Modo edición con $isEdit
  • PK bloqueada (codigo)
  • UPDATE con consultas preparadas
  • Redirección que mantiene contexto

En el siguiente paso vamos con el último del CRUD clásico:

➡️ DELETE: eliminar empleados con confirmación y token CSRF



Post relacionados: