无法让用户长时间登录

时间:2014-05-27 00:35:38

标签: php session session-cookies session-timeout

我有这个平台,您可以登录并进行测试(这是一个测试链接):www.mf.pt.la

我无法理解为什么这不起作用...首先我在config.php文件上尝试了这个:

ini_set('session.cookie_lifetime', 864000);
ini_set('session.gc_maxlifetime', 864000);

我尝试使用cookie:

$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中,并且它不能像那样工作。我搜索了很多,并创建了一个非常简单的cookie,其名称为“test”,内容为“text”,并且有效,所以如果工作正常,我创建了一个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, '/');
}

要调用cookie,这就是我所做的:

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:

注意到空格被保存到cookie中,而@和@被保存为%40

编辑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”条件的人,只需检查用户是否选择了“复选框”以便“永远”记住(在这种情况下为一年)。

到目前为止,下一部分是“尝试和错误”,直到我最终做到了!您应该在标题之前放置此代码,否则它可能不起作用并且可能会给您一个错误:

if(isset($_COOKIE["mfrm"])) {
    $usercookie = $_COOKIE["mfrm"];
}

所以,这样你的变量$ usercookie现在就拥有了你的cookie的内容(我们创建的唯一标记)。

“稍后”您的代码,您只需调用您的数据库,检查该令牌有效的用户,然后只需asge user_id和您想要的所有其他内容,以便用户登录。 :)

我希望无论谁看到这个都可以解决问题,在我最终完成这项工作之前,我做了很多谷歌搜索。

我的建议是,在PHP中做很多“打印”和“回显”,这样你就可以看到你的问题在哪里,如果需要,可以通过插入sleep来停止代码(2); (其中2表示两秒)

祝你好运! :)

1 个答案:

答案 0 :(得分:2)

这不够,Cookie会保存在用户的浏览器中,因此每次连接时,都会检查她的Cookie并设置相应的会话。

希望这有帮助

===编辑===

这可能会对您有所帮助:http://www.pontikis.net/blog/create-cookies-php-javascript

我们说用户ID是' 12345',他正在登录 您可以使用以下命令设置Cookie:

setcookie('user_id', '12345', time() + (86400 * 30), '/');

然后,如果用户明天登录,并且他的会话已经过期,则检查他的user_id是否存在于来自cookie的数据库中:

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中添加user_id,而是使用更严格的身份验证形式,例如上次会话ID和您已生成的令牌。

=== EDIT2 ===

记得'复选框的名称?因为在这种情况下,如果未选中,则不会设置$ _POST ['记住']。因此,不应检查$ _POST ['记住']的值,而应检查它是否已设置

假设'记得'是复选框的名称:

$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);
    }
}