header 的奇怪警告 - 位于 php "Cannot modify header information"

Strange Warning with header - Location in php "Cannot modify header information"

Warning: Cannot modify header information - headers already sent by (output started at C:\wamp\www\ecommerce\base\classes\baseconfig.php:23) in C:\wamp\www\ecommerce\base\classes\adminHelper.php on line 6

我知道上述警告的根本原因。但我无法重新爱上它。我的问题不同于其他问题和许多 down-voted 和封闭主题。

与索引页使用相同的表单,相同的功能,相同的设置表单数据的例程。只有数据随传递的参数发生变化。 并且此页面与所有其他数据集完美配合,one.showing 上述警告除外。我不明白为什么会这样。 我正在使用此函数格式化输出

    public $mainTabLength = "\t";
      public $tabLength = "\t\t";

      public function printFormat($text, $class) {
    if($this->useDivToPrint) {
      echo $this->mainTabLength . "<div class=\"$class\">" . $this->tabLength . "$text\n";
      echo $this->mainTabLength . "</div>\n";
    }
    else{
      echo $text;
    }
  }

我也不想使用代码缓冲..等待评论。

注意:我通过从 IDE

中删除任何 white-spaces 来格式化我的 php 代码

更新:

问题已通过检查缓冲区输出解决。正如预期的那样,我的代码在我调用 header('Location').但我确信我没有犯这样的错误,因为我的所有其他数据都工作正常。但是我很惊讶地看到工作数据集的缓冲区输出和导致警告的输出:

表格 1:添加新类别(工作正常 header('Location')) 即使我可以看到以下 header 信息已发送 :

<!DOCTYPE HTML>
<html>
<head>
<title>E-Commerce</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<link href="../css/style.css" media="screen" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="../images/favicon.png"/>
<script type="text/javascript" language="javascript" src="../jses/jquery-1.11.3.min.js"></script>
<script type="text/javascript" language="javascript" src="../jses/scripts.js"></script>
<script type="text/javascript" language="javascript" src="../jses/datePicker.js"></script>

表格 2:添加新产品(不工作 header('Location') 导致警告) 我可以看到相同的 header 信息已发送:

<!DOCTYPE HTML>
<html>
<head>
<title>E-Commerce</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<link href="../css/style.css" media="screen" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="../images/favicon.png"/>
<script type="text/javascript" language="javascript" src="../jses/jquery-1.11.3.min.js"></script>
<script type="text/javascript" language="javascript" src="../jses/scripts.js"></script>
<script type="text/javascript" language="javascript" src="../jses/datePicker.js"></script>

这是我无法检测到代码问题的根本原因。 为什么它对我的 form1 有效,即使它已经发送了一些 header 信息!!

就像我在评论中所说的那样,问题是您在调用 header 之前发送了一些输出,这是一个 no-no。这可能包括:

  • 任何包含文件的输出,包括以下所有内容,无论包含文件的深度如何(包含的文件包含另一个文件,另一个文件包含另一个文件...等)。
  • newline/space 在 <?php?> 标签之前或之后。
  • 正在回应任何事情。
  • 甚至 html 从 php 标签外输出。
  • 一个php错误或警告。

这些,还有更多,都会输出一些东西,并且会被考虑 "output before call to header"。因为其中一些很难看到,您甚至在浏览页面时可能都看不到它。

您的选择是打开输出缓冲或想办法在此请求期间不显示输出。

如果您想查看正在输出的内容(可能有助于发现问题),您可以做这样的事情来进行测试:

  • 在被请求的第一个脚本的第一行(可能 index.php,无论浏览器请求什么文件),在 <?php 之后添加对 ob_start() 的调用。如果您的文件不是以 <?php 开头,那么这就是您的问题。
  • 在调用 header 之前的行中出现错误,添加类似 file_put_contents("output.txt", ob_get_contents());.
  • 的内容

这将获得任何输出并写入文本文件。这次文件可能 运行 没有错误(你刚刚打开了缓冲)但它仍然应该写入任何输出。还要记住,它可能只是一个 space 或换行符。因此,如果您打开文件后什么也没看到,请确保检查是否写入了一些 non-display 字符。

现在只需要继续缓冲或查找并删除多余的 space。