2

我有一个问题,用户无法注销,因为 $_COOKIE 并没有真正删除。我无法找出可能是什么问题。

此代码仅在登录时使用一次:

// 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'];
    }
}

此代码仅在注销时启动一次:

// 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. 您假设用户的时钟是准确的,并且在您服务器的一个小时内。鉴于有多少人的 VCR 闪烁12:00,这是一个糟糕的假设。

还有,为什么要将登录信息存储在客户端 cookie 中?您真正应该设置的唯一 cookie 是 session_start() 已经为您设置的会话 cookie,然后仅将所有这些信息存储在 $_SESSION 中。

于 2012-08-19T19:35:45.153 回答
2

我认为你这样做太复杂了。我的示例只是管理员登录:

登录.php

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

注销.php

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

用于session_set_cookie_params()设置生命周期

于 2012-08-19T19:40:31.557 回答
0

我找到了为什么 cookie 没有被删除!

为确保您的 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 回答