[PHP] variabile di sessione si azzera ricaricando la pagina?

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
Buongiorno a tutti,
quadro generale: ho scritto il sw di gestione di backoffice per una scuola di cucina.
Il calendario è pubblicato su web con una pagina dinamica che pesca i dati dalle tabelle "calendario" e "utentiscuola".
La tabella "calendario" contiene i dati delle lezioni (id lezione, posti disponibili, titolo, eccetera), la tabella "utentiscuola" i dati delle iscrizioni (id lezione, posti prenotati, anagrafica varia, eccetera).
Ogni volta che si inserisce un a nuova prenotazione i posti disponibili di "calendario" vengono scalati.
Ora sto cambiando la pagina di variazione/annullamento delle iscrizioni, che non avevo mai sviluppato in pieno.
La prima parte del codice prevede l'inserimento del codice lezione su cui si vuole intervenire.
Inserendo questo codice si ottiene l'elenco dei partecipanti.
Ecco il codice:
PHP:
<div id="divsinistra" class="testoPiccolo">
<p><? echo "$cod"; ?>, <br>
consulta l'elenco delle lezioni pubblicate e indica il codice della lezione per la quale vuoi modificare l'elenco dei partecipanti:</p>
<br>
<hr>
<br>



<form name="modulo" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">

Codice lezione: <input name="idlezione" type="text" size="5" onBlur="isnum(this)" /> <br><br>

Oppure inserisci la mail di un cliente per visualizzare l'elenco delle lezioni a cui è iscritto:<br><br>

Email cliente: <input name="mailcliente" type="text" size="50" />


            <br><br><br>

<p align="right"><input type="submit" name="vedi" value=" OTTIENI L'ELENCO DESIDERATO "></p>

</form>
<br /><br />

</div>


<div id="divdestra">
    <iframe src="../corsi_elenco.php" width="100%" height="600px" frameborder="0"   ></iframe>

</div>


