php 警告:无法修改标题信息-标题已由ERROR [重复]发送

omjgkv6w  于 2023-10-15  发布在  PHP
关注(0)|答案(4)|浏览(113)

此问题已在此处有答案

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
mhd8tkvw

mhd8tkvw1#

长期的答案是,PHP脚本的所有输出都应该在变量中缓冲。这包括标题和正文输出。然后在脚本结束时执行所需的任何输出。
解决问题的最快方法是添加

ob_start();

作为脚本中的第一件事,如果您只需要在这一个脚本中使用它。如果你在所有的脚本中都需要它,那么就把它作为header.php文件中的第一件事来添加。
这将打开PHP的输出缓冲特性。在PHP中,当你输出一些东西(做一个echo或print)时,它必须在那个时候发送HTTP头。如果打开了输出缓冲,您可以在脚本中输出,但是PHP在缓冲区被刷新之前不必发送头。如果你打开它而不关闭它,PHP会在脚本运行结束后自动刷新缓冲区中的所有内容。在几乎所有情况下打开它确实没有什么害处,并且在某些配置下可以给予较小的性能提升。
如果您有权更改php.ini配置文件,您可以找到并更改或添加以下内容

output_buffering = On

这将关闭输出缓冲,而不需要调用ob_start()。
要了解有关输出缓冲的更多信息,请查看http://php.net/manual/en/book.outcontrol.php

dfuffjeb

dfuffjeb2#

检查包含文件header.php中的echoprint()printr()
这可能是问题所在,或者如果有任何MVC文件,请检查?>后面的空格数。这也可能造成一个问题。

5n0oy7gb

5n0oy7gb3#

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

  • 您应该在每个header("Location:调用之后放置exit(),否则代码将继续执行
  • :后面应该有一个空格,因此它的内容为"Location: http://foo"
  • Location标头中使用相对URL是无效的,您应该像http://www.mysite.com/some/path.php一样形成绝对URL
41ik7eoe

41ik7eoe4#

您正在尝试在输出内容后发送标题信息。
如果您想这样做,请查找output buffering.
因此,请使用ob_start();

相关问题