这是我的PHP会话的问题吗?

时间:2012-10-21 16:25:49

标签: php session session-variables sessionid

我正在使用会话将用户登录到我的网站。

登录表单将输入发送到login-exec文件,然后该文件查询数据库并验证登录信息。我已将session_start();放在login-exec文件的开头,然后使用下面的代码段将数据写入会话:

session_regenerate_id();
$member = mysql_fetch_assoc($result);
$_SESSION['SESS_MEMBER_ID'] = $member['id'];
$_SESSION['Username'] = $member['username'];
$_SESSION['key'] = $member['Serial'];
session_write_close();
header('Location: account.php');

在account.php文件的开头我已经要求auth.php来验证会话。

account.php:require_once('auth.php');

auth.php:

<?php
//Start session
session_start();

//Check whether the session variable SESS_MEMBER_ID is present or not
if(!isset($_SESSION['SESS_MEMBER_ID']) || (trim($_SESSION['SESS_MEMBER_ID']) == '')) {
    header("Refresh: 5; url=login.php");
    //echo $_SESSION['SESS_MEMBER_ID'];
    die("Access Denied!");
    exit();
}
?>

始终首次登录时会返回拒绝访问权限。当脚本重定向回登录页面并且我再次尝试它总是有效...我已经将我的php文件保存为UTF-8而没有BOM,因为我原本以为在会话开始之前有领先的空白区域。这没有解决问题,我真的无法解决这个问题。

有关为何发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:0)

我认为问题是我的login-exec.php脚本中的重定向网址。例如:

如果我通过转到http://www.mydomain.com/mysubdirectory/login.php加载login.php脚本并且login-exec.php中的标头重定向指向http://subdomain.mydomain.com/account.php,则由于域已更改,正在重新生成PHPSESSID。

所以我将标题重定向更改为account.php而不是完整的网址,这解决了问题。

我本可以使用完整的URL subdomain.mydomain.com或mydomain.com/subdirectory/,但这样做会限制用户和脚本的可移植性。如此简单的答案......确保域名保持不变。如果不是,你可以设置会话名称,我很确定会解决这个问题。但是在我的情况下header('Location: script.php');做了伎俩。

答案 1 :(得分:-1)

摆脱session_write_close();

如果这不能解决问题,可能是您在account.php文件中丢失了会话。

在要求auth.php页面之前拨打session_start();