php会话表现得很奇怪

时间:2014-05-08 17:15:15

标签: php session session-variables session-cookies

我在根目录中有一个login.php。在有效用户登录时,它执行以下代码:

function log_in($id,$keep_login)
{
$_SESSION['auth'] = true;
$_SESSION['id'] = $id;
if($keep_login==TRUE) {
    setcookie(session_name(),session_id(),time()+LOGGED_IN_TIME);
}
}

在login.php上,在开头,包含头文件(头文件包含第一行的session_start)之后,我检查用户是否使用此函数登录:

function logged_in()
{
if(!isset($_SESSION['auth'])||empty($_SESSION['auth'])||!isset($_SESSION['id'])||empty($_SESSION['id']))
{
    return false;
}
return true;
}

如果用户已经登录,我会使用以下方法将它们重定向到profile.php:

if(logged_in())
{
    header('Location: profile.php');
}

我在/sources/enter.php

中有另一个文件enter.php

login.php的登录数据发送到enter.php。但是,在enter.php中,我看到用户已经登录了,即logged_in()返回true。对此感到好奇,我在login.php和enter.php上回应了会话ID,并且ids是不同的。

BTW,我包括这样的头文件:    $包含= TRUE;    require_once'sources / headers.php';

在session_start(会话是否在headers.php中启动)之前包含$的初始化是否会干扰会话?

虽然我登录了,但是我的login.php无法访问我的会话。有人能指出问题吗?

更新:当我将enter.php移动到根目录(与login.php相同)时,它的工作方式应该如此。虽然出于安全考虑,我想将其移至/sources/enter.php。有解决方案吗

另一个更新:刚才我知道当我将enter.php移动到根目录时, 任何子目录中的文件都无法访问会话。会话变量在那里,但会话ID不同。

AND ONE MORE UPDATE:我刚刚发现,子目录中的会话ID是另一个id,并包含不同的$ _SESSION变量。我的意思是,根目录有$ _SESSION ['id'] = 1,子目录有$ _SESSION ['id'] = 4。也许这是因为会话ID不同。

2 个答案:

答案 0 :(得分:0)

session_start()之前服务器的任何输出都会干扰并导致会话失败。

我不确定您的情况是否属实,但您应该添加session_start()作为配置文件中写的第一件事。确保它是在页面上执行的第一件事。

如果您的文件编码不是session_start(),则有时utf8-without-bom会重新启动(您应该始终使用它)。

答案 1 :(得分:0)

我终于找到了问题。它不在剧本中。当我使用其他浏览器时,它工作得很好。然后我认为Chrome必须保留旧会话cookie,并且在子目录中仍然使用它。我清除了缓存,它现在有效。咦!这样一个简单的答案,我还是需要学习。谢谢大家帮帮我!