警告:不能修改标题信息 – 已经由ERROR发送的标题

可能重复: 已经由PHP发送的头

我一直在努力处理这个错误一段时间了。

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

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

我猜包含头引起问题一起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]; } } ?> 

长期的答案是,你的PHP脚本的所有输出应该被caching在variables中。 这包括标题和正文输出。 然后在你的脚本结尾做任何你需要的输出。

你的问题的快速修复将被添加

 ob_start(); 

作为脚本中的第一件事情,如果你只需要这个脚本。 如果你在所有的脚本中都需要它,把它作为你header.php文件中的第一件事来添加。

这将打开PHP的输出缓冲function。 在PHP中,当你输出一些东西(做一个回显或打印),如果在这个时候必须发送HTTP头。 如果打开输出缓冲,则可以在脚本中输出,但PHP不必发送标题直到缓冲区被刷新。 如果你打开它并不关掉它,PHP将在脚本结束运行后自动刷新缓冲区中的所有内容。 几乎在所有情况下都可以打开它,但在某些configuration下可能会使性能有所提高。

如果你有权改变你的php.iniconfiguration文件,你可以find并更改或添加以下内容

 output_buffering = On 

这将使输出缓冲出来而不需要调用ob_start()。

要了解更多关于输出缓冲检查http://php.net/manual/en/book.outcontrol.php

在包含文件header.php检查echoprint()printr()

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

header()调用有一些问题,其中一个可能会导致问题

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

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

如果你想这样做,寻找输出缓冲。