web-dev-qa-db-fra.com

Effacer la variable de session après utilisation

Est-il possible d'utiliser une variable de session, puis de la supprimer directement après?

Exemple:

//====
//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'];
}

Donc, après la soumission du formulaire, s'il n'y a pas d'erreur:

  • Définir une session pour dire que la soumission du formulaire s'est bien déroulée
  • Rechargez la page (pour empêcher les données POST soumises à nouveau)
  • Si la variable de session 'showUpdated' est définie, affichez le message "Mis à jour"
  • Désactivez la variable de session (nous ne verrons donc pas le message lors du prochain rechargement)

Actuellement, le problème est que, si vous annulez la variable de session immédiatement après; C'est comme si vous l'aviez dés-défini avant la partie "si existe".

Des solutions? Est-ce même la meilleure façon de le faire?

Merci beaucoup!

12
steveneaston

Cela ressemble à cela devrait fonctionner. Assurez-vous d'appeler session_start () avant d'essayer d'utiliser la session et quittez toujours () ou die () après un en-tête de redirection.

J'accomplis ce que tu fais un peu différemment. Je garde un élément 'message' dans la session. Je vais coller du texte comme "Vos données ont été enregistrées", des messages d'erreur, etc. Ensuite, sur chaque page (en fait dans une classe de modèle de page), je vérifie si le $_SESSION['message'] est défini et non vide. S'il y a quelque chose, j'affiche le message et définit la valeur sur une chaîne vide ou null.

3
Scott Saunders

J'ai remarqué une petite erreur dans l'exemple d'origine qui pourrait causer d'autres problèmes.

unset($_SESSION['showUpdated'];

doit être

unset($_SESSION['showUpdated']);

Ne pas inclure cette fin ) dans la unset provoquera une erreur.

23
donlaur

Je fais ça de temps en temps. Je n'ai jamais de problèmes avec ça. Mais ce que je voudrais ajouter au vôtre, c’est un appel à la fonction exit() après la redirection de l’en-tête.

EDIT: La raison pour exit() est qu’elle l’empêchera de traiter du code supplémentaire et éliminera la possibilité de réinitialisation avant que vous ne souhaitiez vérifier après la redirection.

3
spinon

L'appel en-tête sans sortie après continuera à exécuter la page.

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

L’utiliser à la place devrait tuer la page et ne pas annuler la variable de session sur le même appel de page. 

2
Brad F Jacobs

Il suffit de vérifier pour voir s'il existe. Cela est sûr avant de le définir et vous communiquera votre réponse une fois celle-ci définie. 

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

Ou vous pouvez simplement le définir sur false.

 if ($ _SESSION ['showUpdated']) {
 echo "Paramètres mis à jour"; 
 $ _SESSION ['showUpdated'] = false; 
} 

Et il semble que vous utilisiez une version plus petite de PHP que la version 5.3, car dans la version 5.3, vous remarquerez que vous utilisez une valeur non initialisée. Donc, vous devriez utiliser la fonction isset:

 if (isset ($ _SESSION ['showUpdated']) && $ _SESSION ['showUpdated']) {
 echo "Paramètres mis à jour"; 
 $ _SESSION ['showUpdated'] = faux; 
} 
0
tomasbelusky