此问题已在此处有答案:
How to fix "Headers already sent" error in PHP(16个回答)
三年前就关门了。
我只是以为是白色空间,但经过进一步研究我认为可能是类似于这样的问题:
在此头语句之前查找可以将输出发送给用户的任何语句。如果找到一个或多个,请更改代码,将头语句移到它们之前。复杂的条件语句可能会使问题复杂化,但它们也可能有助于解决问题。考虑PHP脚本顶部的一个条件表达式,它尽可能早地确定头值并将其设置在那里。
我猜include头和头()沿着导致了这个问题,但我不确定如何重新排列代码来消除这个错误。
我把include头移到了heads()下面,我没有收到错误。然而,头文件包含了每个位置的菜单选项,所以我把include头移到了headers()下面,菜单选项没有改变。
如何删 debugging 误?
<?php
$username = "";
include_once 'header.php';
if (isset($_POST['username']) && isset($_POST['password']))
$username = sanitizeString($_POST['username']);
if ($username != 'admin')
{
header("Location:summary.php");
}
elseif($username == 'admin')
{
header("Location:admin.php");
}
elseif($username == '')
{
header("Location:index.php");
}
else
// ... rest of the code
4条答案
按热度按时间mhd8tkvw1#
长期的答案是,PHP脚本的所有输出都应该在变量中缓冲。这包括标题和正文输出。然后在脚本结束时执行所需的任何输出。
解决问题的最快方法是添加
作为脚本中的第一件事,如果您只需要在这一个脚本中使用它。如果你在所有的脚本中都需要它,那么就把它作为header.php文件中的第一件事来添加。
这将打开PHP的输出缓冲特性。在PHP中,当你输出一些东西(做一个echo或print)时,它必须在那个时候发送HTTP头。如果打开了输出缓冲,您可以在脚本中输出,但是PHP在缓冲区被刷新之前不必发送头。如果你打开它而不关闭它,PHP会在脚本运行结束后自动刷新缓冲区中的所有内容。在几乎所有情况下打开它确实没有什么害处,并且在某些配置下可以给予较小的性能提升。
如果您有权更改php.ini配置文件,您可以找到并更改或添加以下内容
这将关闭输出缓冲,而不需要调用ob_start()。
要了解有关输出缓冲的更多信息,请查看http://php.net/manual/en/book.outcontrol.php
dfuffjeb2#
检查包含文件
header.php
中的echo
、print()
或printr()
。这可能是问题所在,或者如果有任何MVC文件,请检查
?>
后面的空格数。这也可能造成一个问题。5n0oy7gb3#
您的
header()
调用存在一些问题,其中一个可能导致问题header("Location:
调用之后放置exit()
,否则代码将继续执行:
后面应该有一个空格,因此它的内容为"Location: http://foo"
Location
标头中使用相对URL是无效的,您应该像http://www.mysite.com/some/path.php
一样形成绝对URL41ik7eoe4#
您正在尝试在输出内容后发送标题信息。
如果您想这样做,请查找output buffering.
因此,请使用
ob_start();