2009-08-23 14 views
2

我正在做一個簡單的聊天腳本,我有killSession函數殺死當前會話並從數據庫中刪除用戶。問題是,名稱設置和驗證後,聊天表單不會加載,它只會殺死會話並返回到loginForm()。這裏的腳本:

<?php 
if (!isset($_SESSION['name'])) { 
    loginForm(); // set a name for chat 
} else { 
?> 
    // chat form 

    $(window).unload(function() { 
     <?php killSession(); ?> 
    }); 

是否有一種方法來觸發killSession()只有刷新或關閉頁面後?

UPDATE:

還是無法弄明白。也許我需要休息一下。

$(window).unload(function() { 
    $.get("killSession.php", { name:"test" }); // i set the name to test for testing 
}); 

這裏的killSession.php頁:

session_start(); 
function killSession($name) { 
    include("config.php"); 
    mysql_query("DELETE FROM sessions WHERE name='$name'"); 
    session_destroy(); 
    header("Location: index.php"); 
} 

killSession($_GET['name']); 

的$不用彷徨仍不能正常工作,所以我想它separatly通過瀏覽器。 killSession.php?name = test將從數據庫中刪除,但不會終止會話。

+0

你忘了調用'killSession'函數。你聲明瞭這個函數,但它沒有被調用。您還應該通知自己有關SQL注入。 – Gumbo 2009-08-23 17:55:10

+0

啊,對不起,我忘了在這裏添加它。 killSession($ _ GET ['name']); – Norbert 2009-08-23 18:43:57

+0

修復了會話問題,所以現在killSession.php?name = test會正常工作。現在唯一的問題是$ .get不執行php代碼。 – Norbert 2009-08-23 18:51:06

回答

5

當調用PHP函數killSession時會話立即中斷。所以,只要它被執行,你的代碼就會終止會話。

您需要做的是僅在觸發onunload事件時調用PHP函數killSession。用JavaScript調用PHP函數只能向服務器發送一個新請求。

所以,你需要發送一個請求到一個腳本,然後調用killSession功能,也許是這樣的:

$(window).unload(function() { 
    $.get("killSession.php"); 
}); 

而且killSession.php裏面,你再調用PHP函數killSession

+0

+1 - 簡單的想法,但我可能永遠不會想到它。 – karim79 2009-08-23 16:59:20

+0

它似乎沒有工作。我在卸載過程中發出了警報,以檢查是否存在問題,但我認爲從頁面獲取呼叫時遇到問題。 – Norbert 2009-08-23 17:05:55

+0

你如何傳遞會話ID?如果是每個網址,那麼您需要將該會話ID添加到該JavaScript代碼中的網址中。 – Gumbo 2009-08-23 17:16:15

0

我建議隱藏的iframe調用PHP殺會話腳本或AJAX的HttpRequest GET方法

1

請求不工作,因爲它是異步,這意味着你的JavaScript不必等待服務器。提出請求的同步會爲一個響應的JavaScript等待:

$(document).ready(function() 
{ 
    $(window).unload(function() 
    { 
     $.ajax 
     ({ 
      type: "GET", 
      url: "killSession.php", 
      async: false, 
      data: "name=test", 
      success: function(msg) 
      { 
       alert(msg); 
      }, 
      error: function(XMLHttpRequest, textStatus, errorThrown) 
      { 
       alert("I failed"); 
      } 
     }); 
    }); 
}); 

關於Ajax:

我假設你認爲只要你撥打地點:在PHP(每AJAX)的index.php。瀏覽器將在那裏重定向。事實上,Ajax並沒有這樣做,它完全相反,它完全繞過了瀏覽器。這是什麼讓阿賈克斯如此有用。您在index.php中回覆的所有內容都是jQuery從請求接收的內容。你需要用它做點什麼。我只是以我的片段作爲示例提醒它。我也使用錯誤來查看請求是否失敗。你可能也想看看firebug。您可以使用控制檯選項卡查看您的所有ajax請求。

PS:您可能還想在第一個php腳本中啓動會話。

+0

我刪除了$(window).unload(function(){}並且只保留了$ .get,它工作正常,它也適用於你的解決方案 那麼我怎樣才能讓腳本只在頁面執行重新加載/關閉? – Norbert 2009-08-24 10:13:30