SESSION变量在销毁其余部分后未从页面传递

时间:2010-10-07 18:28:08

标签: php session

我完全失去了言辞。

如果在此过程中出现错误,我允许管理员重置其注册。理论上,以下代码应该像这样运行:

到达

页面,根据会话数据设置$ adminvalidated。 $ _SESSION数组被清除; cookie在消费者端被清除;会话ID被重新审核并且会话被销毁。然后重新启动会话,并将前面提到的变量放回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;*/
?>

3 个答案:

答案 0 :(得分:1)

From the manual page of session_start

  

从PHP 4.3.3开始,在先前启动会话之后调用session_start()将导致级别E_NOTICE的错误。此外,第二个会话开始将被忽略。

只需使用session_unset清除会话,重新生成会话ID,然后重置您的admin var。无需销毁然后重新启动会话。

答案 1 :(得分:1)

通常,只需调用session_regenerate_id(true)来更改当前会话的会话ID 就会使与先前会话ID的关联无效。

如果您还想清除$_SESSION['ADMINVALIDATED']以外的任何会话数据,请执行以下操作:

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

答案 2 :(得分:0)

我真的不确定你为什么要经历所有这些步骤。 session_regenerate_id()足以重新生成会话令牌和关联的cookie。该函数创建一个新的会话令牌,并为您创建一个新的会话cookie,同时保留当前会话中的值。由于设置一个具有相同名称的新cookie会覆盖旧的cookie不仅仅是调用session_regenerate_id()吗?

如果我错过了什么,请随意澄清事情。