2009-08-30 113 views
6

我正在使用以下代碼來使會話無效。我在很多頁面都鏈接到logout.php。如果該註銷鏈接被點擊,則調用logout.php頁面。以下是logout.php中的代碼。PHP會話問題

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

一旦會話失效我想開index.php頁面。 但我歌廳以下錯誤:

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

有什麼不對?

回答

16

我認爲你不能在銷燬會話之前調用session_start()函數。

+0

爲什麼一直低估,他是對的。 – 2009-08-30 13:32:36

+0

謝謝......無論如何,必須在腳本開始時調用session_start()。 – mck89 2009-08-30 13:34:08

8

您將需要在頁面頂部調用session_start()來提醒php該頁面呼叫屬於該會話。 - 至少PHP manual告訴我們。

該手冊頁上的提示提示,session_unset()僅適用於不使用$ _SESSION變量的較舊環境。

+0

那麼這是一件好事,他沒有使用'session_unset()'然後... – nickf 2009-08-30 13:32:34

+0

@nickf:正確,沒有正確識別 – 2009-08-30 16:51:26

2

你必須先打開會話:

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

我認爲重定向必須放在最後,因爲編寫這樣的腳本代碼不重定向,不執行其他功能 – mck89 2009-08-30 13:35:56

+0

不,它按預期工作。 – rodrigoap 2009-08-30 14:04:48

+1

它只能按預期工作,因爲腳本在發送標頭後仍然會執行完畢。但是,在會話銷燬之後,您應該放置標題以減少代碼的混淆。 – MitMaro 2009-08-30 19:15:22

1

的問題是,你不能破壞它尚未啓動一個會話。然後,這引發了一個警告,這個警告正在呼應瀏覽器。接下來的問題是,在輸出到瀏覽器後無法發送標題,因此會引發另一個警告。

你只需要檢查是否會話第一存在:

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

你必須經常使用session_start();在使用會話功能/變量之前。所以用session_start();開始所有的PHP文件。也logout.php:

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

你也不需要取消它。

+0

PHP文檔非常清楚地說,用'$ _SESSION = array();'手工擦除$ _SESSION數組。你爲什麼說你不需要解除它。 [這是我所指的文檔](http://php.net/manual/en/function.session-destroy.php)。 – doug65536 2013-09-01 09:55:06