注销时不会删除Cookie

时间:2012-08-19 19:32:38

标签: php

我遇到了问题,用户无法注销,因为$ _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);

3 个答案:

答案 0 :(得分:4)

不要使用Cookie的相对时间。如果您想要过期cookie,请使用Jan 1 1970 00:00:00。您假设用户的时钟是准确的,并且在服务器的一小时内。鉴于有多少人的VCR闪烁12:00,这是一个不好的假设。

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

答案 1 :(得分: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()设置生命周期

答案 2 :(得分: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 "/"