<div class="keepclear"></div>
Il div "divdestra" richiama per comodità l'elenco dei corsi con i codici lezione.
Premendo il pulsante del form richiamo la funzione "mostra":
PHP:
if (isset($_POST['vedi'])){
        mostra();
    }

    
    


        function mostra(){

            // recupero il codice della lezione e la registro come variabile di sessione x riutilizzarla dopo
            
            $lez = $_POST['idlezione'];
            $_SESSION['primalezione'];

            if ($lez == "") {
                $lez = $_SESSION['primalezione'];
            }

echo "codice lezione ".$lez;
            // oppure recupero la mail da ricercare e la registro come variabile di sessione per riutilizzarla dopo

            $posta = $_POST['mailcliente'];
            $_SESSION['maildelcliente'];

            // Se si è immasso il codice della lezione estraggo tuti i partecipanti

            if ($lez) {
                include 'connect.php';
                $query = ("SELECT * FROM utentiscuola WHERE id_lezione='$lez'");
                $vai = mysql_query($query);
                $righe = mysql_num_rows($vai);
                $introduzione = "Risultano ".$righe." record registrati nella lezione ".$lez;
                
            }

            // Se si è immassa la mail estraggo tutte le iscrizioni effettuate con quella mail

            if ($posta) {
                include 'connect.php';
                $query = ("SELECT * FROM utentiscuola WHERE email='$posta'");
                $vai = mysql_query($query);
                $righe = mysql_num_rows($vai);
                $introduzione = "Risultano ".$righe." registrazioni contenenti la mail ".$posta;
                
            }
        
                

                ?>


            <p><? echo "$introduzione"; ?><br>
                    Effettua i cambiamenti desiderati e clicca su <span class="rosso">AGGIORNA</span> <b>per ogni riga modificata</b>
                <hr>
            </p>


                <?

                // Elenco di quanto estratto dal db

                $i = 0;

                while ($righe > $i) {
                    $cod = mysql_result($vai, $i, "id_utente");
                    $nome = mysql_result($vai, $i, "nome");
                    $cognome = mysql_result($vai, $i, "cognome");
                    $email = mysql_result($vai, $i, "email");
                    $telefono = mysql_result($vai, $i, "telefono");
                    $transazione = mysql_result($vai, $i, "idTransazione");
                    $lez2 = mysql_result($vai, $i, "id_lezione");
                    $pagamento = mysql_result($vai, $i, "pagamento");
                    $postiprenotati = mysql_result($vai, $i, "postiprenotati");
                    $note = mysql_result($vai, $i, "note");


                ?>
                <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
                <tr>
                    <td><? echo $cod; ?></td>
                    <td><input type="text" name="nome" value="<? echo $nome; ?>" size="15"></td>
                    <td><input type="text" name="cognome" value="<? echo $cognome; ?>" size="15"></td>
                    <td><input type="text" name="email" value="<? echo $email; ?>" size="20"></td>
                    <td><input type="text" name="telefono" value="<? echo $telefono; ?>" size="15"></td>
                    <td><input type="text" name="transazione" value="<? echo $transazione; ?>" size="25" readonly="readonly"></td>
                    <td><input type="text" name="pagamento" value="<? echo $pagamento; ?>" size="18"></td>
                    <td><input type="text" name="lezione" value="<? echo $lez2; ?>" ></td>
                    <td align="center"><input type="text" name="postiprenotati" value="<? echo $postiprenotati; ?>" size="5"></td>
                    
                </tr>

                <tr>
                    <td colspan="9">Note: <input name="note" size="100" value="<? echo "$note"; ?>"></td>
                </tr>

                <tr>
                    <td colspan="3" align="center" class="rosso">
                        
                        <!-- PULSANTE DI MODIFICA -->
                        <input type="hidden" name="riga" value="<? echo $cod; ?>">
                        <input name="aggiornamelo" class="rosso" type="submit" value=" AGGIORNA LA RIGA <? echo $cod; ?>  ">
                    </td>


                    <td colspan="6" align="center" class="rosso">

                        <!-- PULSANTE DI ELIMINAZIONE -->
                        <input class="rosso" type="submit" value=" ELIMINA LA RIGA <? echo $cod; ?>  " name="butta">
                    </td>
                </tr>

                <tr>
                    <td colspan="9"><hr></td>
                </tr>

                </form>

                <?
                $i++;
                }
            
        }
Cliccando sul pulsante di modifica della riga richiamo la funzione "aggiorna":
PHP:
if (isset($_POST['aggiornamelo'])){aggiorna();}

        function aggiorna(){

            $riga = $_POST['riga'];
            $lez2 = $_POST['lezione'];
            $nom = $_POST['nome'];
            $cog = $_POST['cognome'];
            $ema = $_POST['email'];
            $tel = $_POST['telefono'];
            $tra = $_POST['transazione'];
            $pag = $_POST['pagamento'];
            $pos = $_POST['postiprenotati'];
            $not = $_POST['note'];

            

                //recupero i posti disponibili prima della variazione

                $lezione_originale = $_SESSION['primalezione'];

                include 'connect.php';
                $postidisponibili = ("SELECT posti FROM calendario WHERE id_lezione = '$lezione_originale'");
                $esegui = mysql_query($postidisponibili);
                $arr = mysql_fetch_array($esegui);
                $postidisp_attuali = $arr['posti'];
                $old = $_SESSION['old'] = $postidisp_attuali;
                
                // recupero il numero di posti e la lezione prenotata in $riga (che corrisponde all'id utente unico della tabella utentiscuola)

                $perposti = ("SELECT * FROM utentiscuola WHERE id_utente = '$riga'");
                $si = mysql_query($perposti);
                $arr2 = mysql_fetch_array($si);
                $postiprenot_originali = $arr2['postiprenotati'];
                $lez_originale = $arr2['id_lezione'];


                mysql_close();


                
                // Se lezione e posti prenotati non sono cambiati aggiorno il db utentiscuola e basta
echo "lezione originale ".$_SESSION['primalezione']." e lezione da form: ".$lez2."<br>";
echo "posti prenotati originali ".$postiprenot_originali." e posti da form: ".$pos;

                if ($lezione_originale == $lez2 && $postiprenot_originali == $pos) {
                    echo "non sono cambiati ne lezione ne posti";
                    $richiesta = ("UPDATE utentiscuola SET nome = '$nom', cognome = '$cog', email = '$ema', telefono = '$tel', username = '$ema', idTransazione = '$tra', id_lezione = '$lez2', pagamento = '$pag', postiprenotati = '$pos', note = '$not' WHERE id_utente = '$riga' ");
                    $fai = mysql_query($richiesta);

                    mostra();
                }


            
        }
