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

2022-08-30 08:06:27

我已经在这个错误中挣扎了一段时间。

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

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

我猜包含标头与head()一起导致问题,但我不确定如何重新排列代码以摆脱此错误。

如何删除错误?

<?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];
        }
    }
?>

答案 1

从长远来看,答案是PHP脚本的所有输出都应该在变量中缓冲。这包括标头和正文输出。然后在脚本结束时执行所需的任何输出。

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

ob_start();

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

这将打开 PHP 的输出缓冲功能。在PHP中,当你输出一些东西(做回显或打印)时,它必须在那个时候发送HTTP标头。如果打开输出缓冲,则可以在脚本中输出,但在刷新缓冲区之前,PHP 不必发送标头。如果打开它并且不关闭它,PHP将在脚本完成运行后自动刷新缓冲区中的所有内容。在几乎所有情况下打开它确实没有害处,并且在某些配置下可以为您提供小幅性能提升。

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

output_buffering = On

这将关闭输出缓冲,而无需调用ob_start()。

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


答案 2

使用 或 包含文件 .echoprint()printr()header.php

这可能是问题,或者如果有任何MVC文件,请检查之后的空格数。这也可能会带来问题。?>


推荐