Saltar la navegación

3.5.- Gestión de la información de la sesión (III).

Cuando un usuario proporciona unas credenciales de inicio de sesión correctas (recuerda que tú ya habías añadido el usuario "admin" con contraseña "secreto"), se le redirige de forma automática a la página del listado de productos ("listado.php") para que pueda empezar a hacer la compra. Esa es la página que vas a programar a continuación. Como ya se indicó en el apartado anterior se hace uso para los estilos de Bootstrap y Font Awesome.

Imagen de una página web con unatabla oscura con un listado de productos, a la izquierda en azul el botón añadir, a la izquierda un check o una x. Arriba de la tabla dos botones, ir a cesta y vaciar carro y arriba de la página el nombre del usuario y la cantidad de articulos en el carro.
Captura de pantalla. (Elaboración propia)

La página se divide en varias partes:

  • Al principio comprobamos si existe la variable $_SESSION['nombre'], la que creamos al hacer el login, si no es así volvemos a "login.php"

    , de esta forma garantizamos que nadie, sin validar, pueda acceder a esta página aunque conozca su URL y la ponga en el navegador.

    <?php
    session_start();
    if (!isset($_SESSION['nombre'])) {
        header('Location:login.php');
    }
    require_once 'conexion.php';
    $consulta = "select id, nombre, pvp from productos order by nombre";
    $stmt = $conProyecto->prepare($consulta);
    try {
        $stmt->execute();
    } catch (PDOException $ex) {
        cerrarTodo($conProyecto, $stmt);
        die("Error al recuperar los productos " . $ex->getMessage());
    }
    ?>
    después hacemos el require_once a "conexion.php", hacemos una consulta para recuperar el id, nombre y pvp de todos los productos, que mostraremos en la tabla con el listado de productos.

  • encabezado. Contiene la cantidad de elementos del carro (para ello, simplemente contamos los elementos del array $_SESSION['cesta']), el nombre del usuario (este lo mandamos en la variable $_SESSION['nombre']) y un botón para cerrar sesión, este botón nos redirige a la página "cerrar.php".
    <div class="float float-right d-inline-flex mt-2">
        <i class="fa fa-shopping-cart mr-2 fa-2x"></i>
        <?php
        if (isset($_SESSION['cesta'])) {
            $cantidad = count($_SESSION['cesta']);
            echo "<input type='text' disabled class='form-control mr-2 bg-transparent text-white' value='$cantidad' size='2px'>";
        } else {
            echo "<input type='text' disabled class='form-control mr-2 bg-transparent text-white' value='0' size='2px'>";
        }
    
        ?>
        <i class="fas fa-user mr-3 fa-2x"></i>
        <input type="text" size='10px' value="<?php echo $_SESSION['nombre']; ?>" class="form-control
        mr-2 bg-transparent text-white" disabled>
        <a href="cerrar.php" class="btn btn-warning mr-2">Salir</a>
    </div>
  • Botones "Ir a cesta" y "Vaciar Carro". "Ir a cesta" es un enlace a la página "cesta.php" y "Vaciar Carro" es un submit a "listado.php". La página en la que estamos.
    <form class="form-inline" name="vaciar" method="POST" action='<?php echo $_SERVER['PHP_SELF']; ?>'>
            <a href="cesta.php" class="btn btn-success mr-2">Ir a Cesta</a>
            <input type='submit' value='Vaciar Carro' class="btn btn-danger" name="vaciar">
        </form>
    Al cargar la página comprobaremos si hemos enviado el formulario anterior de nombre "vaciar", si es así hacemos unset() de la variable $_SESSION['cesta']
    if (isset($_POST['vaciar'])) {
        unset($_SESSION['cesta']);
    }
  • productos. Contiene el listado de todos los productos ordenados por nombre tal y como figuran en la base de datos. Cada producto figura en una fila (nombre y precio). Se crea un formulario, por cada producto, con un botón "Añadir" que envía a esta misma página el id del producto añadido. Cuando se abre la página, se comprueba si se ha enviado este formulario, y si fuera así se añade un elemento al array asociativo $_SESSION['cesta'] con  el id del producto. A la derecha aparece un check (icono fa-check) o una X (icono fa-times-circle) en función de que el producto haya sido añadido o no. Para mostrar los productos hacemos uso de la consulta de arriba.
    while ($filas = $stmt->fetch(PDO::FETCH_OBJ)) {
                echo "<tr><th scope='row' class='text-center'>";
                echo "<form action='{$_SERVER['PHP_SELF']}' method='POST'>";
                echo "<input type='hidden' name='id' value='{$filas->id}'>";
                echo "<input type='submit' class='btn btn-primary' name='comprar' value='Añadir'>";
                echo "</form>";
                echo "</th>";
                echo "<td>{$filas->nombre}, Precio: {$filas->pvp} (€)</td>";
                echo "<td class='text-center'>";
                if (isset($_SESSION['cesta'][$filas->id])) {
                    echo "<i class='fas fa-check fa-2x'></i>";
                } else {
                    echo "<i class='far fa-times-circle fa-2x'></i>";
                }
                echo "<td>";
                echo "</tr>";
    
            }
            cerrarTodo($conProyecto, $stmt);

Descargar "listado.php": listado (pdf - 42,62 KB)

Autoevaluación

Pregunta 1

Para proteger el acceso a "listado.php" es suficiente que el indice de nuestro sitio sea la página de login y que desde allí, redireccionar a "listado.php" sólo si el login ha sido válido.

Sugerencia

Piensa que pasaría si en la dirección del navegador ponemos la url de "listado.php".