2009-08-30 9 views
6

Używam następującego kodu do unieważnienia sesji. Mam link do logout.php na wielu stronach. Jeśli klikniesz ten link wylogowania, zostanie wywołana strona logout.php. Poniżej znajduje się kod w logout.php.Problemy z sesją PHP

unset($_SESSION['admin']); 
session_destroy(); 
header('Location: index.php'); 

Po unieważnieniu sesji chcę otworzyć stronę index.php. Ale pojawia się następujący błąd:

Warning: session_destroy() [function.session-destroy]: Trying to destroy uninitialized session in C:\xampp\htdocs\Selection\logout.php on line 3

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\Selection\logout.php:3) in C:\xampp\htdocs\Selection\logout.php on line 4

Co jest nie tak?

Odpowiedz

16

Myślę, że nie można było zadzwonić do funkcji session_start() przed zniszczeniem sesji.

+0

Zawsze brany pod uwagę, ma rację. –

+0

Dzięki ... w każdym razie session_start() musi zostać wywołana na początku skryptu. – mck89

8

Musisz wywołać session_start() na górze strony, aby przypomnieć php, że ta strona jest częścią sesji - Mówi to co najmniej PHP manual.

Uwagi na tej stronie podręcznika podpowiadają, że session_unset() jest używane tylko w starszych środowiskach, które nie używają zmiennej $ _SESSION.

+0

Dobrze, że nie używa on 'session_unset()', a następnie ... – nickf

+0

@nickf: poprawny, nie rozpoznał poprawnie –

2

Musisz otworzyć sesję pierwszy:

header('Location: index.php'); 
session_start(); 
session_unset(); 
session_destroy(); 
+1

Myślę, że przekierowanie musi być umieszczone na końcu, ponieważ napisanie takiego kodu skryptu wykonuje przekierowanie i nie wykonuje innych funkcji – mck89

+0

Nie, działa zgodnie z oczekiwaniami. – rodrigoap

+1

Działa tylko zgodnie z oczekiwaniami, ponieważ skrypt nadal kończy wykonywanie po wysłaniu nagłówka. Należy jednak umieścić nagłówek po zniszczeniu sesji, aby zmniejszyć zamieszanie kodu. – MitMaro

1

Problem polega na tym, że nie można zniszczyć sesję, która nie została uruchomiona. Podnosi to ostrzeżenie, które jest wysyłane do przeglądarki. Następnym problemem jest to, że nie można wysyłać nagłówków po tym, jak zostały wyprowadzone do przeglądarki, więc powstaje kolejne ostrzeżenie.

Trzeba tylko sprawdzić, czy istnieje pierwsza sesja:

if (session_name() != '') { 
    session_destroy(); 
} 
0

należy zawsze używać session_start(); PRZED użyciem funkcji/zmiennej sesji. Tak więc uruchom wszystkie pliki PHP za pomocą session_start() ;. Również wylogowanie.php:

session_start(); 
session_destroy(); 
header('Location: index.php'); 

Nie trzeba również usuwać tego.

+0

Dokumentacja PHP bardzo wyraźnie mówi, aby ręcznie wyczyścić tablicę $ _SESSION za pomocą '$ _SESSION = array();'. Dlaczego mówisz, że nie musisz tego resetować? [To jest dokumentacja, którą mam na myśli] (http://php.net/manual/en/function.session-destroy.php). – doug65536

Powiązane problemy