CFGS - Desarrollo de Aplicaciones Web

Jesús Temprano Gallego

Curso 2025/2026 - Grupo DAW2

Ejercicio 7 PDO:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Jesús Temprano - Ej 4, Tema4</title>
    <link rel="stylesheet" href="../webroot/css/stylesForm.css">
    <style>
        form {
            padding: 0;
            max-width: inherit;
            box-shadow: none;
        }
        input[type=submit] {margin: 0;}
    </style>
</head>
<body>

<?php

    /*  @author Jesús Temprano Gallego
     *  @since 17/11/2025
     */

    echo "<h1>Importar departamentos.</h1>";
    
    include_once("../core/231018libreriaValidacion.php");

    /*  Importamos la configuracion de la DB. Contiene constantes para la connexion con la DB.
        Existen tanto `define()` como `const` se pueden usar igual en la mayoria de casos.
        En esta pagina web explican las diferencias y en que casos se usa uno u otro:
           https://mclibre.org/consultar/php/lecciones/php-constantes.html
    */
    require_once("../config/confDBPDO.php");


    // Variables generales para gestionar los datos del formulario
    $entradaOK = true; // Se pone a false si el cliente no se envia datos (hace click a exportar)

    if (!isset($_REQUEST["enviar"])) { // Si hemos cargado la pagina por primera vez y no le hemos dado a exportar
        $entradaOK = false;
    }

    /*  Salimos del codigo php para escribir el formulario html.
        Podemos meter datos php poniendo en el html: <?= codigoPHP ?>
    */
    ?>
    <div class="resultado">
        <form method="post">
            <?php
            
            // Obtenemos los datos del archivo json
            $datos = file_get_contents("../tmp/datos.json");
            
            try {
                // Iniciamos la conexion con la base de datos
                $miDB = new PDO(DSN, DBUser, DBPass);

                if ($datos) { // Comprobamos si hay datos
                    $aJson = json_decode($datos,true); // Comvertimos los datos del json en un array asociativo
            
                    // String de las columnas que vamos a seleccionar
                    $sColumnas = implode(",", aColumnas);

                    // Esto intenta pasar los datos a JSON
                    if ($entradaOK) { // Si el query se ejecuta correctamente
                        // Variable en formato heredoc con la sentencia SQL con los parametros necesarios
                        $statement = <<<EOT
                        INSERT INTO T02_Departamento VALUES(
                            :codigo,
                            :descripcion,
                            :fechaCreacion,
                            :volumen,
                            :fechaBaja
                        );
                        EOT;
                        // Preparamos la consulta
                        $consulta = $miDB->prepare($statement);

                        foreach ($aJson as $departamento) {
                            $aParametros = [
                                ':codigo' => $departamento[aColumnas["Codigo"]] ?? null,
                                ':descripcion' => $departamento[aColumnas["Descripcion"]] ?? null,
                                ':fechaCreacion'=> $departamento[aColumnas["FechaCreacion"]] ?? null,
                                ':volumen' => $departamento[aColumnas["Volumen"]] ?? null,
                                ':fechaBaja' => $departamento[aColumnas["FechaBaja"]] ?? null
                            ];
                            try {
                                $consulta->execute($aParametros);
                            } catch (PDOException $error) { // Esto se ejecuta si da error al importar la DB
                                echo "<p class='error'>El departamento {$aParametros[":codigo"]} tiene datos duplicados o incorrectos</p>";
                                $error ="Datos duplicados o incorrectos";
                            }
                        }
                    }
                }

                // lo inicializo a null para que el if no de error por no estar definido
                $aParametros = null;

                // String de las columnas que vamos a seleccionar
                $consulta = $miDB->prepare("SELECT $sColumnas FROM T02_Departamento ORDER BY ".aColumnas['Descripcion']." DESC");
                
                // Esto intenta crear una tabla con los resultados del query
                if ($consulta -> execute($aParametros)) { // Si el query se ejecuta correctamente
        
                    echo "<table>";
                    echo "<thead><tr>";
        
                    // Contamos cuantas columnas tiene la tabla sacada por el query y la recorremos
                    foreach (aColumnas as $col) {
                        // Ponemos el nombre de la columna en la tabla html
                        echo "<th>{$col}</th>";
                    }
                    echo "</tr></thead>";
        
                    // Obtiene los registros que ha obtenido el query
                    while ($registro = $consulta -> fetchObject()) { // Mientras haya mas registros
                        echo "<tr>";
                        // Mete cada registro en la tabla
                        foreach (aColumnas as $col) {
                            $valor = $registro->$col;
        
                            echo "<td>$valor</td>";
                        }
                        echo "</tr>";
                    }
                    echo "</table>";
        
                    // Mostramos cuantos registros tenia la tabla
                    echo "<p>Habia {$consulta->rowCount()} registros.</p>";
                }
                else { // Ssi da error al hacer el query
                    echo "No se pudo ejecutar la consulta";
                }
            } catch (PDOException $error) { // Esto se ejecuta si da error al iniciar la conexion, insertar los datos, o hacer el query
                echo '<h3 class="error">ERROR SQL:</h3>';
                echo '<p class="error"><strong>Mensaje:</strong> '.$error->getMessage()."</p>";
                echo '<p class="error"><strong>Codigo:</strong> '.$error->getCode()."</p>";
            }
            ?>
            <!-- Boton para exportar los datos -->
            <input type="submit" name="enviar" value="Importar datos">
            <span <?=!empty($error)?"class='error'":null?> >
                <?=
                    $entradaOK // si la entrada esta bien
                    ? ($datos // si hay datos
                        ? (empty($error) // si NO hay errores
                            ? "Datos Importados correctamente."
                            : "Algunos datos no se han importado. Datos duplicados o incorrectos."
                        )
                        : "Error al obtener el archivo."
                    )
                    : null
                ?>
            </span>
        </form>
    </div>
</body>
</html>