SESSION变量在摧毁了其余的页面后不能从页面传递

问题描述:

我完全失去了单词。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;*/ 
?> 

通常,只需拨打session_regenerate_id(true)即可更改当前会话的会话ID,从而使与前一会话ID的关联无效。

如果您还想要清除除$_SESSION['ADMINVALIDATED']任何会话数据,只是这样做:

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

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

我真的不知道你为什么要经历所有这些步骤。 session_regenerate_id()足以自己重新生成会话标记和关联的cookie。该函数会创建一个新的会话标记并为您创建一个新的会话Cookie,同时保留当前会话中的值。由于设置一个新的cookie具有相同的名称覆盖旧的不是简单地调用session_regenerate_id()足够?

如果我错过了某些东西,随时澄清事情。

+0

我不想在前几届会议中出现几个会话变量。您的回答对于预期目标不起作用 – JM4 2010-10-07 21:06:14