2

$ _COOKIEが実際に削除されていないため、ユーザーがログアウトできないという問題があります。何が問題なのかわかりません。

このコードは、ログイン時に1回だけ使用されます。

// Log In
$_SESSION['user_id'] = $row['user_id'];
$_SESSION['username'] = $row['username'];
setcookie('user_id', $row['user_id'], time() + 2592000);
setcookie('username', $row['username'], time() + 2592000);

以下のコードは、ユーザーがブラウザを再起動したときにログインできるようにCookieが設定されているかどうかを確認しています(「ログイン状態を維持する」効果)。

// Starting Session
session_start();
// If the session vars aren't set, try to set them with cookies
if (!isset($_SESSION['user_id'])) {
    // This check always equals true because cookies are not deleting on Log Out
    if (isset($_COOKIE['user_id']) && isset($_COOKIE['username'])) {
        $_SESSION['user_id'] = $_COOKIE['user_id'];
        $_SESSION['username'] = $_COOKIE['username'];
    }
}

このコードは、ログアウト時に1回だけ起動されます。

// Log Out
session_start();
if (isset($_SESSION['user_id'])) {
    $_SESSION = array();
    if (isset($_COOKIE[session_name()])) {
        setcookie(session_name(), '', time() - 2592000, '/');
    }
    session_destroy();
}
setcookie('user_id', '', time() - 2592000);
setcookie('username', '', time() - 2592000);
4

3 に答える 3

4

Cookieに相対時間を使用しないでください。Cookieを期限切れにする場合は、を使用しますJan 1 1970 00:00:00。ユーザーの時計が正確で、サーバーの時計から1時間以内であると想定しています。VCRが点滅している人の数を考えると12:00、これは悪い仮定です。

また、なぜクライアント側のCookieにログイン情報を保存するのですか?実際に設定する必要がある唯一のCookieは、session_start()がすでに実行しているセッションCookieであり、そのすべての情報を$_SESSIONのみに保存します。

于 2012-08-19T19:35:45.153 に答える
2

あなたはそれをあまりにも複雑にやっていると思います。単なる管理者ログインである私の例:

login.php

@session_start();
if (isset($_GET['login'])) {
    if($_GET['name'] == $s['admin']){
        if($_GET['pw'] == $s['adminpw']){
            $_SESSION['isadmin'] = true;    
        }
    }
}

logout.php

@session_start();
unset ($_SESSION['isadmin']);

session_set_cookie_params()ライフタイムを設定するために使用

于 2012-08-19T19:40:31.557 に答える
0

クッキーが削除されなかった理由がわかりました!

Cookieが確実に削除されるようにするには、Cookieの削除と設定と同じパスを設定します。

// Setting Cookie
setcookie(session_name(), '', time()-2592000, '/'); // The path here is "/"

// Removing Cookie
setcookie(session_name(), '', time()+2592000, '/'); // The path here is "/"
于 2013-02-03T17:50:47.367 に答える