Php Can';不要让用户长时间登录
我有这个平台,您可以登录并进行测试(这是一个测试链接):www.mf.pt.la 我不明白为什么这不起作用。。。首先,我在config.php文件上尝试了以下方法:Php Can';不要让用户长时间登录,php,session,session-cookies,session-timeout,Php,Session,Session Cookies,Session Timeout,我有这个平台,您可以登录并进行测试(这是一个测试链接):www.mf.pt.la 我不明白为什么这不起作用。。。首先,我在config.php文件上尝试了以下方法: ini_set('session.cookie_lifetime', 864000); ini_set('session.gc_maxlifetime', 864000); 然后我试着用饼干做这个: $year = time() + 31536000; if($_POST['remember']=="1") { setco
ini_set('session.cookie_lifetime', 864000);
ini_set('session.gc_maxlifetime', 864000);
然后我试着用饼干做这个:
$year = time() + 31536000;
if($_POST['remember']=="1")
{
setcookie("remember_me", $_SESSION[LOGIN_USER], $year);
}
elseif($_POST['remember']=="")
{
if(isset($_COOKIE['remember_me']))
{
$tendays = time() + 864000;
setcookie("remember_me", $_SESSION[LOGIN_USER], $tendays);
}
}
因为用户在30分钟/1小时后注销,所以似乎没有一个正常工作!:(
这是非常令人沮丧的,因为在这个网站内,用户通常每天进出一次以上,而且总是要登录,这实际上让我失去了用户(
编辑1:
好的,让我们看看现在我们在哪里
经过大量测试后,我注意到问题是我试图将数组直接保存到cookie中,但它不是这样工作的。我搜索了很多内容,创建了一个名为“test”且内容为“text”的非常简单的cookie,它工作了,所以如果工作正常,我就创建了一个cookie
然后,我寻找一种方法,将它放在同一个cookie上,而不是为我需要的每个信息保存一个cookie
这就是结论。为了创建cookie,我做了以下工作:
$cookie_name = "remember_me";
$userinfo = $_SESSION[LOGIN_USER]['user_id']."_".$_SESSION[LOGIN_USER]['user_type']."_".$_SESSION[LOGIN_USER]['name']."_".$_SESSION[LOGIN_USER]['email'];
if($_POST['remember']=="1"){
setcookie($cookie_name, $userinfo, time() + 31536000, '/');
}else{
setcookie($cookie_name, $userinfo, time() + 864000, '/');
}
这就是我做的曲奇:
if(isset($_COOKIE["remember_me"])) {
$usercookie = explode("_",$_COOKIE["remember_me"]);
$_SESSION[LOGIN_USER]['user_id'] = $usercookie[0];
$_SESSION[LOGIN_USER]['user_type'] = $usercookie[1];
$_SESSION[LOGIN_USER]['name'] = $usercookie[2];
$_SESSION[LOGIN_USER]['email'] = $usercookie[3];
}
到目前为止,它似乎工作,但…让我们看看,如果在更多的时间登录是自动完成后,我再次进入网站
编辑2:
刚才注意到,空格以+和@as%40的形式保存到cookie中
编辑3:
最后!我做到了,以下是我为帮助未来用户所做的:
首先,让我们从创建cookie开始。我在users表中插入了一个新列以保存令牌,并将该令牌作为MD5中的一个加密分配给一个变量,如下所示:
$tokenuser = md5(uniqid(rand(), true));
更新表后,我们必须创建cookie,如下所示:
$cookie_name = "mfrm";
if($_POST['remember']=="1"){
setcookie($cookie_name, $tokenuser, time() + 31536000, '/');
}else{
setcookie($cookie_name, $tokenuser, time() + 864000, '/');
}
对于那些不理解“如果”条件的人,这只是为了检查用户是否选择了“复选框”,以便“永远”记住(本例中为一年)
到目前为止还不错,下一部分是“尝试并出错”,直到我最终完成了它!您应该将此代码放在标题之前,否则它可能无法工作,并且可能会给您一个错误:
if(isset($_COOKIE["mfrm"])) {
$usercookie = $_COOKIE["mfrm"];
}
因此,通过这种方式,变量$usercookie现在拥有cookie的内容(我们创建的唯一令牌)
“稍后”在您的代码中,您只需调用数据库,检查该令牌对哪个用户有效,然后只需指定用户id和所有其他您想要的内容,用户就可以登录了。:)
我希望看到这一点的人都能解决这个问题,在我最终开始工作之前,我做了很多谷歌搜索
我的建议是,在PHP中进行大量的“打印”和“回显”,这样您就可以看到问题所在,如果需要,可以通过插入sleep(2);(其中2表示两秒)停止代码
祝你好运!:)这还不够,Cookie会保存在用户的浏览器中,所以每次她连接时,你都会检查她的Cookie并相应地设置她的会话 希望这有帮助 ==编辑=== 这可能会帮助您: 假设用户ID为“12345”,他正在登录 将cookie设置为:
setcookie('user_id', '12345', time() + (86400 * 30), '/');
然后,如果用户明天登录,并且他的会话已过期,您可以从cookie检查其用户id是否存在于数据库中:
if(isset($_COOKIE['user_id'])) {
// check the user_id in DB and create session if exists
}else{
// User has no cookies, then he has to login
}
希望这是有意义的
这是一个非常简单的示例,因此,当然,不要只在cookie中放入用户id,而是一种更严格的身份验证形式,如您生成的最后一个会话id和令牌
==EDIT2===
“记住”是复选框的名称吗?因为在这种情况下,如果未选中,则不会设置$\u POST['memory']。因此,与其检查$\u POST['memory']的值,不如检查它是否已设置
假设“记住”是复选框的名称:
$year = time() + 31536000;
if(isset($_POST['remember']))
{
setcookie("remember_me", $_SESSION[LOGIN_USER], $year);
}
else
{
if(isset($_COOKIE['remember_me']))
{
$tendays = time() + 864000;
setcookie("remember_me", $_SESSION[LOGIN_USER], $tendays);
}
}
您不能使用setcookie()设置$\u会话。您是否在其他任何地方使用会话,其生存期设置不同,但其保存路径设置相同?如果是这样的话,那些其他脚本可能会触发删除现有会话文件。实际上,这没有帮助,因为我不明白你的意思。我应该怎么做才能让它工作?基本上,你将cookie存储在用户的计算机上,然后每次用户连接时,你首先检查他们是否有来自你的cookie,如果有,则设置该特定用户的会话,否则,如果没有,则用户将不得不登录。我该怎么做?我不知道怎么做(我非常感谢您的帮助,这应该会起作用,但我不明白为什么cookie没有被创建!:(我的意思是,我在网上搜索了为什么,发现很多人都有相同的问题,并尝试了不同的解决方案,但都不起作用……cookie并不是简单地创建的,就是这样……(不用担心:)“记住我”是一个复选框吗?因为在这种情况下,如果不选中它,则不会设置$\u POST['memory']。因此,与其检查$\u POST['memory']的值,不如检查它是否已设置。