CFGS - Desarrollo de Aplicaciones Web

Jesús Temprano Gallego

Curso 2025/2026 - Grupo DAW2

Ejercicio 8 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>Exportar 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
    try {
        // Iniciamos la conexion con la base de datos
        $miDB = new PDO(DSN, DBUser, DBPass);

        // lo inicializo a null para que al hacerlo luego en el if no de error por no estar definido si no pasa el proximo if
        $parametros = null;

        // Array con el nombre de las columnas que vamos a seleccionar
        $aSelecCol = [aColumnas["Codigo"],aColumnas["Descripcion"]];

        // String de las columnas que vamos a seleccionar
        $sColumnas = implode(",", aColumnas);

        // Variable con un query para obtener todos los datos de la tabla
        $consulta = $miDB->prepare("SELECT $sColumnas FROM T02_Departamento ORDER BY ".aColumnas['Descripcion']." DESC");
        
        // Esto intenta pasar los datos a JSON
        if ($entradaOK && $consulta -> execute($parametros)) { // Si el query se ejecuta correctamente
            try {
                // Obtenemos todos los datos como una lista de objetos
                $aObjResultados = $consulta-> fetchAll(PDO::FETCH_OBJ);

                // Los convertimos a un string JSON
                $sJson = json_encode($aObjResultados, JSON_PRETTY_PRINT);

                file_put_contents("../tmp/datos.json",$sJson);
            } catch (PDOException $error) { // Esto se ejecuta si da error al exportar la DB
                $entradaOK = false;
                echo '<h3 class="error">ERROR EXPORTAR SQL:</h3>';
                echo '<p class="error"><strong>Mensaje:</strong> '.$error->getMessage()."</p>";
                echo '<p class="error"><strong>Codigo:</strong> '.$error->getCode()."</p>";
            }
        }
        
        // Esto intenta crear una tabla con los resultados del query
        if ($consulta -> execute($parametros)) { // 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="Exportar datos">
            <span <?=!empty($error)?"class='error'":null?> ><?= $entradaOK ? (empty($error) ? "Datos exportados correctamente" : "Error al exportar datos" ) : null ?></span>
        </form>
    </div>
</body>
</html>