Thinkphp下如何处理用户单设备登陆

Thinkphp下如何处理用户单设备登陆

注意这个问题不是单点登陆,而是当一个用户登陆时,同一个账号登陆要踢掉前面已登陆的账号

思路

  • 首先将默认的session写入数据库
    • 最初处理这块出了很多问题,换成Thinkphp最新的包就解决了,估计是原来引用的Thinkphp版本太老
    • 另外本机的php版本太高缺少mysql驱动,要在conf中设置为mysqli
    • 同理’SESSION_TYPE’ => ‘Mysqli’,这里也要设置成Mysqli 也就是ThinkPHP\Library\Think\Session\Driver\Mysqli.class.php 这个文件,如果没有就去找最新版本的库吧。
  • 加入userid
    • 改动数据库脚本加入userid字段
    • 调试时本希望在Mysqli.class.php的write方法中获取这个值,结果反序列化总是不成功,于是改为登陆时手动写入数据库
    • 不确定write方法的触发条件,而且该sql脚本并不是更新,而是每次都执行了整行替换,因此需要在replace into之前取到userid。嵌入select的方式没成功,估计是某一步被抹掉了。换手动查询,成功写入。
  • 登陆处理
    • 删除已经登陆的user session
    • 设置当前session的user

代码

Mysqli

    public function write($sessID, $sessData)
    {
        $hander = is_array($this->hander) ? $this->hander[0] : $this->hander;
        $expire = time() + $this->lifeTime;

        $userid=null;
        $res = mysqli_query($hander, "SELECT user_id FROM " . $this->sessionTable . " WHERE session_id = '$sessID' ");
        if ($res) {
            $row = mysqli_fetch_assoc($res);
            $userid = $row['user_id'];      
        }

        if($userid){            
            mysqli_query($hander, "REPLACE INTO  " . $this->sessionTable . " (  session_id, session_expire, user_id, session_data)  VALUES( '$sessID', '$expire','$userid','$sessData')");
        }
        else{
            mysqli_query($hander, "REPLACE INTO  " . $this->sessionTable . " (  session_id, session_expire, session_data)  VALUES( '$sessID', '$expire','$sessData')");
        }       
        if (mysqli_affected_rows($hander))
            return true;
        return false;
    }

登陆

    $sess = M("session");
    $sess->where('user_id='.$id)->delete();
    $sess->where("session_id='%s'",session_id())->setField('userid', $id);

搞定

你可能感兴趣的:(php,thinkphp,php,session,数据库)