2011-04-28 56 views
3

我有以下迄今为止打开会话(PHP),什么时候会话数据可用?

session_start() ; 

foreach($_SESSION as $key => $value){ 
    $alert .= '<br/>' . '['.$key.']='.$value ; 
} 

$alert .= '<br/>$_SERVER[MY_SERVER...]='.$_SERVER['MY_SERVER_GENERATED'] ; 

if($_SESSION['MY_SERVER_GENERATED'] !== true || 
    $_SERVER['REMOTE_ADDR'] !== $_SESSION['PREV_REMOTEADDR'] || 
    $_SERVER['HTTP_USER_AGENT'] !== $_SESSION['PREV_USERAGENT']){ 
     $alert .= 'session destroyed' ; 
     session_destroy() ; 
} 

if(isset($_SESSION['CREATED']) && (strtotime('now') - $_SESSION['CREATED']) > 300){//Delete expired sessions - seconds 
    $alert .= '<div class="error_box">Your session has expired!</div>' ; 
    $_SESSION = array() ; 
} 

session_regenerate_id(); 
$_SESSION['CREATED'] = strtotime('now') ; 
$_SESSION['MY_SERVER_GENERATED'] = true ; 
$_SESSION['PREV_USERAGENT'] = $_SERVER['HTTP_USER_AGENT'] ; 
$_SESSION['PREV_REMOTEADDR'] = $_SERVER['REMOTE_ADDR'] ; 

echo $alert ; 

的问题是会话被销毁每次。 $ _SESSION只是空的。在什么时候可以运行上述检查?

糟糕的是,忘记指明我已验证会话正在保存数据,但直到页面启动。所以会话被销毁,因为$ _SESSION数据全为空,因此条件评估为false。作为一个例子,$ alert不会被注册为存储任何内容。

+0

尝试检查您的php.ini中的session_lifetime – Cristian 2011-04-28 16:07:38

回答

1

您的代码似乎有一个catch 22:

session_start() ; 


if(!$_SESSION['MY_SERVER_GENERATED']){ <------- this will always be true 
               for a fresh session, so 
    session_destroy() ; <--------------------- this will always be executed 

会话数据从未有机会来填充。

+0

@Magic如果变量为false,则条件将匹配*或*如果它根本没有设置,则始终为真。如果你想检查它的值* false *而不是别的,做'if($ _SESSION ['MY_SERVER_GENERATED']!== false)' – 2011-04-28 16:19:57

+0

我更新了代码以显示我目前的确切内容。所有需要的$ _SESSION变量都是在regenerate_id后设置的,但是每次运行代码时,$ _SESSION仍然是空的。是否有$ _SESSION数据可用的特定点? – 2011-04-28 16:35:22

+0

@Magic据我所知,在值被设置之前,你似乎仍然在销毁会话,导致值无处设置。在第一个请求中,您的第一个“if”条件总是会评估为真 – 2011-04-28 16:37:17

相关问题