对header()的调用偶尔失败并且'header already sent'

时间:2012-01-30 12:37:17

标签: php header warnings post-redirect-get

我的网站findRecords.php中有稳定的PHP代码,如下所示:

 // inside findRecords.php....
<HTML>  
<head>
<?php 
include 'titleBar.php';
include 'topNavigationBar.php';
?>    
</head> 
require 'varsAndStatics.php'; // variables and statics used throughout

// other html in findRecords.php not shown here for brevity.....

在我的topNavigationBar.php内部,我输出了每页顶部导航栏的html,其行如下:

<div class="pageTopRowContainerLabel">
    <a class="pageTopRowTextStyle" 
       href="http://localhost/myProj/index.php">HOME</a>
</div>   
  // more nav bar divs not shown....

在findRecords.php里面我做一个简单的数据库查找并获取一些记录并打算在浏览器中显示这些记录,方法是使用header()切换到显示这些记录的其他页面(showRecords.php )。

如果你注意到上面的内容,你可以看到上面的findRecords.php,一个html标题已经发送了一些html div,用于显示我的导航栏,通过include'topNavigationBar.php'语句。

然后我在同一个findRecords.php文件中调用了header()来实现Post / Redirect / Get:

header("Location: http://localhost/myProj/showRecords.php", true, 303);

以上工作正常。在数据库中查找记录后header()转到showRecords.php以显示它们。

好的,现在我刚刚在varsAndStatics.php中添加了一个heredoc,它一直包含在findRecords.php中(见上文)。我现在将以下heredoc添加到长时间稳定的文件varsAndStatics.php中:

echo <<<_RIDOFWHITESPACE
<br />
<script type="text/javascript">

function ridOfWhiteSpace(theFormElementFieldValue, bLtrsOnly, bLtrsNumsOnly)
{

   //  Remove whitespace
   if(theFormElementFieldValue.indexOf(" ")!=-1) 
   {
      var doozh = theFormElementFieldValue.split(" ").join("");
      theFormElementFieldValue = doozh;
   }
   return theFormElementFieldValue;
}
</script>
_RIDOFWHITESPACE;

现在我在f header()上面对indRecords.php的电话打断了标头已发送错误。

我不知道为什么heredoc打破了这个稳定的代码。在所有之后 - 对header()的呼叫和导航条形码已经存在了一段时间!

我所说的是:findRecords.php发送的网页发送包含topNavigationBar.php的导航条div,然后我拨打header() - 该代码已经运行了很长时间。

在我看来,因为当我在旧的稳定代码中调用topNavigationBar.php时,已经有输出发送到浏览器(header() div),在{中添加heredoc() {1}}不应该破坏代码。

我在这里缺少一个微妙的东西吗?

2 个答案:

答案 0 :(得分:1)

在这些测试期间,似乎您以某种方式更改了output_buffering设置。

  

在findRecords.php里面我做一个简单的数据库查找并获取一些记录,并打算在浏览器中显示这些记录,方法是使用header()切换到显示这些记录的不同页面(showRecords.php)。

我认为没有任何意义。你为什么不能直接将用户引导到showRecords.php?或者只是包含它,没有重定向?

答案 1 :(得分:0)

仍然没有看到为什么header()已经工作数周的解释,尽管事实上,findRecord.php已经发送我的导航栏html与html标头和我对header()的调用工作正常精细。只是来自一些人的推测 - 没有答案。我花了一天时间查看代码以及页面顶部导航栏的html和div,然后调用header()工作得很好。然后,一旦我取消注释heredoc,我就会遇到一个'header already'警告,当遇到header()(已经存在,工作正常,数周)的调用时。

我的代码中没有任何内容可以解释为什么在发送导航栏html之后过去几周内对header()的调用工作正常。请不要在我的问题中添加更多猜测!如果您不知道答案,请不要混淆这个问题。制作SWAGS(愚蠢的野蛮猜测)就像“看起来你的输出自助餐设置在这些测试期间有所改变”是多层次的猜测而没有帮助。

我会找出为什么我的导航栏html输出和header()调用工作得很好以及为什么他们在添加heredoc时会中断,然后将其发布回来。