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

Php 警告:无法修改标题信息-错误已发送标题,php,header,Php,Header,我已经为这个错误挣扎了一段时间了 首先,我认为这是空白,但经过进一步研究,我认为这可能是一个类似的问题: 在该头语句之前,查找可以向用户发送输出的任何语句。如果找到一个或多个,请更改代码以将header语句移到它们之前。复杂的条件语句可能会使问题复杂化,但也可能有助于解决问题。考虑PHP脚本顶部的一个条件表达式,它尽可能早地确定头值并将其设置在那里。 我猜include头和header()一起导致了问题,但我不确定如何重新排列代码以消除此错误 如何删除错误 <?php $usern

我已经为这个错误挣扎了一段时间了

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

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

使用include文件
header.php
中的
echo
print()
printr()
检查某些内容


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

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

  • 您应该在每个
    标题(“位置:
    调用”)之后放置一个
    exit()
    ,否则代码执行将继续
  • 后面应该有一个空格,这样它就会显示
    “位置:http://foo“
  • 位置
    标题中使用相对URL是无效的,您应该像
    http://www.mysite.com/some/path.php

您试图在输出内容后发送标题信息

如果你想这样做,找一个


因此,使用
ob_start();

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

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

ob_start();
作为脚本中的第一件事,如果您只在这一个脚本中需要它。如果您在所有脚本中都需要它,请将它作为第一件事添加到header.php文件中

这将打开PHP的输出缓冲功能它必须在那个时候发送HTTP头。如果你打开输出缓冲,你可以在脚本中输出,但PHP不必发送头,直到缓冲被刷新。如果你打开它,但不关闭它,PHP会在脚本完成运行后自动刷新缓冲区中的所有内容。只需打开它就没有什么害处在几乎所有情况下都可以启用,并且在某些配置下可以使您的性能略有提高

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

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


要了解更多关于输出缓冲的信息,请查看
header.php
是什么样子的?如果($username…
if/else链,因此在输出HTML标头后不会调用重定向标头。假设标记之前没有空格。如果在错误之前没有看到任何字符,则一定要查找空白。感谢回复。我将包含标头移到了标头下方()我没有收到错误。但是,头文件包含每个位置的菜单选项,因此,当我将包含头移到头()下面时,菜单选项不会改变。@SamHennesy我必须在哪里添加ob_start()在页眉下还是在页面的开头?@Sharif,尽早使用它。如果这是页面的开头,那么它就是。大多数情况下,调用ob_start()没有害处。这是一个很好的做法吗?我的意思是,既然
PHP
抛出了一个错误,这是否意味着可以有更好的方法来执行该操作。@James111,在尝试向遗留应用程序添加测试时,这通常是一个问题。应用程序通常不是设计为从命令行运行的。理想情况下,您可以重构应用程序以支持这样的运行。理想情况下,如果要进行重构,最好通过测试来帮助了解是否有任何内容被破坏。我会选择先添加测试,然后使用上面的解决方案作为两者的桥梁。但是我的建议是,
header()
中的所有相关URL都正常工作,只有一个例外。