CREATE en un CRUD con PHP y MySQL: formulario, INSERT y validación paso a paso ✍️
Después de crear la base de datos y configurar la conexión con PDO, llega el momento de la primera operación real del CRUD:
Crear registros en la base de datos.
En este caso de estudio, vamos a permitir que el usuario cree nuevos empleados usando:
- Un formulario HTML.
- Validación básica de datos.
- Un INSERT seguro con PDO.
- Control para evitar códigos duplicados.
- Mensajes flash para informar al usuario.
Este paso es clave, porque aquí comienza la interacción real con la base de datos.
¿Qué hace la operación CREATE?
La operación CREATE se encarga de:
- Recibir datos desde un formulario.
- Validarlos.
- Insertarlos en la base de datos.
- Informar si todo salió bien o hubo errores.
En nuestro caso, insertaremos datos en la tabla:
empleados
1. El formulario para crear empleados
Dentro de tu archivo principal del CRUD, el formulario tiene esta estructura básica:
<form method="POST" class="vstack gap-3"> <input type="hidden" name="csrf" value="<?= e($csrf) ?>"> <input type="hidden" name="action" value="create"> <input type="text" name="codigo" required maxlength="10"> <input type="text" name="nombres" required maxlength="50"> <input type="text" name="lugar_nacimiento" required maxlength="30"> <input type="text" name="fecha_nacimiento" required maxlength="30"> <input type="text" name="direccion" required maxlength="50"> <input type="text" name="telefono" required maxlength="10"> <input type="text" name="puesto" required maxlength="15"> <button type="submit">Crear empleado</button> </form>
Campos principales
Campo Descripción
codigo Clave primaria del empleado
nombres Nombre completo
lugar_nacimiento Ciudad o país
fecha_nacimiento Fecha en formato texto
direccion Dirección
telefono Número de contacto
puesto Cargo del empleado
estado Activo (1) o inactivo (0)
2. Capturar los datos enviados por POST
En tu archivo principal:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$action = $_POST['action'] ?? '';
Aquí detectamos si el formulario fue enviado.
Luego capturamos y limpiamos los datos:
$codigo = trim($_POST['codigo'] ?? ''); $nombres = trim($_POST['nombres'] ?? ''); $lugar_nacimiento = trim($_POST['lugar_nacimiento'] ?? ''); $fecha_nacimiento = trim($_POST['fecha_nacimiento'] ?? ''); $direccion = trim($_POST['direccion'] ?? ''); $telefono = trim($_POST['telefono'] ?? ''); $puesto = trim($_POST['puesto'] ?? ''); $estado = isset($_POST['estado']) ? (int)$_POST['estado'] : 1;
3. Validación básica de datos
Como tu tabla tiene límites de longitud, debemos respetarlos.
$errors = [];
if ($codigo === '' || strlen($codigo) > 10)
$errors[] = "El código es obligatorio y debe tener máximo 10 caracteres.";
if ($nombres === '' || strlen($nombres) > 50)
$errors[] = "El nombre es obligatorio (máx 50).";
if ($telefono === '' || strlen($telefono) > 10)
$errors[] = "Teléfono obligatorio (máx 10).";
Esto evita:
- Datos vacíos.
- Desbordar columnas.
- Errores en la base de datos.
Si hay errores:
if (!empty($errors)) {
flash("❌ Revisa el formulario:<br>• " . implode("<br>• ", $errors), "danger");
header("Location: crud-caso-de-estudio.php");
exit;
}
4. Evitar códigos duplicados (clave primaria)
El campo codigo es la clave primaria.
No pueden existir dos empleados con el mismo código.
Antes del INSERT:
$check = $pdo->prepare("SELECT COUNT(*) FROM empleados WHERE codigo = ?");
$check->execute([$codigo]);
if ((int)$check->fetchColumn() > 0) {
flash("⚠️ Ya existe un empleado con código $codigo.", "warning");
header("Location: crud-caso-de-estudio.php");
exit;
}
Esto evita errores de clave duplicada.
5. Insertar el empleado con PDO (consulta preparada)
Ahora sí, hacemos el INSERT seguro:
$stmt = $pdo->prepare("
INSERT INTO empleados
(codigo, nombres, lugar_nacimiento, fecha_nacimiento, direccion, telefono, puesto, estado)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
");
$stmt->execute([
$codigo,
$nombres,
$lugar_nacimiento,
$fecha_nacimiento,
$direccion,
$telefono,
$puesto,
$estado
]);
Este método:
- Evita inyección SQL.
- Es más seguro.
- Es la forma correcta de trabajar con bases de datos.
6. Mostrar mensaje flash de éxito
Después del INSERT:
flash("✅ Empleado creado correctamente.", "success");
header("Location: crud-caso-de-estudio.php");
exit;
Esto:
- Guarda el mensaje en sesión.
- Redirige al listado.
- Muestra el resultado al usuario.
7. ¿Qué son los mensajes flash?
Son mensajes temporales que:
- Se guardan en la sesión.
- Se muestran una sola vez.
- Informan el resultado de una acción.
Ejemplo:
flash("Empleado creado correctamente", "success");
Y luego en el HTML:
<?php if (!empty($mensaje)): ?> <div class="alert alert-<?= e($tipoMsg) ?>"><?= $mensaje ?></div> <?php endif; ?>
Esto mejora mucho la experiencia del usuario.
Flujo completo del CREATE
El proceso completo funciona así:
- Usuario llena el formulario.
- Se envía por POST.
- Se valida el token CSRF.
- Se validan los campos.
- Se verifica duplicado.
- Se hace el INSERT.
- Se muestra mensaje flash.
- Se redirige al listado.
Errores comunes en la operación CREATE
No validar los datos
Esto puede provocar:
- Datos corruptos.
- Errores SQL.
No usar consultas preparadas
Esto abre la puerta a:
- Inyección SQL.
- Hackeos.
No controlar duplicados
Provoca errores como:
Duplicate entry 'EMP001' for key 'PRIMARY'
Conclusión
La operación CREATE es el primer paso real de cualquier CRUD.
En este caso de estudio:
- Validamos datos.
- Evitamos duplicados.
- Usamos consultas preparadas.
- Mostramos mensajes claros.
Esto convierte un simple formulario en una operación segura y profesional.
En el siguiente paso del CRUD veremos:
➡️ READ: cómo listar empleados y crear un buscador eficiente con PDO