我有一个用户类,由于某种原因,它有时会无缘无故地将我退出。
例如,当页面加载缓慢时,我会再次点击该链接。
这是我的班级
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.
删除会话,但我无法找到原因。有什么想法吗?