2010-07-27 7 views
11

È possibile utilizzare una variabile di sessione, quindi annullarla immediatamente dopo?Cancella variabile di sessione dopo l'uso

Esempio:

//==== 
//Process Form 
if ($_POST['Submit']) { 
    $update = $userSettings->update($_POST); 

    //If there are form errors 
if (!$update) { 
     //Load the errors into an array 
     $errors = $update[1]; 
    } else { 
     //Set the session 
     $_SESSION['showUpdated'] = true; 

     //Redirect to this page 
     header("Location: http://www.mysite.com/settings"); 
    } 
} 

//================== 

if ($_SESSION['showUpdated']) { 
echo "Settings Updated"; 
    unset($_SESSION['showUpdated']; 
} 

Così, dopo il modulo viene inviato, se non ci sono errori:

  • impostare una sessione a dire il modulo di presentazione era okay
  • ricaricare la pagina (per impedire i dati POST reinviati)
  • Se la variabile di sessione "showUpdated" è impostata, visualizzare il messaggio "Aggiornato"
  • Annulla la variabile di sessione (quindi non visualizziamo il messaggio alla prossima ricarica)

Attualmente il problema è, se si disattiva subito la variabile di sessione; È come se tu non lo avessi impostato prima della parte "se esiste".

Qualche soluzione? Questo è anche il modo migliore per farlo?

Grazie mille!

risposta

3

Sembra che dovrebbe funzionare. Assicurati di chiamare session_start() prima di provare a usare la sessione, e sempre exit() o die() dopo un'intestazione di reindirizzamento.

Compio quello che stai facendo in modo leggermente diverso. Mantengo un elemento 'messaggio' nella sessione. Inserirò il testo come "I tuoi dati sono stati salvati", i messaggi di errore, ecc. Quindi, su ogni pagina (in realtà in una classe modello di pagina), controllo se lo $_SESSION['message'] è impostato e non vuoto. Se c'è qualcosa lì, visualizzo il messaggio e imposta il valore su una stringa vuota o null.

+0

exit() o die() era quello che mi mancava, grazie! – steveneaston

1

Basta controllare per vedere se esiste. Questo è sicuro da fare prima che sia stato definito e ti dirà la tua risposta dopo che è stata definita.

if(!empty($_SESSION['showUpdated'])) { 
+1

Exists non è una funzione, intendi isset? –

+0

Sì, così. Puoi dire che è passato un po 'da quando ho codificato in PHP? Grazie @Anders S – TheJacobTaylor

+0

Sono andato con! Vuoto poiché, se non erro, non genererà alcun avviso, errore o eccezione se l'array o la chiave non esistono. – TheJacobTaylor

3

Lo faccio di volta in volta. Non ho mai avuto problemi con questo. Ma quello che vorrei aggiungere al tuo è una chiamata alla funzione exit() dopo il reindirizzamento dell'intestazione.

MODIFICA: Il motivo per il exit() è che impedirà l'elaborazione di qualsiasi ulteriore codice ed eliminerà la possibilità di annullamento prima che si volesse controllare dopo il reindirizzamento.

2

La chiamata di intestazione senza un'uscita successiva continuerà a eseguire la pagina.

header("Location: http://www.mysite.com/settings"); 
exit;

L'utilizzo di questo, invece, dovrebbe eliminare la pagina e non annullare la variabile di sessione nella stessa chiamata di pagina.

0

Oppure è possibile impostarlo su false.

 
if ($_SESSION['showUpdated']) { 
echo "Settings Updated"; 
$_SESSION['showUpdated'] = false; 
} 

E sembra che si utilizza la versione più piccola del PHP di 5,3, perché in 5.3 avrai notato quando si utilizza il valore non inizializzato. Così si dovrebbe utilizzare la funzione isset:

 
if (isset($_SESSION['showUpdated']) && $_SESSION['showUpdated']) { 
echo "Settings Updated"; 
$_SESSION['showUpdated'] = false; 
} 
23

ho notato un piccolo errore nell'esempio originale che potrebbe causare altri problemi.

unset($_SESSION['showUpdated']; 

deve essere

unset($_SESSION['showUpdated']); 

Escluso tal fine ) nel unset causerà un errore.