4

我正在为一家研究公司开发一个 Web 应用程序,其中一个要求是用户一次只能在一台设备上登录。

所以我开发了一个非常基本的系统,当你登录一些 PHP 时,将数据库中的用户行从 0 更新为 1,当你单击注销按钮时,它再次将该行从 1 更新为 0。

唯一的问题是,如果用户不使用注销按钮而只是关闭浏览器,它将结束会话并将它们注销,但它们在数据库中的行不会被更新。

有没有办法在浏览器关闭时更新数据库?

4

3 回答 3

6

您可以使用 unload 事件向服务器发送 ajax 请求,该请求将更新 mysql 中的标志。您可以尝试以下 jquery 语法。

$(window).bind('unload', function(){
    $.ajax({
        type: 'get',
        async: false,
        url: 'path/to/file.php'
    });
});
于 2012-09-13T09:44:06.070 回答
5

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

于 2012-09-13T09:44:55.183 回答
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>
于 2014-06-06T05:34:36.063 回答