2012-01-24 130 views
3

我正在尋找一種方法來只刪除存儲的SESSION數據,同時保留與用戶登錄相關的會話數據。

此刻我正在通過個人取消設置聲明到我想要刪除的SESSION變量。

但是我希望有可能是一個更聰明的方法來直接刪除session數組的一個整體部分,同時保留特定變量

例如

$_SESSION['username']; 
$_SESSION['user_id']; 
$_SESSION['ttl']; 

使用情況下這個過程將是:

用戶登錄 - >用戶執行任務 - >一旦任務是與任務相關聯的完整刪除會話數據 - >用戶仍登錄!

我曾考慮過在我的數據庫監控登錄中使用表格,您對此有何看法?

謝謝你的時間!

+0

你可以for_each遍歷數組來取消除了你想要的那個之外的任何事情。另一種方法是你可以將你想要設置的$ _SESSION變量保存到一個新的數組中,並將var放回去。 – jakx

回答

3

無法刪除「SESSION數組的整個部分,同時保留特定的變量」。而不是您可以使用二維數組來處理任務並刪除該數組。

$_SESSION["task1"]["username"] = "name" 
$_SESSION["task1"]["pass"] = "pass" 

$_SESSION["task2"]["name"] = "name"; 

時TASK1完全刪除像

unset($_SESSION["task1"]); 

現在$ _SESSION [ 「任務2」]仍然存在。在一個層次

+0

簡單而有效! - 謝謝 :) – kaleeway

1

那麼你可以存儲其他鍵內的所有這種不穩定的數據:

$_SESSION['volatile'] = array(
    'one' => 'value' 
); 

如果你硝基甲苯要做到這一點,你可以使用數組進行比較的功能,如:

// specify what keys to keep 
$_SESSION = array_intersect_key($_SESSION, array('keepme1', 'keepme2', 'etc')); 

//specify what keys to remove 
$_SESSION = array_diff_key($_SESSION, array('deleteme1', 'deleteme2', 'etc')); 

至於DB你可以做到這一點,但沒有必要完成你的目標,除非有你沒有列出你原來問題ID的移動部件,否則你可能不需要做任何複雜的事情。

0

結構會話數據:

$_SESSION['loggedIn'] = TRUE; 

// Temporary session data 
$_SESSION['temporary'] = array(
    'temp_var1' => 'foo', 
    'temp_var2' => 'bar', 
    // ... 
    'temp_var99' => 'baz' 
); 

echo $_SESSION['temporary']['temp_var2']; // bar 

// Remove all temporary session data 
unset($_SESSION['temporary']); 

echo $_SESSION['loggedIn'] ? 'yes' : 'no'; // yes 
0

我將與@sathishkumar不同意,下面的方法部分破壞會話變量。

public static function destroyPartial($keys) 
{ 

    if (session_status() === \PHP_SESSION_NONE) { 
     session_start(); 
    } 

    if (!is_array($keys)) { 
     $keys = [$keys]; 
    } 
    foreach ($_SESSION as $k => $v) { 
     if (in_array($k, $keys, true)) { 
      unset($_SESSION[$k]); 
     } 
    } 



    $recoveringSession = $_SESSION; 
    session_destroy(); 
    session_start(); 
    $_SESSION = $recoveringSession; 
} 

在PHP文檔的session_destroy功能,我們可以看到這一點:

session_destroy()銷燬所有與當前 會話相關的數據。它不會取消設置任何與會話相關的全局變量,也不會取消設置會話Cookie。要再次使用會話變量 ,必須調用session_start()。

所以,「訣竅」就是在session_sttroy後面調用session_destroy。

希望這會有所幫助。