我有这个平台,您可以登录并进行测试(这是一个测试链接):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表示两秒)
祝你好运! :)答案 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);
}
}