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 和封闭主题。
警告页面是:index.php,是我处理的唯一页面
显示和设置数据。当我在助手 adminHelper.php
上调用 header('Location') 时显示此警告
我正在使用 class coreConfig.php 设置和
获取索引页的数据。
- 还有一些助手 class。
与索引页使用相同的表单,相同的功能,相同的设置表单数据的例程。只有数据随传递的参数发生变化。
并且此页面与所有其他数据集完美配合,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。
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 和封闭主题。
警告页面是:index.php,是我处理的唯一页面 显示和设置数据。当我在助手 adminHelper.php
上调用 header('Location') 时显示此警告
我正在使用 class coreConfig.php 设置和 获取索引页的数据。
- 还有一些助手 class。
与索引页使用相同的表单,相同的功能,相同的设置表单数据的例程。只有数据随传递的参数发生变化。 并且此页面与所有其他数据集完美配合,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。