2010-10-21 4 views
14

J'essaye de dépanner une fonction de déconnexion pour une application Web. Lorsque vous êtes connecté, l'application dispose de plusieurs cookies pour son domaine. Voici la procédure en cours de fermeture de session:PHP - pourquoi je ne peux pas me débarrasser de ce cookie d'identification de session?

  • Vous cliquez sur un lien qui vous envoie vers une page de fermeture de session
  • La page de fermeture de session exécute une fonction qui appelle session_destroy() et boucles aussi par tous les cookies pour le domaine et les met à expire dans le passé (voir le code ci-dessous)
  • La page de déconnexion redirige ensuite vers une page de connexion, qui est un code HTML.

A la fin de ce processus, tous les autres cookies ne sont pas positionnés, mais le cookie PHPSESSID est toujours là, a la même valeur, et est encore expirer à la fin de la session.

Qu'est-ce qui me manque ici?

est ici la fonction logout je l'ai mentionné ci-dessus:

function log_out_current_user() { 

     // Destroy the session 
     if (isset($_SESSION)) { 
      session_destroy(); 
     } 

     // Expire all of the user's cookies for this domain: 
     // give them a blank value and set them to expire 
     // in the past 
     if (isset($_SERVER['HTTP_COOKIE'])) { 
      $cookies = explode(';', $_SERVER['HTTP_COOKIE']); 
      foreach($cookies as $cookie) { 
       $parts = explode('=', $cookie); 
       $name = trim($parts[0]); 
       setcookie($name, '', time()-1000); 
       setcookie($name, '', time()-1000, '/'); 
      } 
      // Explicitly unset this cookie - shouldn't be redundant, 
      // but it doesn't hurt to try 
      setcookie('PHPSESSID', '', time()-1000); 
     } 

    } 

Répondre

29

Vous ne supprimez pas avec les mêmes paramètres que il a été créé. Utilisez session_get_cookie_params pour les obtenir. Pour être portable, vous devriez obtenir le nom du cookie via session_name. Voici un petit script pour le faire:

$params = session_get_cookie_params(); 
setcookie(session_name(), '', 0, $params['path'], $params['domain'], $params['secure'], isset($params['httponly'])); 
Questions connexes