用户类,会话无理由删除

时间:2016-06-14 14:49:34

标签: php mysql session

我有一个用户类,由于某种原因,它有时会无缘无故地将我退出。

例如,当页面加载缓慢时,我会再次点击该链接。

这是我的班级     

    public function __construct( $mysqli ) {
        $this->mysqli = $mysqli;
        $this->table = 'users';
        if( isset( $_SESSION['user_id'] ) ) {
            $this->checkSession();
            if( isset( $_SESSION['user_id'] ) ) {
                $this->log('<span class="log_blue">__construct okay</span>');
                $this->user_id = $_SESSION['user_id'];
            }
            else {
                $this->log('<span class="log_blue">__construct not okay</span>');
                $this->logout();
            }
        }
        else {
            $this->user_id = 0;
        }
    }

    public function checkSession() {
        $this->log('<span class="log_blue">Checking session...</span>');
        $selection = $this->mysqli->query( 'SELECT', $this->table.'_logged_in', array('session_id', 'token'), 'WHERE user_id=? AND user_agent=?', array( $_SESSION['user_id'], $_SERVER['HTTP_USER_AGENT'] ) );
        if($selection) {
            if( session_id() == $selection[0]['session_id'] and $_SESSION['token'] == $selection[0]['token']) {
                $this->log('<span class="log_blue">Session is okay. Refreshing session.</span>');
                $this->refreshSession();
                return true;
            }
        }
        else {
            $this->log('<span class="log_blue">Session is not okay, deleting session.</span>');
            $this->logout();
        }
    }
    private function refreshSession() {
        session_regenerate_id();
        $token = $this->createToken();
        $_SESSION['token'] = $token;
        $this->mysqli->query( 'UPDATE', $this->table.'_logged_in', array( 'token'=>$token, 'session_id'=>session_id(), 'session_time'=>time() ), 'WHERE user_id=? AND user_agent=?', array( $_SESSION['user_id'], $_SERVER['HTTP_USER_AGENT'] ) );
        return true;
    }
    public function logout() {
        @session_start();
        $this->log('<span class="log_blue">Deleting session.</span>');
        if( isset( $_SESSION['user_id'] ) ) 
            $this->mysqli->query( 'DELETE', $this->table.'_logged_in', '', 'WHERE user_id=? AND user_agent=?', array( $_SESSION['user_id'], $_SERVER['HTTP_USER_AGENT'] ) );
        unset( $_SESSION['token'], $_SESSION['user_id'] );
        session_destroy();
        $this->user_id = 0;
        return true;
    }

?>

请注意,我使用一个类来处理我的查询,有关信息,查询函数看起来像这样

public function query( $method, $table, $data='', $where_text='', $where_data='' ) {

要调试问题,我已将日志添加到用户类($this->log())。这导致:

Checking session...
Session is okay. Refreshing session.
Checking session...
Session is okay. Refreshing session.
Checking session...
Session is okay. Refreshing session.
Checking session...
Deleting session.

删除会话,但我无法找到原因。有什么想法吗?

0 个答案:

没有答案