Esercizio sessioni e vettori in PHP

L’argomento delle sessioni è ampiamente trattato nei manuali scolastici. Sappiamo essere una tecnologia fondamentale per dare “memoria” ad n sito web complesso. Vediamo un esempio molto didattico diverso dal solito carrello e-commerce.

Vogliamo creare una piccola form dove è possibile inserire gli eventi della programmazione di una fantomatica associazione. Abbiamo un nome dell’evento, un enum/select per scegliere una tipologia di evento, il numero intero di partecipanti. Ogni volta che si inserisce un elemento, è possibile guardare il riepilogo di tutte quelli inseriti in una apposita pagina riassuntiva oltre ad avere un feedback sintetico nella pagina della form stessa. Aggiungiamo un pizzico di complessità conteggiando il numero complessivo di partecipanti di tutti gli eventi. Tralasciamo una grafica/GUI particolare.

esempio di form in index.php
riepilogo.php

Pagina di immissione

Ogni volta che abbiamo bisogno delle sessioni nelle nostre pagine (praticamente sempre?) è fondamentale ricordare un dettaglio: la sessione va richiamata/avviata come prima attività o riga di codice. Diversamente, il server potrebbe segnalare errore o avere comportamenti indesiderati. Quindi anche se non strettamente necessario, inseriamo come prima riga

<?php session_start(); ?>

Segue un normalissimo codice, senza troppi fronzoli, per realizzare e stampare a video la form di immissione. Non preleva dati da un db e non deve interagire con il backend in modo particolare. Qui possiamo personalizzare a piacimento, anche con qualche dettaglio CSS. Come sempre però, ad ogni tag o input che sia, aggiungiamo un name e un id, anche tra loro uguali.

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Eventi & Sessioni</title>
    <meta charset="utf-8">
    <style>
        label{width: 7em; float:left;}
    </style>
</head>
<body>
    <h1>Eventi & Sessioni</h1>
    <form method="post" action="index.php">
        <label for="evento">Nome evento: </label>
        <input type="text" id="evento" name="evento" required><br>
        <label for="tipologia">Tipologia: </label>
        <select id="tipologia" name="tipologia">
            <option value="culturale">Culturale</option>
            <option value="musicale">Musicale</option>
            <option value="religioso">Religioso</option>
            <option value="sportivo">Sportivo</option>
        </select><br>
        <label for="numero">Partecipanti: </label>
        <input type="number" id="numero" name="numero">
        <br><br>
        <input type="submit" value="Registra">
    </form>
    <br>

Il dettaglio da tenere presente però è contenuto nella dichiarazione della form. La action infatti punta a questa stessa pagina index.php. Apparentemente potrebbe essere un’assegnazione anomala, ma non c’è nulla di male a chiare la pagina stessa e visualizzare magari l’esito di quanto inviato, come in questo caso. Se si entra sulla pagina per la prima volta del resto, le supervariabili $_POST non sono valorizzate.

Se invece sto rientrando dalla form lanciata in POST, avrò le variabili settate $_POST e posso quindi sia visualizzarle, sia riporle da parte in un vettore associativo da inserire del $_SESSION. Ogni inserimento, crea quindi un vettore inserito e scompattabile poi dalla sessione.

<?php

        if (isset($_POST["evento"]))
        {
            //prelevo dalla form i campi
            $evento = $_POST["evento"];
            $tipologia = $_POST["tipologia"];
            $numero = $_POST["numero"];

            $nuovo = array("evento"=>$evento,"tipologia"=>$tipologia,"numero"=>$numero);

            //immagazzino le informazioni nell'array
            if (!isset($_SESSION["vettore_eventi"]))
            {
                $_SESSION["vettore_eventi"]= array();
                echo "Sessione creata...<br>";
            }
            
            array_push($_SESSION["vettore_eventi"],$nuovo);
            echo "Registrato evento " . $evento . "<br>"; 
            //in alternativa c'è la funzione [] che si comporta in modo analogo
            //$_SESSION["vettore_numero"][]=$numero;
            
           // session_write_close(); non è più necessario
        }  
    ?>

Alla fine delle operazioni è consigliato, non strettamente obbligatorio scrivere/sovrascrivere la sessione con session_write_close(), comando forse meno utilizzato dagli studenti assieme alla funzione unset() per distruggere una variabile di sessione del tipo:

unset($_SESSION[‘pippo‘]);

Pagina riepilogo

La pagina di riepilogo, come tutte le pagine che sfruttano le sessioni, deve iniziare con la solita chiamata session_start().

