2

可能重复:
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只是为了了解更多关于转移问题的信息。

4

1 回答 1

7

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

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

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

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

于 2012-07-07T19:35:36.080 回答