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