2013-02-27 90 views
1

我有这个问题,或者我不知道它是如何工作的概念工作,我已经登录了记得functionallity。 我保存在cookie中,如果用户检查,所以当他再次进入该网页可以直接访问到主,而不是再次登录.. 的问题是,当用户正常登录,我在会话保存一些信息,但是当用户拥有rembmber的cookie并直接进入而没有在网站登录时会发生什么?我失去了会议信息..我必须做什么?与会话和饼干

我希望你不明白评论,我解释好,感谢您的时间!

+0

你必须检查用户如何进来,并恢复任何丢失的会话数​​据。 – 2013-02-27 21:47:11

+0

为什么使用会话?您只能使用** COOKIE **和数据库中的用户表。 - 您可以在N次'setcookie(“username”,“blanked”,time() - 3600 * 25,'/'); – 2013-02-27 21:50:36

回答

0

我假设你在会话中存储的信息数据与用户,而这又掏出某处的数据库?如果是这种情况,那么我推荐的解决方案是这样的:

当用户选择记住我选项时,您设置的cookie需要包含一个值,该值允许您在数据库中再次找到同一用户,这样您可以按照您通过登录时提供的凭据找到该用户的相同方式来实例化其会话。这很诱人(但不安全),以简单的方式做到这一点,并简单地存储用户信息的唯一数据库ID,但不要这样做!

相反,创建一个名为会话表,包含三列:USER_ID,SESSION_ID,的expire_time。当用户登录时,将“记住我”位设置为true,您将存储他们的用户ID,会话ID(可通过调用session_id()函数获得)以及您希望'记住'会话过期。

当你自己的数据添加到您的会话的用户日志,你可以调用一个类似的功能:

<?php 
    function persist_session(){ 
    $user_id  = $_SESSION['user']->id; 
    $session_id = session_id(); 
    $expire_time = time() + (60 * 60) * 24; // 24 hours 
    $sql   = "INSERT INTO sessions (user_id, session_id, expire_time), VALUES ($user_id, $session_id, $expire_time)"; 
    mysqli_query($sql); // This assuming you've already set up your DB connection and so on 
    $_COOKIE['session_id'] = $session_id; // Write the persisted session ID to a cookie 
    } 
?> 

这不是一个非常完整的例子。首先,你需要编写一些代码,以确保没有一次用户有一次以上的会话持续到表中,但这很容易......

一旦你保存了会话信息和它写入供以后参考一个cookie,从cookie找回用户信息非常简单:

<?php 
    function reinstantiate_session(){ 
     if(isset($_COOKIE['session_id')){ 
     $session_info = mysqli_fetch_object(mysqli_query("SELECT * FROM sessions WHERE session_id = '{$_COOKIE[session_id]}'")); 
     if($session_info){ 
      $_SESSION['user_id'] = $session_info->user_id; 
     } 
     } 
    } 
?> 

同样,这个例子是不是完整的,因为它可能是,你会需要处理错误,尤其是,您可能需要更新您的查找SQL以排除过期信息,但这应该足以让您开始!