La parte critica è la visualizzazione dei dati accumulati nella variabile $_SESSION. In realtà con un ciclo while o foreach è abbastanza semplice scorrere e stampare i dati. L’unica accortezza è che nella sessione è inserito un vettore di cui abbiamo inserito come chiave un indice numerico standard automatico e quindi come elemento il vettore stesso.

   foreach ($_SESSION["vettore_eventi"] as $chiave => $elemento)
            {   
                $evento = $elemento["evento"];
                $tipologia = $elemento["tipologia"];
                $numero = $elemento["numero"];
                echo "------------------------------------<br>";
                echo "Evento: " . $evento . "<br>";                   
                echo "Tipologia: " . $tipologia . "<br>";
                echo "Partecipanti: " . $numero . "<br>";

Completa l’esercizio il conteggio delle tipologie di eventi con delle variabili impostate a zero e aggiornate con un semplice controllo con switch. Le informazioni vengono stampate banalmente con delle echo.

Listati completi

<?php session_start(); ?>
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Eventi & Sessioni</title>
    <meta charset="utf-8">
    <style>
        label{width: 7em; float:left;}
    </style>
</head>
<body>
    <h1>Eventi & Sessioni</h1>
    <form method="post" action="index.php">
        <label for="evento">Nome evento: </label>
        <input type="text" id="evento" name="evento" required><br>
        <label for="tipologia">Tipologia: </label>
        <select id="tipologia" name="tipologia">
            <option value="culturale">Culturale</option>
            <option value="musicale">Musicale</option>
            <option value="religioso">Religioso</option>
            <option value="sportivo">Sportivo</option>
        </select><br>
        <label for="numero">Partecipanti: </label>
        <input type="number" id="numero" name="numero">
        <br><br>
        <input type="submit" value="Registra">
    </form>
    <br>


    <?php
        if (isset($_POST["evento"]))
        {
            //prelevo dalla form i campi
            $evento = $_POST["evento"];
            $tipologia = $_POST["tipologia"];
            $numero = $_POST["numero"];

            $nuovo = array("evento"=>$evento,"tipologia"=>$tipologia,"numero"=>$numero);

            //immagazzino le informazioni nell'array
            if (!isset($_SESSION["vettore_eventi"]))
            {
                $_SESSION["vettore_eventi"]= array();
                echo "Sessione creata...<br>";
            }
            
            array_push($_SESSION["vettore_eventi"],$nuovo);
            echo "Registrato evento " . $evento . "<br>"; 
            //in alternativa c'è la funzione [] che si comporta in modo analogo
            //$_SESSION["vettore_numero"][]=$numero;
            
            //session_write_close();
        }  
    ?>
    <br><br>
    <a href="riepilogo.php">Pagina di riepilogo</a>
</body>
</html>


<?php session_start(); ?>
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Eventi & Sessioni</title>
    <meta charset="utf-8">
</head>
<body>
    <h1>Eventi & Sessioni: Riepilogo</h1>

    <?php 
        if (isset($_SESSION["vettore_eventi"]))
        {
            echo "<b>Ecco la lista di eventi:</b> <br>";
            $totale = 0;
            $tot_religioso = 0;
            $tot_culturale = 0;
            $tot_sportivo = 0;
            $tot_sportivo = 0;
            foreach ($_SESSION["vettore_eventi"] as $chiave => $elemento)
            {   
                $evento = $elemento["evento"];
                $tipologia = $elemento["tipologia"];
                $numero = $elemento["numero"];
                echo "------------------------------------<br>";
                echo "Evento: " . $evento . "<br>";                   
                echo "Tipologia: " . $tipologia . "<br>";
                echo "Partecipanti: " . $numero . "<br>";
                
                $totale += $numero;   

                switch ($tipologia) {
                    case "culturale":
                            $tot_culturale += 1;        
                        break;
                    
                        case "musicale":
                            $tot_musicale += 1;
                        break;
                    
                        case "religioso":
                            $tot_religioso += 1;
                        break;

                    case "sportivo":
                        $tot_sportivo += 1;
                        break;                        
                }
            }

            echo "------------------------------------<br><br>";
            echo "Totale spettatori: $totale <br>";
            echo "Totale religiosi: $tot_religioso <br>";
            echo "Totale culturali: $tot_culturali <br>";
            echo "Totale musicali: $tot_musicali <br>";
            echo "Totale sportivi: $tot_sportivi <br>";            

        }
    ?>
    <br>
    <a href="index.php">Torna alla form</a>
</body>
</html>

Ultima modifica 8 Aprile 2026