包含会话TimeOut的文件不起作用

时间:2013-04-03 06:49:58

标签: php

require("database.php");

if(empty($_SESSION['user']))
{
    header("Location: login.php");

    die("Redirecting to login.php");
}

//check session timeout
$now = time();


$limit = $now - 60 * 1;

if (isset ($_SESSION['last_activity']) && $_SESSION['last_activity'] < $limit)
{
  $_SESSION = array();
  header('Location: login.php');
  exit;
} 
else {

  $_SESSION['last_activity'] = $now;
 }

如果我手动将会话超时放在每个页面中,编码工作正常。但是如果我尝试将它存储在另一个文件中并将其调用到每个页面,它将被忽略,我不会得到任何会话超时。

实施例

require("database.php");
require("expired.php");

if(empty($_SESSION['user']))
{
    header("Location: login.php");

    die("Redirecting to login.php");
}

expired.php包含与我的//检查会话超时相同的编码,任何帮助将不胜感激。感谢。

编辑包含我的database.php

$username = "";
$password = "";
$host = "";
$dbname = "";

$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');

try
{
    $db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options);
}
catch(PDOException $ex)
{
    die("Failed to connect to the database: " . $ex->getMessage());
}

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())
{
    function undo_magic_quotes_gpc(&$array)
    {
        foreach($array as &$value)
        {
            if(is_array($value))
            {
                undo_magic_quotes_gpc($value);
            }
            else
            {
                $value = stripslashes($value);
            }
        }
    }

    undo_magic_quotes_gpc($_POST);
    undo_magic_quotes_gpc($_GET);
    undo_magic_quotes_gpc($_COOKIE);
}

header('Content-Type: text/html; charset=utf-8');

if(!isset($_SESSION)){
session_start();
}
//session_start();

3 个答案:

答案 0 :(得分:1)

您的第一个示例(例1)和第二个示例(例2)不会产生相同的效果,因为代码是以不同方式排序的。

示例1和示例3的代码顺序相同,因此应该导致相同的行为。

当然你可以争论session_start()(把它放在哪里等等),但这不是你的问题。

示例1:

require("database.php");

if(empty($_SESSION['user']))
{
    header("Location: login.php");

    die("Redirecting to login.php");
}

//check session timeout
$now = time();


$limit = $now - 60 * 1;

if (isset ($_SESSION['last_activity']) && $_SESSION['last_activity'] < $limit)
{
  $_SESSION = array();
  header('Location: login.php');
  exit;
} 
else {

  $_SESSION['last_activity'] = $now;
 }

示例2:

require("database.php");
require("expired.php");

if(empty($_SESSION['user']))
{
    header("Location: login.php");

    die("Redirecting to login.php");
}

示例3:

require("database.php");

if(empty($_SESSION['user']))
{
    header("Location: login.php");

    die("Redirecting to login.php");
}

require("expired.php");

答案 1 :(得分:1)

如果未启动会话,则$_SESSION不应存在。顺便说一下,session_start()会在成功时返回TRUE,在失败时返回FALSE

所以记住这一点,你应该写下这样的东西:

/* File: session.php */
if ( session_id() == ''){ // If session id doesn't exist

   if ( ! session_start() ){ // Do start a new session
      die('Cannot start a session'); 
   }
}

然后,您可以将此部分包含在您想要的位置。

答案 2 :(得分:-1)

session_start();

在每个页面的顶部,然后不要在页面内使用它或包含页面。

如果您仍想在页面中使用session_start(),请按以下方式使用:

if(!session_start()){
    session_start();
}

你可以告诉php.ini抛出哪种类型的错误,搜索“error_reporting”并阅读规则。警告不会停止执行您的代码。