Problema di block di una variabile di session

C'è un module sul mio sito che viene utilizzato per invitare gli amici. È un field di text semplice e un button di invio. Se si verifica un errore, reindirizzamento a questa pagina e viene visualizzato un messaggio di errore se la loro è una variabile di session impostata.

if (isset($_SESSION['invite_error'])) { echo $_SESSION['invite_error']; unset($_SESSION['invite_error']); } 

Tuttavia, se esco da questa pagina e torno ad esso, il messaggio di errore viene ancora visualizzato. Se mi allontano e torno indietro ancora una volta sarà fatto. È lo stesso quando aggiorno quella pagina … 1 aggiornamento non lo libererà, ma 2 lo farà. Non riesco a distruggere l'intera session, voglio solo annullare questa variabile. La versione di PHP è 5.2.5 build 6, i globals di registro sono spenti, sto chiamando session_start () nella parte superiore di questa pagina, ho provato a usare anche un'intestazione no-cache.

Modifica: Aggiunto il codice completo.

 <?php ob_start(); session_start(); $user_id = $_SESSION['user_id']; $user_name = $_SESSION['user_name']; if ($user_id==null) header("Location: /login.php"); if (isset($_SESSION['invite_errors'])) { $error = $_SESSION['invite_errors']; unset($_SESSION['invite_errors']); } require_once("ui/header.php"); ?> <div id="invite" class="content"> <?php if($error) { ?> <div class="errors round"> <?php echo $error ?> </div> <?php } ?> <h3>Invite Your Friends</h3> <div class="invite-form"> <form method="post" action="controllers/invite.php"> <div class="row"> <textarea class="txt-area" name="emails" id="emails" rows="5"></textarea> <div class="tip">Separate multiple email addresses with ,</div> </div> <div class="row-submit"> <input type="submit" name="submit" id="submit" class="submit-btn" value="Submit" /> </div> </form> </div> </div> <?php require_once("ui/footer.php"); ?> 

Avvia la session prima di avviare il buffering dell'output. Quindi, cambia le ob_start() e session_start() .

Poiché i cookie di session sono definiti nelle intestazioni inviate al browser e le intestazioni vengono inviate al browser quando si avvia il buffer, è necessario avviare le sessioni prima del buffer.

L'esempio che hai fornito dovrebbe funzionare. Forse una sorta di cache di session ti sta ostacolando. Potresti provare a modificare il tuo codice come segue:

 if (isset($_SESSION['invite_errors']) && $_SESSION['invite_errors']) { $error = $_SESSION['invite_errors']; $_SESSION['invide_errors'] = false; unset($_SESSION['invite_errors']); // Explicitly write and close the session for good measure session_write_close(); } 

Forse puoi cambiare il valore dopo aver fatto eco all'errore

 if (isset($_SESSION['invite_error'])) { echo $_SESSION['invite_error']; $_SESSION['invite_error'] = null; unset($_SESSION['invite_error']); } 

Nella mia esperienza, le sessioni di PHP non valgono la pena di essere utilizzate e sono state progettate solo come una soluzione rapida e facile. Il comportmento $ _SESSION non è sempre ovvio, ma l'utilizzo di sessioni in senso tradizionale è per lo più inevitabile. Emetti i tuoi cookie di identificazione e token e memorizza i valori di session contro questi, forse in un database. Questo ha anche il vantaggio di essere scalabile tra i server.