Php Can';不要让用户长时间登录

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

我有这个平台,您可以登录并进行测试(这是一个测试链接):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")
{
    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']的值,不如检查它是否已设置。