【问题标题】:Updating MySQL database when user closes browser用户关闭浏览器时更新 MySQL 数据库
【发布时间】:2012-09-13 09:40:44
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php mysql


    【解决方案1】:

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

    $(window).bind('unload', function(){
        $.ajax({
            type: 'get',
            async: false,
            url: 'path/to/file.php'
        });
    });
    

    【讨论】:

    • @AzzyDude 现在关闭 javascript(或在某些页面上出现 javascript 错误)。关闭浏览器。尝试登录。这不是一个糟糕的解决方案,但请记住,它不是 100% 可靠的,就像我在回答中所说的那样。
    • 是的,但是如果 JavaScript 关闭,我们会收到一条消息。他们不能在关闭它的情况下破坏我们的系统,他们的服务只会是垃圾。因此,继续这样做符合他们的利益。
    • 如何在 php 端获取这个值?您是否将变量设置为 $_GET .. 然后呢?
    【解决方案2】:

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

    【讨论】:

    • 是的,我们正在为此实施一个 cronjob。但万一他们不小心关闭了浏览器,10分钟后就进不去了。
    【解决方案3】:

    这是浏览器关闭事件的简单解决方案。我遇到了“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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多