在浏览器强制关闭或会话过期后更改数据库的登录状态

辛迪

我在MySQL中有一个用户登录数据,条件是用户在会话中只能登录1次。如果使用注销按钮,代码运行良好,但是如果用户关闭浏览器

// user_table in MySQL
   user_id      user_username      user_password      is_login
     1              xyzabc             xxxxx             0  // 0 is not
     2              abcdef             xxxxx             1  // 1 is login
     3              efghij             xxxxx             1

我曾经is_login阻止来自第二个登录用户的访问。因此,每个帐户只能登录一次,而is_login我们曾经在设置is_login为的情况下阻止用户登录会话0

// Inside my login function
public function login()
{
   ... some validation login code ...
   // User ID accepted & login = TRUE
   $this->session->set_userdata('id', $data->user_id);
   // this query is in model, I just copy it to here
   $this->db->query('UPDATE user_table SET is_login = "1" WHERE user_id = ".$id."');
   $this->session->sess_expiration = 7200;
   $this->session->sess_expire_on_close = TRUE;
}

// Logout function in controller
public function logout() {
   $id = $this->session->userdata('id');
   // this query is in model, I just copy it to here
   $this->db->query('UPDATE user_table SET is_login = "0" WHERE user_id = ".$id."');
   $this->session->sess_destroy();
}

如果使用logout功能注销了用户,则代码运行良好。

is_login列将0再次打开但是如果浏览器强制关闭is_login状态仍为1有什么办法吗?

穆罕默德·阿里
  1. 如@Tpojka所示,将is_login列更改为INT(11)
  2. 在用户表中添加另一列以显示上一次用户活动
  3. 如果当前系统时间和上一次用户活动大于到期时间,则将cronjob添加到SET is_login = 0
  4. 每当用户登录时,将php中的time()值存储到数据库中
  5. 将相同的login time()值存储到用户会话中。因此,每次用户刷新页面时,请检查与DB会话时拥有的值,以了解该用户是否相同。如果不是,请注销用户并销毁该用户。这可能意味着该用户是从其他设备登录的,因此他/她应该从当前浏览器中退出
  6. 每当用户发送请求并且is_login值与您在DB中拥有的值匹配时,就可以在用户会话中添加和更新另一个值。例如dte_last_activity,那么您可以了解用户的会话是否已过期。不要依赖服务器的会话到期时间,因为您可能需要不同的到期时间。

好的,假设我们有一个如下的用户表:

 CREATE TABLE IF NOT EXISTS `system_users` (
   `id` smallint(5) unsigned NOT NULL,
   `fullname` varchar(90) COLLATE utf8_persian_ci NOT NULL,
   `username` varchar(40) COLLATE utf8_persian_ci NOT NULL,
   `password` varchar(32) COLLATE utf8_persian_ci DEFAULT NULL,
   `dte_login` int(11) unsigned NOT NULL DEFAULT '0',
   `dte_activity` int(11) unsigned NOT NULL DEFAULT '0',
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;

dte_login是我们每次在用户登录时都会设置到数据库中的时间戳记值dte_activity是用户最后一次从您的服务器请求某项内容时的时间戳记值,当然,他已经登录

请注意,仅在需要检查用户是否仍处于活动状态时才需要dte_activity

function login($username, $password) {
    $result = false;

    // Check from DB that the username and password is valid or not
    // IF user is valid, retrieve user_id from DB
    If (USER_IS_VALID) {
        $_SESSION['user_id'] = $user_id;
        $_SESSION['dte_activity'] = time();
        $_SESSION['dte_login'] = time();

        $result = true;
    }

    return $result;
}

现在,只要用户要求访问页面,您就可以调用一个示例函数,如下所示:

function checkLogin() {
    $result = false;

    if (!empty($_SESSION['user_id'])) {
         // This means that somebody is already logged in
         $user_id = $_SESSION['user_id'];
         $dte_login = $_SESION['dte_login'];

         // We need to check if the user which is login is the same as the last user that used our website so we compare the dte_login value that we stored in session with what we have in DB
         $db_connection->query("SELECT `id` FROM `system_users` WHERE `id`={$user_id} AND `dte_login`={$dte_login};");             
         // If the above query return no result, it means that someone else logged in meanwhile and we have to log out the current user 

         if ($db_connection->num_rows>0) {
             // Now we need to check if his/her session is still valid or not
             $EXPIERY = 300; // in seconds (in this case, 5 minutes) 
             $now = time();
             if ($now-$_SESSION['dte_activity']<$EXPIERY) {
                 // The user session is still valid and we need to update database
                 $db_connection->query("UPDATE `system_users` SET `dte_activity`={$now} WHERE id={$user_id};");
                 $_SESSION['dte_activity'] = $now;

                 $result = true; // Means that someone is active
             } else {
                 session_destroy();
             }
         } else {
             session_destroy();
         }
    }

    return $result;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

更改数据库更新后的ListView

关闭浏览器时会话丢失

Laravel-验证会话在浏览器关闭后不会过期

当浏览器关闭时,PHP会话Cookie会过期

如果用户关闭浏览器,则从数据库中删除数据

关闭我的SQL错误的数据库浏览器建议

FormsAuthenticationTicket:关闭浏览器后如何保持用户登录?

强制在每个新的浏览器会话上登录用户?

ReactJS检查数据库中的更改并更新组件,而无需刷新浏览器

更改数据库服务器上现有SQL用户的登录名(Windows用户)

当浏览器在MVC中关闭时,阻止会话过期

关闭浏览器后,如何阻止Gmail保持登录状态?

Rails 4:当浏览器关闭时,会话值永远不会“过期”或消失

关闭浏览器时的会话超时

即使在yii中关闭浏览器后也自动登录

更改型号后如何更改数据库?

从MySQL数据库获取后,在浏览器中永久显示html表单输入吗?

数据库错误-仅在某些浏览器中

关闭浏览器窗口后,如何防止Google Chrome浏览器删除会话Cookie?

Web浏览器的数据库服务器

SQL:删除内容后如何更改数据库?

关闭浏览器时是否需要明确关闭数据库,尤其是在使用同步时?

express-session 在浏览器关闭时更改会话

浏览器关闭时会话到期

Sqlite 新记录 GUI 的数据库浏览器

浏览器关闭后 ASP.NET Core Auth 未保持登录状态 (Azure AD B2C)

NodeJS 不返回状态代码但更改数据库

QSqlTableModel:构建后更改数据库

更改数据库后如何立即渲染组件