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

html
<form method="POST">

Campos del formulario:

  1. Promovente: Campo de texto para ingresar nombre

  2. Dirigido a: Select dinámico que se llena desde PHP

    php
    <?php foreach ($opcionesDirigido as $opcion): ?>
  3. Tipo de Solicitud: Select con opciones predefinidas

  4. Medio de recepción: Cómo se recibió la solicitud

  5. 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

php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['form_submitted'])) {

Flujo de procesamiento:

  1. Recoge datos del POST: Crea array con la información

  2. Genera prefólio único:

    php
    'PRE-' . date('Ymd') . '-' . str_pad(rand(1, 999), 3, '0', STR_PAD_LEFT)

    Ejemplo: PRE-20231215-042

  3. Llama a función crearSolicitud(): Inserta en base de datos

  4. Redirección POST/REDIRECT/GET: Evita reenvío al refrescar

Parte 3: Función de Base de Datos

php
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:

  1. Usuario → Llena formulario → Hace submit

  2. Servidor → Procesa datos → Genera prefólio → Inserta en BD

  3. Servidor → Redirecciona con parámetros GET

  4. 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
<?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
<?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:

sql
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

Entradas populares de este blog

solicitudes