Ed è qui che ho riscontrato il problema.
Come si vede, all'inizio della funzione "mostra" valorizzo la variabile di sessione "primalezione" che mi serve poi più avanti per verificare se la prenotazione viene spostata ad un'altra lezione.
Verso la fine della funzione "aggiorna" ho inserito due echo per verificare se le variabili che utilizzo nel if sono corrette e vedo che $_SESSION['primalezione'] è vuota.
In breve (si fa per dire, vista la lunghezza di questo post) come mai è vuota?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
intanto non vedo da nessuna parte session_start()
ogni pagina che usa le sessioni deve avere alla prima riga tale funzione
PHP:
<?php
session_start();
//eccc php e/o html
?>
poi cosa è
$lez = $_POST['idlezione'];
$_SESSION['primalezione']; <- ???
e cosi in altro punto simile
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
Ciao,
session_start() è la prima riga della pagina, come vedi non ho postato la pagina completa.
La seconda domanda sottolinea quanto sono pirla... avevo scritto il nome della variabile di sessione dicendomi che l'avrei valorizzata dopo... mai fatto...
Comunque fatte le dovute integrazioni
PHP:
$_SESSION['primalezione'] = $lez;
e
Codice:
$_SESSION['maildelcliente'] = $posta;
quando l'esecuzione del codice arriva all'interno dell'ultimo (per ora) if
Codice:
if ($lezione_originale == $lez2 && $postiprenot_originali == $pos) {
                    include 'connect.php';
                    echo "non sono cambiati ne lezione ne posti";
                    $richiesta = ("UPDATE utentiscuola SET nome = '$nom', cognome = '$cog', email = '$ema', telefono = '$tel', username = '$ema', idTransazione = '$tra', id_lezione = '$lez2', pagamento = '$pag', postiprenotati = '$pos', note = '$not' WHERE id_utente = '$riga' ");
                    $fai = mysql_query($richiesta);

                    mostra();
                }
