当用户加载页面时,我想测试他们是否已经离开登录页面,或者在他们的PC上有一个cookie,说他们之前已经登录过,但是后者似乎无法正常工作。< / p>
if ($pass === $PassConfirm || $_COOKIE['loggedIn'] == "true"){
//Set cookie for logging in, (86400/24) lasts 1 hour
setcookie("loggedIn", "true", time() + (86400 / 24), "/");
/* Code to do stuff */
}else{
echo 'You are not logged in';}
我正在使用它来测试他们刚刚登录或拥有cookie。如果我从登录页面进入页面,使用正确的密码,它加载就好了。但是,当检查cookie的值是&#34; true&#34; (它被设置为,当我在Chrome浏览器中查看我的Cookie时,我可以看到它已设置)它错误地说我没有登录。
答案 0 :(得分:1)
如果您坚持使用cookie,您的代码结构需要进行大量的改进,所以可以,但建议(在评论和其他人中)使用$_SESSION
instead of cookies(因为他们的数据内容存储更安全,使用cookie以相同的方式与最终用户进行通信)。
现在改进你的代码:
if (password match){
//password check
}
elseif (cookie match){
//cookie check
}else {
//unauthorised. (You should redirect).
}
所以
if (password_verify($pass, $PassConfirm)){
/***
Password is matched with the hash so now set the cookie
***/
//set cookie - I will say more about this further down...
setcookie("loggedIn", "true", time() + (86400 / 24), "/");
}
elseif ($_COOKIE['loggedIn'] == "true") {
/***
Cookie data found so assumed correct. carry on.
***/
}
else{
echo 'You are not logged in';
/***
Some form of error handling. Typcially a header() statement and page redirection
***/
header("Location: index.php");
exit;
}
// Now your "rest of code" activity can begin here safe in the
// knowledege that only people with passwords or cookies will reach this part.
请阅读有关PHP Password Verify和相应的Password_hash功能的信息。
您的cookie检查可以并且将被操纵,通过使用SESSIONS进行改进,SESSIONS也可以更轻松地处理生命周期和登录和退出。
对于失败的状态,例如else
语句,您理想情况下不应该停留在同一页面上,并通过中间页面将用户重定向到另一个页面,这将清除cookie /会话数据和#34 ;清洁&#34;他们的相关数据。
请阅读setcookies
的{{3}},包括:
在下次加载页面之前,Cookie才会显示 cookie应该是可见的。测试cookie是否成功 设置,检查cookie之前的下一个加载页面上的cookie 到期。过期时间通过expire参数设置。一个很好的方式 通过简单调用来调试cookie的存在 的print_r($ _ COOKIE);.
必须使用相同的参数删除Cookie 正如他们所设定的那样。如果value参数是空字符串,或者 FALSE和所有其他参数匹配之前调用setcookie, 那么具有指定名称的cookie将从中删除 远程客户端。这是通过将值设置为内部实现的 &#39;删除&#39;到期时间为一年。
因为设置了一个 值为FALSE的cookie会尝试删除cookie 不要使用布尔值。 相反,使用0表示FALSE,使用1表示TRUE 。
这应该足以让您清楚了解您的Cookie是否已经出错:
如果在调用此函数之前存在输出,则setcookie()将失败 并返回FALSE。如果setcookie()成功运行,它将返回 真正。这并不表示用户是否接受了cookie。
0
或 1
,这应该正确显示。 所以:
if(setcookie("loggedIn", 1, time() + 3600, "/", "", false, true)){
print "Biscuit has been set!";
}
在页面重新加载之后(请注意,您应该更新代码,请进一步检查此代码示例,以便在此处查看[更多]与此相似的内容):
if($_COOKIE['loggedIn'] == true){
//cookie exists!
}
如果您仍然遇到问题,我建议您在PHP页面顶部使用notes from the manual和/或print_r($_COOKIE);
。