2009-08-30 50 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

なぜこれまで下落したのか、彼は正しい。 –

+0

ありがとう...とにかく、session_start()はスクリプトの先頭で呼び出さなければなりません。 – mck89

8

このページがセッションに属していることをPHPに認識させるには、ページの上にsession_start()を呼び出す必要があります。 - 少なくともPHP manualはそれを伝えます。

このマニュアルページの注記は、$ _SESSION変数を使用していない古い環境でのみsession_unset()が使用されることを示しています。

+0

それは彼が 'session_unset()'を使用していないのは良いことです... – nickf

+0

@nickf:正しく、正しく認識しませんでした –

2

あなたは最初のセッションをオープンする必要があります。

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

私はリダイレクトをこのようなコードを書くので最後に置かなければならないと思いますリダイレクトを行い、他の機能を実行しません。 – mck89

+0

いいえ、期待どおりに動作します。 – rodrigoap

+1

ヘッダーが送信された後でもスクリプトが実行を終了するため、期待どおりに動作します。ただし、コードの混乱を軽減するために、セッションが破棄された後にヘッダーを配置する必要があります。 – MitMaro

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配列を手動で '$ _SESSION = array();'で消去すると言っています。なぜあなたはそれを設定解除する必要はないと言いますか? [これは私が参照しているドキュメントです](http://php.net/manual/en/function.session-destroy.php)。 – doug65536