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();
答案 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”并阅读规则。警告不会停止执行您的代码。