Php 会话在注销时结束,但不会在数据库中更新。。思想?

Php 会话在注销时结束,但不会在数据库中更新。。思想?,php,mysql,Php,Mysql,好的,当用户登录时,会启动一个会话,数据库中的状态会更新为“1”。 当用户注销时,会话结束,数据库中的状态更新为“0” 问题是,当用户关闭其web浏览器时,会话结束,这是完全正常的,但数据库状态未更新,这表明用户仍然在线 建议 编辑 :这是新的“在线员工”部分 每次用户访问页面时,将时间戳添加到数据库中。然后,在试图检索所有活动用户的代码中,不要包括当前时间减去时间戳大于某个值的用户 您还可以用更困难的方法来完成此操作,方法是创建一个,通过从当前时间中减去时间戳来确定用户是否仍然在线。每次用户访

好的,当用户登录时,会启动一个会话,数据库中的
状态
会更新为“1”。 当用户注销时,会话结束,数据库中的状态更新为“0”

问题是,当用户关闭其web浏览器时,会话结束,这是完全正常的,但数据库
状态
未更新,这表明用户仍然在线

建议

编辑 :这是新的“在线员工”部分


每次用户访问页面时,将时间戳添加到数据库中。然后,在试图检索所有活动用户的代码中,不要包括当前时间减去时间戳大于某个值的用户


您还可以用更困难的方法来完成此操作,方法是创建一个,通过从当前时间中减去时间戳来确定用户是否仍然在线。

每次用户访问页面时,将时间戳添加到数据库中。然后,在试图检索所有活动用户的代码中,不要包括当前时间减去时间戳大于某个值的用户


您还可以通过创建一个更为困难的方法来完成此操作,该方法通过从当前时间中减去时间戳来确定用户是否仍然在线。

基本上您有两个选项:

  • 使用javascript在卸载事件时触发并调用ajax来更新数据库这不是一个100%可实现的选项,因为如果javascript被关闭,或者由于某种原因无法运行,您的ajax将不会被执行
  • 最好的方法是存储用户最后一次操作的时间。如果超过X分钟前,您可以更新数据库
  • 编辑:

    关于方法2:

    逻辑是这样的:当您与登录的用户启动任何会话时,您必须使用当前时间更新数据库(如果您使用的是timestamp,则可以使用mysql NOW()),并检查用户的状态是否已经为1

    之后,当您需要检查用户状态是0还是1时,您将检查状态为1的所有用户的最后一个活动。如果这个时间超过X分钟,您可以考虑此用户离线,并将状态更新为0。
    这只是众多方法中的一种。如果您在应用时遇到任何问题,请在评论中告诉我,我将更新我的答案。

    基本上,您有两种选择:

  • 使用javascript在卸载事件时触发并调用ajax来更新数据库这不是一个100%可实现的选项,因为如果javascript被关闭,或者由于某种原因无法运行,您的ajax将不会被执行
  • 最好的方法是存储用户最后一次操作的时间。如果超过X分钟前,您可以更新数据库
  • 编辑:

    关于方法2:

    逻辑是这样的:当您与登录的用户启动任何会话时,您必须使用当前时间更新数据库(如果您使用的是timestamp,则可以使用mysql NOW()),并检查用户的状态是否已经为1

    之后,当您需要检查用户状态是0还是1时,您将检查状态为1的所有用户的最后一个活动。如果这个时间超过X分钟,您可以考虑此用户离线,并将状态更新为0。
    这只是众多方法中的一种。如果您在应用此功能时遇到任何问题,请在评论中告诉我,我将更新我的答案。

    您还可以添加一个JavaScript小部件,每隔几分钟左右将keepalive消息ping回服务器,如果您没有每隔几分钟左右收到一条消息,则可以添加autokill会话,但这会增加服务器上的负载,也可能会导致那些经历过断断续续的互联网连接的用户的会话丢失


    归根结底,无法保证当用户关闭浏览器时,您会收到通知。您可以使用多种策略来增强检测关闭浏览器的能力,但聪明的用户甚至配置异常的浏览器都会阻碍这些策略。最佳实践是使用合理的会话超时值。如果用户一小时内什么都不做,他们可能已经对你的网站失去了兴趣,让他们的会话无限期地打开以便他们回来的效用逐渐减少到零。

    你还可以添加一个JavaScript小部件,每隔几分钟左右将一条keepalive消息ping回服务器,如果你没有每隔几分钟收到一条这样的消息,则自动终止会话几分钟左右,但这会增加服务器上的负载,也可能会导致用户的会话丢失,这些用户经历了断断续续的互联网连接


    归根结底,无法保证当用户关闭浏览器时,您会收到通知。您可以使用多种策略来增强检测关闭浏览器的能力,但聪明的用户甚至配置异常的浏览器都会阻碍这些策略。最佳实践是使用合理的会话超时值。如果用户在一个小时内什么都不做,他们可能对你的网站失去了兴趣,让他们无限期地打开他们的会话以让他们回来的效用逐渐减少到零。

    除非你有100%可靠的方法来判断用户何时关闭他们的浏览器,否则你无法检测到这种情况何时发生,并且您唯一的选择是在延迟一段时间后使服务器端会话数据过期。除非您有100%可靠的方法来判断用户何时关闭浏览器,否则您无法检测何时会发生这种情况,并且您唯一的选择是在延迟一段时间后使服务器端会话数据过期。是否(超过)必须通过MYSQL中的触发器运行?我希望字段
    <?php
    include 'connection.php';
    
    $query = "SELECT * FROM Admins WHERE AdminLevel>='1' AND Status='1'";
    $result = mysqli_query($connect,$query);
    
    
    echo "
      <table class='table-fill'>
        <thead>
          <tr>
            <th class='text-left' style='padding-left: 12px; padding-right: 12px;';></th>
          </tr>
        </thead>
        <tbody class='table-hover'>";
    
        if (($result->num_rows) >= 1) {
            $results = mysqli_fetch_array($result);
            $currentTime = NOW();
            while ($results) {
                $visitTime = $results['LastVisited'];
                $interval = ($visitTime->diff($currentTime))->minutes;
                if ($interval<=15) {
                    if ($results['AdminLevel'] == 3){
                        $rank = 'In-Training/Intern';
                    }elseif ($results['AdminLevel'] == 6){
                        $rank = 'Community Moderator';
                    }elseif ($results['AdminLevel'] == 9){
                        $rank = 'Senior Moderator';
                    }elseif ($results['AdminLevel'] == 12){
                        $rank = 'Supervisor';
                    }elseif ($results['AdminLevel'] == 15){
                        $rank = 'Administrator';
                    }elseif ($results['AdminLevel'] == 18){
                        $rank = 'Senior Administrator';
                    }elseif ($results['AdminLevel'] == 21){
                        $rank = 'Staff Advisor';
                    }elseif ($results['AdminLevel'] == 24){
                        $rank = 'Engineer';
                    }elseif ($results['AdminLevel'] == 27){
                        $rank = 'Vice Chairman';
                    }elseif ($results['AdminLevel'] == 30){
                        $rank = 'Chairman';
                    }elseif ($results['AdminLevel'] == 33){
                        $rank = 'Website Engineer';}
                    echo "<tr>";
                    echo "<td>" . $results['Username'] . " - " . $rank . "</td>";}
                }
    
        }else{
            echo "<tr>";
            echo "<td>" . 'There are no staff members online.' . "</td>";
        }
    
        echo " </tbody>
      </table>";