UT4: TÉCNICAS DE ACCESO A DATOS EN PHP

Alberto Méndez Núñez | 03/10/2025

Curso 2025/2026 - Grupo DAW2

Muestra del código PHP ejercicio 3

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>CFGS - Desarrollo de Aplicaciones Web</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background: #f4f6f9;
            margin: 0;
            padding: 0;
        }
        header {
            background: #F59C27;
            color: white;
            padding: 15px;
            text-align: center;
        }
        h1 {
            margin: 0;
        }
        main {
            max-width: 1200px;
            margin: 30px auto;
            padding: 20px;
            background: white;
            border-radius: 10px;
            box-shadow: 0 4px 10px rgba(0,0,0,0.1);
        }
        ul {
            list-style: none;
            padding: 0;
        }
        footer{
            margin: auto;
            background-color: #F59C27;
            text-align: center;
            height: 150px;
        color: white;
            position: fixed;
            bottom: 0;
            left: 0;
            width: 100%;
        }
        a{
            text-decoration: none;
            color:purple;
        }
        
        table{
            border: 0;
        }
        
        td{
            padding: 10px;
            border-width: 4px;
        }
        
        #encabezado{
            background-color: lightsteelblue;
            font-weight: bold;
        }
        
        .codigos{
            background-color: lightblue;
        }
        
        .mostrar{
            background-color: lightsalmon;
        }
        
        tr{
            height: 80px;
        }
        
        input{
            border-radius: 5px;
        }
        
        #boton{
            border-radius: 5px;
            width: 150px;
            background-color: lightgreen;
        }
        
        label{
            font-weight: bold;
        }
        
        h3{
            text-decoration: underline;
        }
        
        #formulario table{
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
        }
        

    </style>
</head>
<body>
    <header>
        <h1><b>UT4: TÉCNICAS DE ACCESO A DATOS EN PHP</b></h1>
        <h4><a href="../../AMNDWESProyectoDWES/indexProyectoDWES.php">Alberto Méndez Núñez | 03/10/2025</a></h4>
        <p>Curso 2025/2026 - Grupo DAW2</p>
    </header>
    <main>
        <h2><b>Ejercicio 3</b></h2>
        
        <?php
/*
 * Autor: Alberto Méndez Núñez
 * Fecha de ultima modificación: 30/10/2025
 * Formulario para añadir un departamento a la tabla Departamento con validación de entrada y control de errores.
 */

// Incluimos la librería de validación personalizada
require_once 'libreriaValidacionFormulario.php';

// Incluimos el archivo con las constantes de conexión (RUTA, USUARIO, PASS)
require_once '../config/confDBPDO.php';

/* ================= CONEXIÓN A LA BASE DE DATOS =================== */

try {
    $miDB = new PDO(RUTA, USUARIO, PASS);
    $miDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $ex) {
    die("Error de conexión: " . $ex->getMessage());
}

/* =============== ARRAYS PARA ERRORES Y RESPUESTAS ================ */

// Array donde se almacenarán los mensajes de error para cada campo
$aErrores = [
    "T02_CodDepartamento" => "",
    "T02_DescDepartamento" => "",
    "T02_VolumenNegocio" => ""
];

// Array donde se almacenarán los valores válidos introducidos por el usuario
$aRespuestas = [
    "T02_CodDepartamento" => "",
    "T02_DescDepartamento" => "",
    "T02_VolumenNegocio" => ""
];

// Variable para comprobar si el formulario es correcto
$entradaOK = true;

/* =============== PROCESAMIENTO DEL FORMULARIO (SI SE PULSA SUBMIT) ================ */
if (isset($_REQUEST['submit'])) {

    // Recogemos los valores enviados por el usuario (si no existen → "")
    $T02_CodDepartamento   = $_REQUEST['T02_CodDepartamento']   ?? "";
    $T02_DescDepartamento  = $_REQUEST['T02_DescDepartamento']  ?? "";
    $T02_VolumenNegocio    = $_REQUEST['T02_VolumenNegocio']    ?? "";

    /* ==================== VALIDACIONES ==================== */

    // Validación código del departamento (alfabético, máximo 3 caracteres, obligatorio)
    $aErrores['T02_CodDepartamento'] =
        validacionFormularios::comprobarAlfabetico($T02_CodDepartamento, 3, 0, 1);

    // Si el códgio no esta en mayusculas se muestra un error.    
        if($T02_CodDepartamento!== strtoupper($T02_CodDepartamento)){
            $aErrores['T02_CodDepartamento']='El codigo de departamento debe estar en mayusculas';
        }

    // Validación descripción del departamento (alfabético, obligatorio)
    $aErrores['T02_DescDepartamento'] =
        validacionFormularios::comprobarAlfabetico($T02_DescDepartamento, 255, 0, 1);

    // Convertimos coma en punto para validar decimales correctamente
    $volumen = str_replace(",", ".", $T02_VolumenNegocio);

    // Validación de número decimal
    $aErrores['T02_VolumenNegocio'] =
        validacionFormularios::comprobarFloat($volumen);

    /* ==================== COMPROBACIÓN GENERAL DE ERRORES ==================== */
    foreach ($aErrores as $error) {
        if (!empty($error)) {
            $entradaOK = false;
        }
    }

    /* ================== COMPROBAR SI EL CÓDIGO DEPARTAMENTO EXISTE EN LA BD ===================== */
    if ($entradaOK && empty($aErrores['T02_CodDepartamento'])) {

        try {
            // Consulta preparada para evitar inyecciones SQL
            $sql = "SELECT * FROM T02_Departamento WHERE T02_CodDepartamento = ?";
            $consulta = $miDB->prepare($sql);
            $consulta->bindParam(1, $T02_CodDepartamento);
            $consulta->execute();

            // Si existe un registro da error
            if ($consulta->fetch(PDO::FETCH_ASSOC)) {
                $aErrores['T02_CodDepartamento'] =
                    "El departamento que intenta introducir ya existe en la base de datos.";
                $entradaOK = false;
            }

        } catch (PDOException $ex) {
            echo "Error al comprobar duplicados: " . $ex->getMessage();
            $entradaOK = false;
        }
    }
}

