2015-07-21 111 views
0

我正试图想出一个会话超时(第一次)。当我调用if语句时,它将获得$ _SESSION变量的空值。我将会话从顶部的header.php文件中开始。当它在用户登录创建与此代码会话:PHP会话将返回null

public static function create_session($values) { 
    foreach ($values as $key => $value) { 
     if ($key != "password") { 
      $_SESSION[$key] = $value; 
     }   
    } 

    $_SESSION["timestamp"] = time(); 
} 

然后重定向到一个索引页至极只包含:

<?php 
    echo "<pre>"; 
    print_r($_SESSION); 
    echo "</pre>"; 
?> 

这个工作,它打印页面上的所有会话变量正好。

这是用index.php文件打印出来的代码。

Array 
(
    [id] => 33 
    [first_name] => removed to not show name 
    [last_name] => removed to not show name 
    [email] => [email protected] 
    [timestamp] => 1437486426 
) 

在我的footer.php文件中,我有一些jquery每5秒运行一次定时函数,调用timeout.php文件。

(function poll() { 
    setTimeout(function() { 
     $.ajax({ url: "timeout.php", success: function(data) { 
      console.log(data); 
     }, dataType: "json", complete: poll }); 
    }, 5000); 
})(); 

超时PHP文件只有这个代码是:

if (isset($_SESSION)) { 
    if ($_SESSION['timestamp'] + 10 * 60 < time()) { 
     // session timed out 
     echo json_encode(array('session' => $_SESSION, 'session_timestamp' => $_SESSION['timestamp'], 'timestamp_calculation' => $_SESSION['timestamp'] + 10 * 60, 'timeoutstatus' => 'timed out')); 
    } else { 
     // session ok 
     echo json_encode(array('session' => $_SESSION, 'session_timestamp' => $_SESSION['timestamp'], 'timestamp_calculation' => $_SESSION['timestamp'] + 10 * 60, 'timeoutstatus' => 'not timed out')); 
    } 
} else { 
    echo json_encode(array('session' => 'Session does not exits')); 
} 

出于某种原因,我收到会话不存在。如果我删除if语句的那部分,并且只测试超时,所有调用$ _SESSION的json数组变量都会返回null。我不知道这是为什么。我感谢您的帮助。

作为对此的重复。最初的想法是,session_start()没有被调用。我曾经提到它在第一段中被调用,它在所有其他的PHP代码之前。我也确认我可以在索引页面中调用$ _SESSION变量。当我试图通过从我的footer.php调用的ajax函数来读取它时,我只会遇到问题。

+0

我没有看到'在session_start()'任何地方。我没有看到你的索引页如何工作,就像你说的那样。 –

+0

你开始会议吗?在session_start(); http://php.net/session_start – Webice

+0

session_start()函数位于header.php文件中,因此无论如何都会调用它。我没有在这里的代码中包含它。所以heirarchy去header.php与session_start() - > index.php - > footer.php – user2112618

回答

1

您还没有timeout.php文件启动会话和/或不包括你的header.php在这个文件中,以便会议绝不会timeout.php开始。这是y会话在timeout.php文件中未定义。

可以在timeout.php添加条件,如:

if(!isset($_SESSION)) session_start(); 
+0

你可以接受,如果它工作 –