在我的登录脚本中,如果用户选择"记住我",它会像这样设置cookie:
setcookie("a", $valuea, time()+2595000, "/");
setcookie("b", $valueb, time()+2595000, "/");
当用户(使用"记住我")选择注销时,注销.php脚本通过以下方式取消设置 cookie:
if(isset($_COOKIE['a']) && isset($_COOKIE['b'])){
setcookie("a","", time()-2595000, "/");
setcookie("b","", time()-2595000, "/");
setcookie(session_id(),"",time()-2595000, "/");
}
但是,注销后,用户将被重定向到登录页面,登录页面通过以下代码检查用户登录状态:
if($_COOKIE['a']=='' || $_COOKIE['b']==''){
echo 'You are not logged in.';
}else{
echo 'You are logged in with remember me.Your cookie is: '.$_COOKIE['a'].' and '.$_COOKIE['b'];
}
但我发现用户没有注销,cookie 显示有价值。我没有找到为什么 setcookie 没有清除 cookie a 和 b 的值。知道吗?
您也可以使用会话:像在记住我函数中这样:
session_start();
$_SESSION['a'] = "valuea";
$_SESSION['b'] = "valueb";
在注销功能中:
session_unset();
session_destroy();
header("login.page")
对于签入登录页面:
if(!isset(@_SESSION['a']) && !isset($_SESSION['b'])){
echo "You are not logged in.";
}
else{
echo "You are logged in with " . $_SESSION['a'] . 'and' . $_SESSION['b'];
}
最后我发现了问题。实际上在实际代码中,发生了什么,我在同一注销页面中删除后(而不是重定向到登录页面后)检查了 $_COOKIE。我忘记了 cookie 是由浏览器发送的,如果您不转到下一页,您将看不到 cookie 中的更改。因此,如果您在注销中尝试此操作.php:
//deletion of cookies
if(isset($_COOKIE['a']) && isset($_COOKIE['b'])){
setcookie("a","", time()-2595000, "/");
setcookie("b","", time()-2595000, "/");
setcookie(session_id(),"",time()-2595000, "/");
}
//checking the existence of cookies
if($_COOKIE['a']=='' || $_COOKIE['b']==''){
echo 'You are not logged in.';
}else{
echo 'You are logged in with remember me.Your cookie is: '.$_COOKIE['a'].' and '.$_COOKIE['b'];
}
然后它会给你虚假信息。虽然 cookie 被删除,但您会看到"您已登录.................."。因为 PHP 在注销时获取的 cookie .php将保留在 PHP 内存中,直到用户移动到下一页。如果您在下一页中检查这些 cookie 是否存在,那么您会看到没有 cookie(这些 cookie 确实被删除了)。
我的问题是所有专家,有没有办法交叉检查 cookie 是否真的在删除后在同一页面中删除?
要在注销时清除 Cookie,请通过仅传递 Cookie 名称(不传递值)来设置它们。
喜欢这个:
setcookie('a');
setcookie('b');
setcookie(session_id());
删除 cookie 的正确方法是将过期日期设置为过去的时间,并将值留空,如下所示。浏览器将自动删除此类 Cookie。此示例也在"示例 #2 setcookie() 删除示例"中讨论过。
使用 unset($_COOKIE['a'])
将不起作用,因为它只会删除数组中的 cookie 值,并且下次加载页面时它会再次出现。因此,更改不会影响浏览器中的值。
<?
setcookie("a", "", time() - 3600);
?>