/* ============== SI LOS DATOS SON CORRECTOS INSERTAR EN LA BD ================== */
if ($entradaOK && isset($_REQUEST['submit'])) {

    $aRespuestas['T02_CodDepartamento']  = $T02_CodDepartamento;
    $aRespuestas['T02_DescDepartamento'] = $T02_DescDepartamento;
    $aRespuestas['T02_VolumenNegocio']   = ($volumen === "") ? 0 : $volumen;

    try {
        // Consulta preparada para insertar un nuevo registro
        $sql = <<<EOT
            INSERT INTO T02_Departamento (
                T02_CodDepartamento,
                T02_DescDepartamento,
                T02_FechaCreacionDepartamento,
                T02_VolumenNegocio,
                T02_FechaBajaDepartamento
            ) VALUES (
                :cod,
                :desc,
                NOW(),
                :volumen,
                NULL
            )
        EOT;

        $stmt = $miDB->prepare($sql);

        $stmt->execute([
            ":cod"     => $aRespuestas['T02_CodDepartamento'],
            ":desc"    => $aRespuestas['T02_DescDepartamento'],
            ":volumen" => $aRespuestas['T02_VolumenNegocio']
        ]);

        echo "<h3 style='color:green;'>Departamento insertado correctamente.</h3>";

    } catch (PDOException $ex) {
        echo "Error al insertar: " . $ex->getMessage();
    }

} else {

    // MOSTRAR FORMULARIO
    ?>
    <h1 style="text-align:center;">Inserción de nuevo departamento</h1>

    <form action="<?= $_SERVER['PHP_SELF'] ?>" method="post">
        <table>

            <!-- Código -->
            <tr>
                <td><label for="T02_CodDepartamento">Código del Departamento:</label></td>
                <td>
                    <input type="text" name="T02_CodDepartamento" id="T02_CodDepartamento"
                           style="background-color: lightgoldenrodyellow"
                           value="<?= empty($aErrores['T02_CodDepartamento']) ?
                               ($_REQUEST['T02_CodDepartamento'] ?? '') : '' ?>">
                </td>
                <td><span style="color:red;"><?= $aErrores["T02_CodDepartamento"] ?></span></td>
            </tr>

            <!-- Descripción -->
            <tr>
                <td><label for="T02_DescDepartamento">Descripción:</label></td>
                <td>
                    <input type="text" name="T02_DescDepartamento" id="T02_DescDepartamento"
                           style="background-color: lightgoldenrodyellow"
                           value="<?= empty($aErrores['T02_DescDepartamento']) ?
                               ($_REQUEST['T02_DescDepartamento'] ?? '') : '' ?>">
                </td>
                <td><span style="color:red;"><?= $aErrores["T02_DescDepartamento"] ?></span></td>
            </tr>

            <!-- Volumen -->
            <tr>
                <td><label for="T02_VolumenNegocio">Volumen de Negocio:</label></td>
                <td>
                    <input type="number" step="0.01" name="T02_VolumenNegocio" id="T02_VolumenNegocio"
                           style="background-color: lightgoldenrodyellow"
                           value="<?= empty($aErrores['T02_VolumenNegocio']) ?
                               ($_REQUEST['T02_VolumenNegocio'] ?? '') : '' ?>">
                </td>
                <td><span style="color:red;"><?= $aErrores["T02_VolumenNegocio"] ?></span></td>
            </tr>

            <tr>
                <td colspan="3" style="text-align:center;">
                    <input type="submit" name="submit" value="Insertar">
                </td>
            </tr>

        </table>
    </form>
<?php
}

/* ============== MOSTRAR TABLA COMPLETA DE DEPARTAMENTOS ============= */

try {

    $consulta = $miDB->query("SELECT * FROM T02_Departamento");

    if ($consulta->rowCount() > 0) {

        echo "<table border='2' style='border-collapse: collapse; margin-top:20px;'>";

        echo "<tr style='background-color: lightsteelblue; font-weight: bold;'>";
        for ($i = 0; $i < $consulta->columnCount(); $i++) {
            $col = $consulta->getColumnMeta($i)['name'];
            echo "<th>$col</th>";
        }
        echo "</tr>";

        while ($reg = $consulta->fetch(PDO::FETCH_OBJ)) {
            echo "<tr>";
            foreach ($reg as $valor) {
                echo "<td style='padding:5px;'>$valor</td>";
            }
            echo "</tr>";
        }

        echo "</table>";

        echo "<h3 style='text-align:center;'>Hay {$consulta->rowCount()} registros.</h3>";

    } else {
        echo "<p>No hay departamentos en la base de datos.</p>";
    }

} catch (PDOException $ex) {
    echo "Error al mostrar departamentos: " . $ex->getMessage();
} finally {
    unset($miDB);
}

?>
    </main>
</body>
</html>