警告:无法修改标头信息 - 已由ERROR发送的标头

Rob*_*Rob 84 php header

可能重复: PHP已发送的标头

我一直在努力解决这个错误.

首先,我只是认为它是白色空间,但经过进一步的研究,我认为这可能是一个类似的问题:

查找可在此header语句之前将输出发送给用户的任何语句.如果找到一个或多个,请更改代码以在其前面移动header语句.复杂的条件语句可能会使问题复杂化,但它们也可能有助于解决问题.考虑PHP脚本顶部的条件表达式,它尽可能早地确定标头值并将其设置在那里.

我猜测包头导致问题以及header(),但我不知道如何重新排列代码以摆脱这个错误.

如何删除错误?

<?php
    $username = $password = $token = $fName = "";

    include_once 'header.php';

    if (isset($_POST['username']) && isset($_POST['password']))
        $username = sanitizeString($_POST['username']);

    $password = sanitizeString($_POST['password']); //Set temporary username and password variables
    $token    = md5("$password"); //Encrypt temporary password

    if ($username != 'admin')
    {
        header("Location:summary.php");
    }
    elseif($username == 'admin')
    {
        header("Location:admin.php");
    }
    elseif($username == '')
    {
        header("Location:index.php");
    }
    else
        die ("<body><div class='container'><p class='error'>Invalid username or password.</p></div></body>");

    if ($username == "" || $token == "")
    {
        echo "<body><div class='container'><p class='error'>Please enter your username and password</p></div></body>";
    }
    else
    {
        $query = "SELECT * FROM members WHERE username='$username'AND password = '$token'"; //Look in table for username entered
        $result = mysql_query($query);
        if (!$result)
            die ("Database access failed: " . mysql_error());
        elseif (mysql_num_rows($result) > 0)
        {
            $row = mysql_fetch_row($result);
            $_SESSION['username'] = $username; //Set session variables
            $_SESSION['password'] = $token;

            $fName = $row[0];
        }
    }
?>
Run Code Online (Sandbox Code Playgroud)

Sam*_*ssy 234

长期的答案是PHP脚本的所有输出都应该缓存在变量中.这包括标题和正文输出.然后在脚本的末尾执行您需要的任何输出.

您的问题的快速解决方案是添加

ob_start();
Run Code Online (Sandbox Code Playgroud)

作为脚本中的第一件事,如果你只需要在这个脚本中.如果您在所有脚本中都需要它,请将它添加为header.php文件中的第一个内容.

这打开了PHP的输出缓冲功能.在PHP中输出内容(执行回显或打印)时,必须在此时发送HTTP标头.如果打开输出缓冲,则可以在脚本中输出,但PHP不必发送标头,直到刷新缓冲区.如果打开它并且不关闭它,PHP将在脚本完成运行后自动刷新缓冲区中的所有内容.在几乎所有情况下都只是打开它并没有什么害处,并且在某些配置下可能会给你带来小的性能提升.

如果您有权更改php.ini配置文件,则可以查找并更改或添加以下内容

output_buffering = On
Run Code Online (Sandbox Code Playgroud)

这将转换输出缓冲而无需调用ob_start().

要了解有关输出缓冲的更多信息,请查看http://php.net/manual/en/book.outcontrol.php


Sai*_*tel 10

检查的东西echo,print()printr()在包括文件,header.php.

可能是这是问题或者如果有任何MVC文件,那么检查之后的空格数?>.这也可能会产生问题.


Pie*_*ier 6

您正在尝试在输出内容后发送标题信息.

如果要执行此操作,请查找输出缓冲.

因此,请看使用 ob_start();


Jam*_*s C 5

您的header()通话存在一些问题,其中一个可能会导致问题

  • 你应该exit()在每个header("Location:调用之后放置一个,否则代码执行将继续
  • 你应该有一个空格后:,所以它读取"Location: http://foo"
  • Location标题中使用相对URL无效,您应该形成一个绝对URLhttp://www.mysite.com/some/path.php