如何使用相同的帐户PHP

时间:2018-03-12 14:08:34

标签: php codeigniter-3

晚上好。我正在开发一个网站,其中存在一个约束,其中不允许在具有相同帐户的不同计算机中进行多次登录。我可以使用codeigniter实现这一目标吗?如果不?我该如何解决这个问题。谢谢!

1 个答案:

答案 0 :(得分:0)

我是如何处理项目中的问题的:

  1. 我登录后抓取了用户的会话ID并将其存储在数据库中。

  2. 每当用户登录时,您都会获取存储在数据库中的会话ID并销毁它。

  3. 这将确保无论何时从其他浏览器或计算机登录,他们的上一个会话都将被销毁。

    以下是登录页面上的一些示例代码:

    session_commit();
    session_id(session_create_id());
    session_start();
    //followed by other code
    

    使用session_create_id函数将创建一个唯一的会话ID,因为它会检查它所创建的会话ID是否存在。

    下一步:

    $query = "UPDATE user_table SET sess_id = ? WHERE id = ? AND sess_id = '0'";
    
    $query_run = $database->prepare($query);
    
    if($query_run->execute([session_id(), $user_id])):
        if($query_run->rowCount() < 1){
            $query = "SELECT sess_id FROM user_table WHERE id = ?";
    
            $query_run = $database->prepare($query);
    
            if($query_run->execute([$user_id])){
                //custom session destroy function
                session_destroy_client($query_run->fetchAll()[0]['sess_id']);
    
                $query = "UPDATE user_table SET sess_id = ? WHERE id = ?";
                $query_run = $database->prepare($query);
                $query_run->execute([session_id(), $user_id]);
            }
        }
    endif;
    

    让sess_id的默认值为零。每当用户注销时将其设置为零。但无论何时登录,您仍需要检查他们是否在数据库中存储了会话ID,然后销毁该会话。这就是自定义销毁会话的样子:

    function session_destroy_client(string $id){
            // 1. commit session if it's started.
            if (session_status() != \PHP_SESSION_ACTIVE) {
                session_write_close();
            }
            ini_set('session.use_strict_mode', 0);
            // 2. store current session id
            session_start();
            $cid = session_id();
            session_write_close();
    
            // 3. hijack then destroy session specified.
            session_id($id);
            session_start();
            session_destroy();
            session_write_close();
    
            // 4. restore current session id. If you don't restore it, your current session will refer to the session you just destroyed!
            session_id($cid);
            session_start();
        }
    

    那应该有用。如果您愿意,可以将自定义函数添加到类中,并添加适合您需要的功能。