2012-09-13 38 views
3

我正在爲研究公司開發Web應用程序,其中一項要求是用戶一次只能登錄一臺設備。用戶關閉瀏覽器時更新MySQL數據庫

所以我開發了一個非常基本的系統中,當您登錄一些PHP在數據庫中更新了用戶的行從0到1,當您單擊註銷按鈕,它再次更新該行從1到0

唯一的問題是,如果用戶不使用註銷按鈕並簡單地關閉瀏覽器,它將結束會話並註銷它們,但它們在數據庫中的行不會被更新。

有沒有辦法更新瀏覽器關閉數據庫?

回答

4

您可以使用卸載事件,您將發送一個ajax請求到服務器,該服務器將更新mysql中的標誌。您可以嘗試遵循jQuery語法。

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

      }); 
     }); 
+0

這有效!那很完美!!謝謝! – AzzyDude

+1

@AzzyDude現在關閉JavaScript(或在某個頁面上有javascript錯誤)。關閉瀏覽器。嘗試登錄。這不是一個糟糕的解決方案,但請記住,它不是100%可靠的,就像我在答案中所說的那樣。 –

+0

是的,但如果JavaScript已關閉,我們會收到一條消息。他們不能打破我們的系統,他們的服務只是廢話。所以保持它的利益是符合他們的利益的。 – AzzyDude

5

沒有可靠的方法。您可以在頁面關閉時調用一個javascript函數,然後將請求發送到您的服務器,告訴它該會話已完成,但是又一次:javascript可能關閉,甚至可能根本不執行。你最好的辦法是與超時工作:存儲最後一次操作的時間。如果超過10分鐘,則「過期」會話。

+0

是的,我們正在爲此執行cronjob。但是,如果他們不小心關閉了瀏覽器,那麼他們無法再回到10分鐘。 – AzzyDude

1

這是一個簡單的瀏覽器關閉事件解決方案。我遇到了一些關於「onunload」和「beforeununload」事件的問題。它將在瀏覽器關閉,標籤關閉,任何鏈接點擊,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> 
相關問題