【问题标题】:Session variables not transferring between pages [duplicate]会话变量不在页面之间传输[重复]
【发布时间】:2012-07-07 19:32:17
【问题描述】:

可能重复:
Headers already sent by PHP

我正在制作一个简单的登录页面,但是我的 $_SESSION 变量没有在页面之间传输。我在每一页的开头阅读了许多关于session_start()、文件夹写入权限、session_write_close() 等的其他帖子,但没有一个有效。 session_write_close() 有或没有都没有区别,所以我把它留在里面。下面的所有代码都可以正常工作,因为我省略了下面和上面的代码,例如 $login_fail 的来源。

目前我设置了$_SESSION 变量,如下面的代码所示:

if($login_fail == "")
{
    $query = "SELECT first_name, last_name, email_address,password FROM user_info WHERE     email_address = '$email_address' AND password = '$password'";
    $result = mysql_query($query);

    if(!$result) die ("Database access : " .mysql_error());
    elseif (mysql_num_rows($result))
    {
        $row = mysql_fetch_row($result);
        $token = "$email_address";
        $token1 = "$password";
        echo "token: $token, token1: $token1, row[1]: $row[1], row2: $row[2] </ br>";
        if($token == $row[2] && $token1 == $row[3]) 
        {
            session_start();
            $_SESSION['first_name'] = $row[0];
            $_SESSION['last_name'] = $row[1];
            $_SESSION['email_address'] = $row[2];
            $_SESSION['password'] = $row[3];
            $_SESSION['check'] = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']);
            //print_r($_SESSION);
            session_write_close();
            header("Location: http://127.0.0.1/websiteproject/test.php"); 
        }
        else die("Invalid username/password combination");       
    }
}
else
{
    echo "Login failed. Please try again.";
}

我已经完成了print_r($_SESSION),它会打印出所有正确的信息。

然后在我的 test.php 中再次调用会话变量,以查看在真正简单的代码中发生了什么。

session_start();
print_r($_SESSION);

结果是一个空数组。 当我转到编写会话的 easyphp 临时文件时,我总是会找到两个文件:一个包含所有正确信息的原始文件和一个没有任何信息的新文件。似乎当我调用第二个 session_start() 时,它实际上是在开始一个新会话,而不是回忆当前会话。

我尝试进行研究以提供尽可能多的信息,而不是浪费人们的时间。任何想法都非常感谢。奇怪的是,这在几天前还有效,然后我开始对程序更深入的文件进行更改,这发生了。所以我发了test.php 只是为了了解更多关于传输问题的信息。

【问题讨论】:

标签: php session transfer


【解决方案1】:

一旦任何数据或空格输出到浏览器,您就不能调用session_start()

在您发布的代码中,您在调用 session_start() 之前调用了 echo "token: $token, token1: $token1, row[1]: $row[1], row2: $row[2] ";,这不会启动会话。

error_reporting(E_ALL); ini_set('display_errors', 1); 添加到脚本的开头,您应该会看到一条警告,指出由于输出已发送,因此无法启动会话。

尝试将session_start(); 调用移动到文件的非常开头。

【讨论】:

  • 我做了建议的更改,但它仍然在做同样的事情。我将 session_start() 移到代码的第一行并删除了所有 echo 语句。问题是我在开始会话时从来没有遇到过问题,因为我可以从我的 Easy PHP 临时文件夹中打开会话并查看所有正确的信息。在下一页,在 test.php 中,当我启动会话时,它会启动一个没有任何信息的新会话,几乎就像它忽略了先前启动的会话
  • 使用Wireshark 或firefox 插件livehttpheaders 之类的工具来查看HTTP 请求和响应。我的下一个猜测是原始会话的 cookie 域与后续请求中的不同,可能是由于 header() 重定向到 127.0.0.1,也许这需要改为 localhost
  • 天才!从 127... 更改为 localhost 有效。有趣的是,它解释 127... 与 localhost 不同。非常感谢,这一直困扰着我一段时间。在这个项目上取得了良好的进展,然后是 BAM!没有。另外,另一个注意事项。拥有回声和输出似乎并没有改变 session_start() 启动的能力。我把它们放回去只是为了理智,因为回声“令牌......”一直存在。我使用 php 5.3.9,不知道这是否有所作为。无论如何。再次非常感谢,非常感谢。
  • 输出缓冲可能会为您节省回声,但通常会阻止发送会话cookie。是的,关于 127 与 localhost,当浏览器查看您所在的主机/IP 时,它会改变世界。它不能将 IP 地址映射到主机名,也不会检查主机名的 IP 地址以获取相应的 cookie。必须将其设置为您在地址栏中的确切内容,或 .host.com 为 host.com 上的所有主机发送 cookie。
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 2012-06-15
相关资源
最近更新 更多