当用户关闭浏览器时更新MySQL数据库

4
我正在开发一款研究公司的网站应用程序,其中一个要求是用户一次只能在一个设备上登录。
因此,我开发了一个相当基本的系统,当您登录时,某些PHP代码会将用户在数据库中的行从0更新为1,当您单击注销按钮时,它会再次将该行从1更新为0。
唯一的问题是,如果用户没有使用注销按钮,而是简单地关闭了浏览器,它将终止会话并注销他们,但是他们在数据库中的行不会被更新。
是否有一种方法可以在浏览器关闭时更新数据库?
3个回答

6
您可以使用“unload”事件,在该事件中发送一个ajax请求到服务端,服务端将更新mysql中的标记。您可以尝试以下jquery语法。
$(window).bind('unload', function(){
    $.ajax({
        type: 'get',
        async: false,
        url: 'path/to/file.php'
    });
});

1
@AzzyDude 现在关闭 Javascript (或者在某个页面出现 Javascript 错误)。关闭浏览器,尝试登录。这不是一个坏解决方案,但请记住,它并不是100%可靠的,就像我在回答中说的那样。 - Berry Langerak
是的,但是如果 JavaScript 被关闭,我们会有一条消息。他们无法通过关闭它来破坏我们的系统,他们的服务只会变得很差。因此,保持开启对他们有利。 - aadu
2
你如何在 PHP 端获取这个值?你会将变量设置为 $_GET 吗?然后呢? - blue

5

没有可靠的方法。您可以在页面关闭时调用JavaScript函数,该函数会向服务器发出请求,告诉它会话已结束,但是:JavaScript可能被关闭,甚至根本不执行。最好的方法是使用超时:存储最后一次操作的时间。如果超过10分钟,则“过期”会话。


是的,我们正在实现一个cronjob来做这件事。但这只是为了防止他们意外关闭浏览器,然后10分钟内无法重新进入。 - aadu

1

这里有一个简单的浏览器关闭事件解决方案。我遇到了一些关于"onunload"和"beforeonunload"事件的问题。它们会在浏览器关闭、标签关闭、任何链接点击、URL更改时被触发。因此,我将我的代码定制成这样。

 <script type="text/javascript">
        jQuery(document).ready(function() { 
          var validNavigation = false;

          // Attach the event keypress to exclude the F5 refresh
          $(document).bind('keypress', function(e) {
            if (e.keyCode == 116){
              validNavigation = true;
            }
          });

          // Attach the event click for all links in the page
          $("a").bind("click", function() {
            validNavigation = true;
          });

          // Attach the event submit for all forms in the page
          $("form").bind("submit", function() {
            validNavigation = true;
          });

          // Attach the event click for all inputs in the page
          $("input[type=submit]").bind("click", function() {
            validNavigation = true;
          }); 

          window.onbeforeunload = function() {                
              if (!validNavigation) {                            
                 var status = 'abandoned';
                    $.ajax({
                        type: "POST",
                        url: your action URL,
                        data: "status=" + status,
                        success: function(res) {
                        },
                    });
              }
          };
        }); 
    </script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接