2010-10-21 8 views
14

Próbuję rozwiązać problem z funkcją wylogowania dla aplikacji internetowej. Po zalogowaniu aplikacja ma kilka plików cookie dla swojej domeny. Oto obecna procedura wylogowania:PHP - dlaczego nie mogę się pozbyć tego identyfikatora sesji?

  • kliknąć link, który wysyła do strony wylogowania
  • Strona wylogowania uruchamia funkcję, która zwraca session_destroy() i pętle również poprzez wszystkie pliki cookie dla domeny i ustawia je do wygasają w przeszłości (patrz kod poniżej)
  • Strona logowania następnie przekierowuje do strony logowania, która jest prostym kodem HTML.

Pod koniec tego procesu, wszystkie inne ciasteczka są ustawione, ale PHPSESSID Cookie to nadal istnieje, ma taką samą wartość, a wciąż wygasnąć pod koniec sesji.

Czego tu mi brakuje?

Oto funkcja wylogowania wspomniałem powyżej:

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); 
     } 

    } 

Odpowiedz

29

Nie jesteś usunięcie go z tymi samymi parametrami, jak został stworzony. Użyj session_get_cookie_params, aby je uzyskać. Aby być przenośnym, należy uzyskać nazwę pliku cookie za pośrednictwem session_name. Oto mały skrypt do wykonania:

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