Guardar solicituc
Te ayudo a explicar este código en detalle. Se trata de un sistema de registro de solicitudes con interfaz web.
Parte 1: Formulario HTML/PHP
<form method="POST">Campos del formulario:
Promovente: Campo de texto para ingresar nombre
Dirigido a: Select dinámico que se llena desde PHP
<?php foreach ($opcionesDirigido as $opcion): ?>Tipo de Solicitud: Select con opciones predefinidas
Medio de recepción: Cómo se recibió la solicitud
Observaciones: Área de texto para comentarios
Campos ocultos importantes:
registro: Toma el usuario de la sesión o "Sistema"form_submitted: Bandera para identificar envío del formulario
Parte 2: Procesamiento PHP
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['form_submitted'])) {
Flujo de procesamiento:
Recoge datos del POST: Crea array con la información
Genera prefólio único:
'PRE-' . date('Ymd') . '-' . str_pad(rand(1, 999), 3, '0', STR_PAD_LEFT)
Ejemplo:
PRE-20231215-042Llama a función crearSolicitud(): Inserta en base de datos
Redirección POST/REDIRECT/GET: Evita reenvío al refrescar
Parte 3: Función de Base de Datos
function crearSolicitud($pdo, $datos) { $stmt = $pdo->prepare("INSERT INTO solicitudes..."); return $stmt->execute([...]); }
Características de seguridad:
✅ Prepared statements: Previene inyección SQL
✅ htmlspecialchars(): Previene XSS en opciones del select
✅ Validación required: Validación HTML del lado cliente
✅ Redirección después de POST: Patrón PRG (Post-Redirect-Get)
Flujo completo:
Usuario → Llena formulario → Hace submit
Servidor → Procesa datos → Genera prefólio → Inserta en BD
Servidor → Redirecciona con parámetros GET
Cliente → Muestra mensaje de éxito con prefólio
Estructura de la tabla solicitudes:
prefolio (texto, único)
promovente (texto)
tipo_solicitud (texto)
observaciones (texto)
dirigido (texto)
medio (texto)
registro (texto)
fecha_creación (timestamp, implícito)
Es un sistema completo que sigue buenas prácticas de desarrollo web seguro
Aquí tienes el código completo integrado:
<?php session_start(); require 'conexion.php'; // Archivo con la conexión a la base de datos // Obtener opciones para el campo "Dirigido a" (ejemplo) $opcionesDirigido = ['JUZGADO 1', 'JUZGADO 2', 'JUZGADO 3', 'FISCALÍA']; // Procesar formulario if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['form_submitted'])) { $datos = [ 'promovente' => trim($_POST['promovente']), 'tipo_solicitud' => $_POST['tipo_solicitud'], 'observaciones' => trim($_POST['observaciones']), 'dirigido' => $_POST['dirigido'], 'medio' => $_POST['medio'], 'registro' => $_POST['registro'] ]; // Validación básica if (empty($datos['promovente']) || empty($datos['observaciones'])) { $error = "Todos los campos son requeridos"; } else { // Asignar prefolio $prefolio = 'PRE-' . date('Ymd') . '-' . str_pad(rand(1, 999), 3, '0', STR_PAD_LEFT); $datos['prefolio'] = $prefolio; if (crearSolicitud($pdo, $datos)) { // Redirección para evitar reenvío al actualizar header("Location: ".$_SERVER['PHP_SELF']."?success=1&prefolio=".$prefolio); exit(); } else { $error = "Error al crear la solicitud"; } } } // Funciones principales function crearSolicitud($pdo, $datos) { try { // Insertar en la base de datos $stmt = $pdo->prepare("INSERT INTO solicitudes (prefolio, promovente, tipo_solicitud, observaciones, dirigido, medio, registro, fecha_creacion) VALUES (?, ?, ?, ?, ?, ?, ?, NOW())"); return $stmt->execute([ $datos['prefolio'], $datos['promovente'], $datos['tipo_solicitud'], $datos['observaciones'], $datos['dirigido'], $datos['medio'], $datos['registro'] ]); } catch (PDOException $e) { error_log("Error al crear solicitud: " . $e->getMessage()); return false; } } // Mostrar mensaje de éxito después de redirección if (isset($_GET['success']) && $_GET['success'] == 1 && isset($_GET['prefolio'])) { $mensaje = "Solicitud creada exitosamente! Prefolio: " . htmlspecialchars($_GET['prefolio']); } ?> <!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Registro de Solicitudes</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container mt-5"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header"> <h3 class="text-center">Registro de Nueva Solicitud</h3> </div> <div class="card-body"> <?php if (isset($mensaje)): ?> <div class="alert alert-success alert-dismissible fade show" role="alert"> <?= $mensaje ?> <button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> <?php endif; ?> <?php if (isset($error)): ?> <div class="alert alert-danger alert-dismissible fade show" role="alert"> <?= $error ?> <button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> <?php endif; ?> <form method="POST"> <div class="modal-body"> <div class="mb-3"> <label class="form-label">Promovente</label> <input type="text" name="promovente" class="form-control" required value="<?= isset($_POST['promovente']) ? htmlspecialchars($_POST['promovente']) : '' ?>"> </div> <div class="mb-3"> <label class="form-label">Dirigido a</label> <select name="dirigido" class="form-select" required> <?php foreach ($opcionesDirigido as $opcion): ?> <option value="<?= htmlspecialchars($opcion) ?>" <?= (isset($_POST['dirigido']) && $_POST['dirigido'] == $opcion) ? 'selected' : '' ?>> <?= htmlspecialchars($opcion) ?> </option> <?php endforeach; ?> </select> </div> <div class="mb-3"> <label class="form-label">Tipo de Solicitud</label> <select name="tipo_solicitud" class="form-select" required> <option value="CON_DETENIDO" <?= (isset($_POST['tipo_solicitud']) && $_POST['tipo_solicitud'] == 'CON_DETENIDO') ? 'selected' : '' ?>>CON DETENIDO</option> <option value="ORDEN_APREHENSION" <?= (isset($_POST['tipo_solicitud']) && $_POST['tipo_solicitud'] == 'ORDEN_APREHENSION') ? 'selected' : '' ?>>ORDEN DE APREHENSION</option> <option value="SIN_DETENIDO" <?= (isset($_POST['tipo_solicitud']) && $_POST['tipo_solicitud'] == 'SIN_DETENIDO') ? 'selected' : '' ?>>SIN DETENIDO</option> </select> </div> <div class="mb-3"> <label class="form-label">Medio de recepción</label> <select name="medio" class="form-select" required> <option value="FISICO" <?= (isset($_POST['medio']) && $_POST['medio'] == 'FISICO') ? 'selected' : '' ?>>Presentación física en juzgado</option> <option value="EMAIL" <?= (isset($_POST['medio']) && $_POST['medio'] == 'EMAIL') ? 'selected' : '' ?>>Correo electrónico</option> </select> </div> <div class="mb-3"> <label class="form-label">Observaciones</label> <textarea name="observaciones" class="form-control" rows="3" required><?= isset($_POST['observaciones']) ? htmlspecialchars($_POST['observaciones']) : '' ?></textarea> </div> <!-- Campos ocultos --> <input type="hidden" name="registro" value="<?= isset($_SESSION['username']) ? $_SESSION['username'] : 'Sistema' ?>"> <input type="hidden" name="form_submitted" value="1"> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" onclick="window.history.back()">Cancelar</button> <button type="submit" class="btn btn-primary">Registrar Solicitud</button> </div> </form> </div> </div> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> </body> </html>
Archivo conexion.php (requerido):
<?php
$host = 'localhost';
$db = 'tu_base_de_datos';
$user = 'tu_usuario';
$pass = 'tu_password';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
?>SQL para crear la tabla:
CREATE TABLE solicitudes ( id INT PRIMARY KEY AUTO_INCREMENT, prefolio VARCHAR(50) UNIQUE NOT NULL, promovente VARCHAR(255) NOT NULL, tipo_solicitud VARCHAR(50) NOT NULL, observaciones TEXT NOT NULL, dirigido VARCHAR(100) NOT NULL, medio VARCHAR(50) NOT NULL, registro VARCHAR(100) NOT NULL, fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Este código completo incluye:
✅ Sistema de sesiones
✅ Conexión segura a BD
✅ Validación de datos
✅ Manejo de errores
✅ Persistencia de datos en el formulario
✅ Interfaz responsive con Bootstrap
✅ Protección contra XSS e inyección SQ
Comentarios
Publicar un comentario