使用会话和cookie

时间:2013-02-27 21:42:07

标签: php codeigniter session cookies

我有这个问题或者我不知道它是如何工作的概念,我已经使用记住功能进行了登录。 如果用户检查它,我会保存在cookie中,所以当他再次进入时,网页可以直接访问主页而不能再次登录。 问题是,当用户正常登录时,我会在会话中保存一些信息,但是当用户拥有rembmber的cookie并且直接进入而没有在站点登录时会发生什么?我失去了那个会话信息..我要做什么?

我希望你不理解评论,我会更好地解释,谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

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

当用户选择“记住我”选项时,您设置的cookie需要包含一个值,该值允许您在数据库中再次找到该用户,这样您就可以像使用相同的方式实例化他们的会话通过登录时提供的凭据发现用户。这很容易(但是不安全),以简单的方式执行此操作,只需为您的用户信息存储唯一的数据库ID,但不要这样做!

相反,创建一个名为sessions的表,其中包含三列: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;
        }
      }
    }
?>

同样,这个例子并不像它那样完整......你会想要处理错误,特别是你可能需要更新你的find sql以排除过期的信息,但这应该是足以让你入门!