2009-11-23 214 views
4

當用戶登錄我們的網站時,我想更改會話ID,但保留會話中的任何數據。我想有兩個原因這樣做:更改會話ID並保留數據?

  1. 爲了防止用戶帳戶是在多個地方同時使用(因爲如果兩個人使用同一個帳戶,一個的行動將破壞對方的行動) 。
  2. 讓用戶繼續他/她在另一臺計算機上所做的事情(例如從家中的計算機移動到工作)。

這些看起來似乎是矛盾的,但如果您認爲它們真的存在矛盾,那真的不是。

問題如下;要獲取當前在會話中的數據,我必須致電session_start()。這意味着我以後不能再撥打session_id()來設置新的會話ID。任何想法如何傳輸會話數據並更改會話ID。

更新:我需要能夠自己選擇會話ID。 session_regenerate_id()因此不起作用。

+0

'session_regenerate_id()'是解決方案,克萊指出。 – leepowers 2009-11-23 03:02:02

+0

您將如何檢索與工作瀏覽器連接的會話,以便在家中使用瀏覽器創建新會話? – Don 2009-11-23 03:12:19

+0

@Don:通過將會話ID設置爲該用戶可重新生成。 @ pygorex1:'session_regenerate_id()'不起作用,我需要自己選擇新的會話ID。 – 2009-11-23 03:15:49

回答

10

您可能能夠使用session_regenerate_id()

<?php 
session_start(); 

$old_sessionid = session_id(); 

session_regenerate_id(); 

$new_sessionid = session_id(); 

echo "Old Session: $old_sessionid<br />"; 
echo "New Session: $new_sessionid<br />"; 

print_r($_SESSION); 
?> 

甚至較粗略的方法威力工作:

// save the session 
session_start(); 
$session = array(); 
foreach ($_SESSION as $k => $v) { 
    $session[$k] = $v; 
} 
session_commit(); 

// create new session and copy variables 
session_id("new session id"); 
session_start(); 
foreach ($session as $k => $v) { 
    $_SESSION[$k] = $v; 
} 
+0

第一種方法應該是足夠的。 – powtac 2009-11-23 03:22:20

+0

+1也幫助我.. – 2011-03-23 02:19:36

+1

使用'$ session = $ _SESSION'然後(設置新的會話ID之後)'$ _SESSION = $ session'是錯誤的嗎? – TheFrost 2014-03-08 10:27:31

-1

或者,你可能只是能夠使用的東西像這樣:

$path=session_save_path(); 
$whatever_session_id; 

通過這些變量下一頁:

session_id()=$whatever_session_id; 
session_save_path()=$path; 

你會在新的會話ID的路徑設置到舊的會話數據.... 我不知道這是真的什麼你會想,就在這裏。

0

使用此。它把一個函數:

function update_session($newsessid = '') { 

    // Backup the current session 
     $session_backup = $_SESSION; 

    // Set current session to expire in 1 minute    
     $_SESSION['OBSOLETE'] = true; 
     $_SESSION['EXPIRES'] = time() + 60; 

    // Close the current session 
     session_write_close(); 

    // Set a new session id and start the session   
     $newSession = session_id($newsessid); 
     session_start(); 

    // Restore the previous session backup 
     $_SESSION = $session_backup; 

    // Clean up 
     unset($session_backup);     
     unset($_SESSION['OBSOLETE']); 
     unset($_SESSION['EXPIRES']);  
} 

需要時你可以這樣調用它:

update_session($customid);