-2
function killsession()
{
  //  global $_SESSION;
    $_SESSION = array();
    if (session_id() != "" || isset($_COOKIE[session_name()])) {
        setcookie(session_name(), '', time() - 42000, '/');
    }
    session_unset();
    session_destroy();
    header("Location: "index");

}

この関数を実行した後も$_SESSION['userid']がまだ残っている理由はありますか?私は文字通りログインしたままです。

セッション名とstart()は、すべてのページの上部に設定されています。

4

2 に答える 2

2

PHPのsession_destroy()マニュアルにあるように:

session_destroy()は、現在のセッションに関連付けられているすべてのデータを破棄します。セッションに関連付けられているグローバル変数の設定を解除したり、セッションCookieの設定を解除したりすることはありません。セッション変数を再度使用するには、session_start()を呼び出す必要があります。

ユーザーをログアウトするなど、セッションを完全に強制終了するには、セッションIDも設定解除する必要があります。Cookieを使用してセッションIDを伝播する場合(デフォルトの動作)、セッションCookieを削除する必要があります。そのためにsetcookie()を使用できます。

PHPマニュアルからの直接の例:

<?php
// Initialize the session.
// If you are using session_name("something"), don't forget it now!
session_start();

// Unset all of the session variables.
$_SESSION = array();

// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// Finally, destroy the session.
session_destroy();
?>

この例を関数に適用します。

function killsession()
{
  // start the session, if started before, comment
  session_start();

  // Unset all of the session variables. 
  $_SESSION = array();

  // destroy the session, and not just the session data!
  if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
  }

  // destroy the session.
  session_destroy();

  // direct user
  header("Location: index.php");
}

次の2つのセッション変数について考えてみます。

$_SESSION['userid']=25;
$_SESSION['userName']='Super BuBu';

の出力はprint_r($_SESSION);次のようになります。

Array ( [userid] => 25 [userName] => Super BuBu )

関数を呼び出した後killsession()、出力は次のようになります。

Array ( );

この作業例を参照してください。print_rおよびsessionインタラクションによって実行された以前の出力とヘッダーが原因で、この環境でエラーが発生すると想定されます。

于 2012-06-14T23:13:25.987 に答える
0

ただ試してみてください

 function killsession() {
     unset($_SESSION['userid']);
     session_destroy();
     header("Location: "index");

 }
于 2012-06-14T22:21:36.473 に答える