2010-07-05 57 views
5

當用戶離開特定頁面時,我需要銷燬會話。我在頁面的末尾使用了session_destroy(),但對我來說不可行,因爲我的頁面已分頁。我的網頁是:abc.php?page=1abc.php?page=2abc.php?page=3在頁面離開時銷燬PHP會話

因此,當用戶離開abc.php頁面時,我需要銷燬一個會話。我怎樣才能做到這一點,而不使用cookie?

+4

[關閉/關閉瀏覽器或選項卡時關閉會話]的可能重複(http://stackoverflow.com/questions/1921941/close-kill-the-session-when-the-browser-or-tab -is-closed) – Quentin 2010-07-05 05:35:02

+0

thx bro.but它的一個asp解決方案。我沒有從它得到任何東西....我如何保持活動我的會話,直到用戶訪問我的網頁abc.php.when用戶離開abc.php然後只是銷燬會話。 – riad 2010-07-05 05:45:26

+0

實際上,鏈接線程中的第一個答案是正確的,並不是所有ASP特定的。 – deceze 2010-07-05 06:34:35

回答

18

當用戶從頁面導航離開頁面時做些事情是錯誤的方法,因爲您不知道用戶是否會導航到一個完全不同的頁面(爲了參數而說contact.php)或他/她將會進入abc.php的下一頁,正如Borealid指出的那樣,如果沒有JS,你就無法做到。相反,你可以簡單地增加一個檢查,看看用戶從abc.php來

首先,在你abc.php文件中設置的$ _SESSION數組中的唯一變量,它作爲一個標誌,該用戶已經在此頁:

$_SESSION['previous'] = basename($_SERVER['PHP_SELF']); 

然後,添加這個在所有頁面上,之前的任何輸出來檢查,如果用戶從abc.php來:

if (isset($_SESSION['previous'])) { 
    if (basename($_SERVER['PHP_SELF']) != $_SESSION['previous']) { 
     session_destroy(); 
     ### or alternatively, you can use this for specific variables: 
     ### unset($_SESSION['varname']); 
    } 
} 

這樣,您會破壞會話(或特定的變量)只有當用戶是來自abc.php 當前頁面是不同的。

我希望我能夠清楚地解釋這一點。

+0

Thx bro的作品...但他們有一個問題。如果我不是來自abc.php頁面,會話存儲不同的數據..很多非常感謝您的解決方案... – riad 2010-07-05 06:23:11

+0

如果有數據要保留在會話數組中,那麼不要完全摧毀它,你可以簡單地使用'unset($ _ SESSION ['varname']);''而不是'session_destroy()'來取消設置在abc.php上的變量,就像Karthik指出的那樣。 – 2010-07-05 06:28:19

+0

不是非常用戶友好。如果我在另一個選項卡中打開另一個頁面,但仍想同時繼續使用'abc.php',該怎麼辦? – deceze 2010-07-05 06:47:56

0

對於你需要摧毀會話特定頁面,則取消設置的所有會話變量 使用

unset($_SESSION['varname']);

對於整個網站,你可以使用session_destroy();

+0

沒有兄弟。如果我在頁面末尾取消設置或銷燬變量,那麼我無法在第二個或第三個頁面上獲取值abc.php?page = 2或3.所以我必須使用會話,直到用戶離開我的abc.php頁。 我該怎麼做? – riad 2010-07-05 05:41:50

4

要觸發當用戶實際離開頁面,您必須使用Javascript向服務器發回異步請求。服務器無法神奇地知道用戶已經「離開」一個頁面。

請參閱http://hideit.siteexperts.com/forums/viewConverse.asp?d_id=20684&Sort=0

+0

感謝兄弟爲你的答..但我的網頁是爲移動用戶,所以我不能使用javascript..is它可以解決只能使用PHP? – riad 2010-07-05 05:48:57

0

我解決了這個問題。首先取當前url然後chk留在當前url上的頁面。如果頁面不在當前url中,那麼就銷燬會話。

$url = "http" . ((!empty($_SERVER['HTTPS'])) ? "s" : "") . "://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; 
$page_name="abc.php";  
if (!preg_match("/$page_name/",$url)) 
{ 
    session_destroy(); 
} 

但此代碼應在另一個pages.Because HTTP使用是一個無狀態的流程,這樣沒有辦法找到當用戶離開網頁。

+0

您實際上只能使用'$ _SERVER ['REQUEST_URI']'因爲這是文件名的位置。如果所有頁面都有一個header.php文件(因爲這是常見的做法),您可以簡單地使用我的解決方案,而不是在所有頁面中添加代碼* EXCEPT * abc.php。 – 2010-07-05 06:23:47

+1

如果您不打算將它放在'abc.php'上,那麼使用該代碼就沒有意義了。我不知道http與無狀態有什麼關係。即使你不離開'abc.php',你仍然遇到與FreekOne的答案一樣的問題,會話數據被破壞。 – 2010-07-05 06:47:44

0

當用戶從頁面導航遠離時,無法判斷何時可靠。

你可以做的最好的事情就是利用cookies的工作方式。開始會話時,您要向客戶端發送一個cookie,以識別每次後續訪問中的客戶端,並因此激活關聯的會話。客戶在隨後的訪問中發送此標識,由客戶「忘記」他的身份。

您可以指示客戶端只發送特定頁面的cookie,並且可以指示他在關閉瀏覽器(終身爲0)時忘記cookie。這可以使用session_set_cookie_params進行設置。

除此之外,您可以簡單地忽略它們無關緊要的頁面上的會話參數。您可以在一段時間不活動後刪除會話(或其某些值),當您假設客戶端已離開時

+0

這是我想去的地方。問題:如何在閒置一段時間後刪除會話?與上述用戶導航_from_的方法類似,但現在使用時間戳?像:$ _SESSION []中的時間戳是10分鐘,所以過期了? – Jens 2012-11-05 01:35:30

0

Borealid值得稱讚指向最優雅的解決方案。

更多kludgey解決方案是在頁面上保留一個指向另一個「監視器」頁面的iframe,該頁面每隔幾秒刷新一次。這可以在不使用JavaScript的情況下完成:

<meta http-equiv="refresh" content="10"> 

這會每隔10秒刷新一次監視頁面。發生這種情況時,監控頁面可以記錄服務器某處(DB或文件)的時間(覆蓋以前記錄的時間)和會話ID。

然後,您將不得不創建一個cronjob,該文件檢查文件/數據庫以查找超過10〜12秒的任何會話並手動刪除它們。會話數據通常存儲在名爲sess_the-session-ID的文件中(由您的PHP配置指定)。你可以使用PHP函數是這樣的:

function delete_session($sessId) { 
    $sessionPath = session_save_path(); 
    // you'll want to change the directory separator if it's a windows server 
    $sessFile = "$sessionPath/sess_$sessId"; 
    if (file_exists($sessFile) && unlink($sessFile)) return true; 
    return false; 
} 
1

我也有類似的問題,但我的是在重新加載頁面,我想,我已經印刷被破壞的變量。這是我的網頁設計類的登錄,如果用戶輸入錯誤的用戶名或密碼,我正在進行錯誤反饋。我可以得到錯誤顯示,但如果我點擊刷新頁面,他們的錯誤就會停留在那裏。我發現只要將變量設置爲無,打印後就會殺死它。看看我做了什麼:

<p>To access my website please Login:</p> 
<form name='login' action="./PHP_html/PHP/login.php" method='post'> 
Username: <input type='text' name='username' /><div><?php print $_SESSION['baduser']; $_SESSION['baduser'] = "";?></div><br /> 
<div style="padding-left: 4px">Password: <input type='password' name='password' /><div><?php print $_SESSION['badpass']; $_SESSION['badpass'] = "";?></div></div> 
<input type='submit' value='Login' /> or you can <a href="./Terms.php">Register</a> 

我不知道這是否有幫助,但它對我有用。

此外,感謝您在類似網站上發佈的所有內容,以幫助我們仍在學習的人。