0
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 包含与我的 //check session timeout 相同的编码,任何帮助将不胜感激。谢谢。

编辑以包含我的 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();
4

3 回答 3

1

您的第一个示例(Example1)和您的第二个示例(Example2)不会获得相同的效果,因为代码的顺序不同。

Example1 和 Example3 的代码顺序相同,因此应该产生相同的行为。

当然你可以争论 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");
于 2013-04-03T07:50:08.160 回答
1

如果会话没有开始,那么$_SESSION不应该存在。顺便说一句,成功时,失败时session_start()返回。TRUEFALSE

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

/* 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'); 
   }
}

然后你会在你想要的地方包含这部分。

于 2013-04-03T07:54:05.907 回答
-1

保持

session_start();

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

如果您仍想在页面中使用 session_start(),请像这样使用它:

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

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

于 2013-04-03T07:25:32.943 回答