2010-10-07 49 views
2

我完全失去了單詞。SESSION變量在摧毀了其餘的頁面後不能從頁面傳遞

我允許管理員在過程中遇到錯誤時重置其註冊。理論上,下面的代碼應該像這樣運行:

頁面已到達,$ adminvalidated根據會話數據設置。 $ _SESSION數組被清除;在客戶端清除cookie;會話標識被注入,會話被銷燬。然後會話重新啓動,並且之前提到的變量被放回到Session中。

下面包含的「echo」語句工作,但當我重定向到另一個頁面(註釋如下)時,會話變量不會繼續。

是的我也開始了後續頁面的會話。

<?php 
    session_start(); 
    ob_start(); 
    if($_SERVER['SERVER_PORT'] == 80) { 
     header('Location:https://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"]); 
     die(); 
    } 

    $adminvalidated = $_SESSION['ADMINVALIDATED']; 

    $_SESSION = array(); 

    if (ini_get("session.use_cookies")) { 
     $params = session_get_cookie_params(); 
     setcookie(session_name(), '', time() - 42000, 
      $params["path"], $params["domain"], 
      $params["secure"], $params["httponly"] 
     ); 
    } 

    session_regenerate_id(true); 
    session_destroy(); 
    session_start(); 

    $_SESSION['ADMINVALIDATED'] = $adminvalidated; 

    echo $_SESSION['ADMINVALIDATED']; 

/* 
    header("Location: ../a.php"); 
    exit;*/ 
?> 

回答

1

通常,只需撥打session_regenerate_id(true)即可更改當前會話的會話ID,從而使與前一會話ID的關聯無效。

如果您還想要清除除$_SESSION['ADMINVALIDATED']任何會話數據,只是這樣做:

session_regenerate_id(true); 
$_SESSION = array(
    'ADMINVALIDATED' => $_SESSION['ADMINVALIDATED'] 
); 
1

From the manual page of session_start

自PHP 4.3.3,呼籲在session_start()會議後,先前啓動將導致一個E_NOTICE級別的錯誤。另外,第二次會話開始將被忽略。

只需清除與session_unset的會話,重新生成會話ID,然後重置您的管理變種。無需銷燬,然後重新啓動會話。

+0

這不會導致錯誤。請使用上面的代碼;有用。回聲確實顯示了我請求的數據;但是頁面到頁面不。 – JM4 2010-10-07 18:35:20

+0

嘗試添加:'error_reporting(-1);'到你的php文件的頂部,然後看看你是否能看到通知。您不需要銷燬會話,只需清除所有當前變量,然後設置所需的任何新變量。 – rojoca 2010-10-07 18:39:19

+0

感謝您的建議 - 我最初設計的方式,但聽說它不是'傻瓜證明'session_destroy – JM4 2010-10-07 18:40:29

0

我真的不知道你爲什麼要經歷所有這些步驟。 session_regenerate_id()足以自己重新生成會話標記和關聯的cookie。該函數會創建一個新的會話標記併爲您創建一個新的會話Cookie,同時保留當前會話中的值。由於設置一個新的cookie具有相同的名稱覆蓋舊的不是簡單地調用session_regenerate_id()足夠?

如果我錯過了某些東西,隨時澄清事情。

+0

我不想在前幾屆會議中出現幾個會話變量。您的回答對於預期目標不起作用 – JM4 2010-10-07 21:06:14