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 4

<!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 4</b></h2>
        
        <?php
        
                /*
         * Autor: Alberto Méndez Núñez
         * Fecha de ultima modificación: 13/11/2025
         * Formulario de búsqueda de departamentos por descripción (por una parte del campo DescDepartamento,
         * si el usuario no pone nada deben aparecer todos los departamentos).
         */
        require_once 'libreriaValidacionFormulario.php'; // Librería para validar los campos del formulario
        require_once '../config/confDBPDO.php'; // Archivo con datos de conexión a la base de datos (RUTA, USUARIO, PASS)

        /* ==================== Conexión a la base de datos ==================== */
        try {
            // Creamos la conexión PDO a la base de datos
            $miDB = new PDO(RUTA, USUARIO, PASS);
            // Configuramos PDO para que lance excepciones en caso de error
            $miDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $ex) {
            // Si hay un error de conexión, lo mostramos y detenemos la ejecución
            echo "Error de conexión a la base de datos: " . $ex->getMessage() . "<br>";
            echo "Código de error: " . $ex->getCode();
            exit;
        }

        /* ==================== Inicialización de arrays ==================== */
        // Array que contendrá los mensajes de error de validación
        $aErrores = [
            "T02_DescDepartamento" => ""
        ];

        // Array que contendrá los datos válidos del formulario
        $aRespuesta = [
            "T02_DescDepartamento" => ""
        ];

        // Variable que indica si la entrada del formulario es correcta
        $entradaOK = true;

        /* ==================== Procesamiento del formulario ==================== */
        if (isset($_REQUEST['buscar'])) { // Si se pulsó el botón de búsqueda
            // Recogemos la descripción introducida por el usuario
            $T02_DescDepartamento = $_REQUEST['T02_DescDepartamento'] ?? '';

            // Validamos que la descripción sea alfabética (máximo 255 caracteres, obligatorio)
            $aErrores['T02_DescDepartamento'] = validacionFormularios::comprobarAlfabetico($T02_DescDepartamento, 255, 0, 1);

            // Comprobamos si hay errores
            foreach ($aErrores as $valor) {
                if (!empty($valor)) {
                    $entradaOK = false; // Si hay algún error, no procesamos la búsqueda
                }
            }

            // Si no hay errores, guardamos el valor introducido
            if ($entradaOK) {
                $aRespuesta["T02_DescDepartamento"] = ($_REQUEST["T02_DescDepartamento"]);
            }
        }

        /* ==================== Mostrar el formulario ==================== */
        if (!isset($_REQUEST['submit']) || !$entradaOK) {
            ?>
            <div id="formulario">
                <h1 style="text-align:center;">Buscar departamento por descripción</h1>
                <form action="<?= $_SERVER["PHP_SELF"]; ?>" method="post">
                    <table>
                        <tr>
                            <td><label for="T02_DescDepartamento">Descripción:</label></td>
                            <td><input type="text" name="T02_DescDepartamento" id="T02_DescDepartamento"
                                       value="<?= (empty($aErrores['T02_DescDepartamento'])) ? ($_REQUEST['T02_DescDepartamento'] ?? '') : ''; ?>"/></td>
                            <!-- Botón de búsqueda -->
                            <td><input type="submit" value="Buscar" name="buscar"></td>
                        </tr>
                    </table>
                </form>
            </div>
            <?php
        }

        /* ==================== Consulta a la base de datos ==================== */
        try {
            if (empty($aRespuesta["T02_DescDepartamento"])) {
                // Si el usuario no introdujo nada, seleccionamos todos los departamentos
                $query = "SELECT * FROM T02_Departamento";
            } else {
                // Si se introdujo algo, buscamos coincidencias parciales con LIKE
                $RespuestasSql = "%" . $aRespuesta["T02_DescDepartamento"] . "%";
                $query = "SELECT * FROM T02_Departamento WHERE T02_DescDepartamento LIKE '$RespuestasSql'";
            }

            // Ejecutamos la consulta
            $resultadoConsulta = $miDB->query($query);

            // Creamos la tabla HTML para mostrar los resultados
            echo '<table border=1px>';
            echo '<tr style=background-color:lightblue;>';
            echo '<th>Código</th>';
            echo '<th>Descripción</th>';
            echo '<th>Fecha Creación</th>';
            echo '<th>Volumen Negocio</th>';
            echo '<th>Fecha Baja</th>';
            echo '</tr>';

            // Recorremos cada registro devuelto por la consulta
            while ($aRegistroArray = $resultadoConsulta->fetch(PDO::FETCH_ASSOC)) {
                echo "<tr>";
                echo "<td>" . $aRegistroArray["T02_CodDepartamento"] . "</td>";
                echo "<td>" . $aRegistroArray["T02_DescDepartamento"] . "</td>";

                // Convertimos la fecha de creación a formato d-m-Y
                $fechaCreacion = new DateTime($aRegistroArray["T02_FechaCreacionDepartamento"]);
                echo "<td>" . $fechaCreacion->format("d-m-Y") . "</td>";

                // Formateamos el volumen de negocio con dos decimales y símbolo €
                echo "<td>" . number_format($aRegistroArray["T02_VolumenNegocio"], 2, ',', '.') . '€</td>';

                // Comprobamos si la fecha de baja es nula
                if (!is_null($aRegistroArray["T02_FechaBajaDepartamento"])) {
                    $fechaBaja = new DateTime($aRegistroArray["T02_FechaBajaDepartamento"]);
                    echo "<td>" . $fechaBaja->format("d-m-Y") . "</td>";
                } else {
                    echo "<td></td>";
                }

                echo "</tr>";
            }

            // Mostramos el total de registros en la tabla
            $numReg = $miDB->query("SELECT count(*) FROM T02_Departamento");
            $totalReg = $numReg->fetchColumn();
            echo "Total de registros: " . $totalReg;

        } catch (PDOException $ex) {
            // Si ocurre un error en la base de datos lo mostramos
            echo '<p>Error en la base de datos:</p>';
            echo $ex->getMessage() . '<br>Código: ';
            echo $ex->getCode();
        } finally {
            // Cerramos la conexión a la base de datos
            unset($miDB);
        }
        ?>
    </main>
</body>
</html>