e mi richiama nuovamente la funzione "mostra", non si visualizza nulla.
Per controllare cosa arriva a quel punto, ho messo ancora due echo, così:
PHP:
function mostra(){
            echo $_SESSION['primalezione'];

            // recupero il codice della lezione e la registro come variabile di sessione x riutilizzarla dopo
            
            $lez = $_POST['idlezione'];
            $_SESSION['primalezione'] = $lez;

            if ($lez == "") {
                $lez = $_SESSION['primalezione'];
            }

echo "codice lezione ".$_SESSION['primalezione'];
            // oppure recupero la mail da ricercare e la registro come variabile di sessione per riutilizzarla dopo

            $posta = $_POST['mailcliente'];
            $_SESSION['maildelcliente'] = $posta;

            // Se si è immasso il codice della lezione estraggo tuti i partecipanti

            if ($lez) {
                include 'connect.php';
                $query = ("SELECT * FROM utentiscuola WHERE id_lezione='$lez'");
                $vai = mysql_query($query);
                $righe = mysql_num_rows($vai);
                $introduzione = "Risultano ".$righe." record registrati nella lezione ".$lez;
                
            }

            // Se si è immassa la mail estraggo tutte le iscrizioni effettuate con quella mail

            if ($posta) {
                include 'connect.php';
                $query = ("SELECT * FROM utentiscuola WHERE email='$posta'");
                $vai = mysql_query($query);
                $righe = mysql_num_rows($vai);
                $introduzione = "Risultano ".$righe." registrazioni contenenti la mail ".$posta;
                
            }
        
                

                ?>


            <p><? echo "$introduzione"; ?><br>
                    Effettua i cambiamenti desiderati e clicca su <span class="rosso">AGGIORNA</span> <b>per ogni riga modificata</b>
                <hr>
            </p>


                <?

                // Elenco di quanto estratto dal db

                $i = 0;

                while ($righe > $i) {
                    $cod = mysql_result($vai, $i, "id_utente");
                    $nome = mysql_result($vai, $i, "nome");
                    $cognome = mysql_result($vai, $i, "cognome");
                    $email = mysql_result($vai, $i, "email");
                    $telefono = mysql_result($vai, $i, "telefono");
                    $transazione = mysql_result($vai, $i, "idTransazione");
                    $lez2 = mysql_result($vai, $i, "id_lezione");
                    $pagamento = mysql_result($vai, $i, "pagamento");
                    $postiprenotati = mysql_result($vai, $i, "postiprenotati");
                    $note = mysql_result($vai, $i, "note");


                ?>
                <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
                <tr>
                    <td><? echo $cod; ?></td>
                    <td><input type="text" name="nome" value="<? echo $nome; ?>" size="15"></td>
                    <td><input type="text" name="cognome" value="<? echo $cognome; ?>" size="15"></td>
                    <td><input type="text" name="email" value="<? echo $email; ?>" size="20"></td>
                    <td><input type="text" name="telefono" value="<? echo $telefono; ?>" size="15"></td>
                    <td><input type="text" name="transazione" value="<? echo $transazione; ?>" size="25" readonly="readonly"></td>
                    <td><input type="text" name="pagamento" value="<? echo $pagamento; ?>" size="18"></td>
                    <td><input type="text" name="lezione" value="<? echo $lez2; ?>" ></td>
                    <td align="center"><input type="text" name="postiprenotati" value="<? echo $postiprenotati; ?>" size="5"></td>
                    
                </tr>

                <tr>
                    <td colspan="9">Note: <input name="note" size="100" value="<? echo "$note"; ?>"></td>
                </tr>

                <tr>
                    <td colspan="3" align="center" class="rosso">
                        
                        <!-- PULSANTE DI MODIFICA -->
                        <input type="hidden" name="riga" value="<? echo $cod; ?>">
                        <input name="aggiornamelo" class="rosso" type="submit" value=" AGGIORNA LA RIGA <? echo $cod; ?>  ">
                    </td>


                    <td colspan="6" align="center" class="rosso">

                        <!-- PULSANTE DI ELIMINAZIONE -->
                        <input class="rosso" type="submit" value=" ELIMINA LA RIGA <? echo $cod; ?>  " name="butta">
                    </td>
                </tr>

                <tr>
                    <td colspan="9"><hr></td>
                </tr>

                </form>

                <?
                $i++;
                }
            
        }
Il primo echo mi riporta correttamente il codice lezione, mentre il secondo è vuoto.
Ovviamente dipende da qui:
PHP:
$lez = $_POST['idlezione'];
            $_SESSION['primalezione'] = $lez;
perchè al secondo giro $lez è ovviamente vuoto, ma non riesco a capire come uscirne.
Per ora.
Intanto ci ragiono a mente fresca, ma se viene in mente la soluzione a qualcuno... grazie|
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
Rieccomi.
Cambiando l'inizio della funzione "mostra" in questo modo
PHP:
$lez = $_POST['idlezione'];

            if ($lez) {
                $_SESSION['primalezione'] = $lez;
            }
            

            if ($_SESSION['primalezione']) {
                $lez = $_SESSION['primalezione'];
            }
FUNZIONA!
Alla prossima...