标题警告[重复]

Posted

技术标签:

【中文标题】标题警告[重复]【英文标题】:Headers warning [duplicate] 【发布时间】:2011-08-09 07:29:54 【问题描述】:

可能的重复:Warning: Cannot modify header information - headers already sent bywhat is output buffering?

我最近从 Bluehost 购买了一个托管计划,并将我的网站搬到了这里。之前,我的网站可以正常工作,我没有收到任何错误,但现在,当我尝试登录时,我收到了这个错误:

警告:无法修改标头信息 - 标头已由第 84 行 /home/rugbyspi/public_html/index.php 中的 /home/rugbyspi/public_html/inc/offline_header.php:15 发送的标头

问题在于标头函数。我想我不能在代码中间使用这个功能,但在我的另一台主机上我可以做到这一点。 知道如何解决这个问题吗?

<?php
session_start();
if (isset($_SESSION['username'])) 
   include_once('inc/homepage_header.php');
   include_once('lib/stats_func.php');
   include_once('lib/user_time_func.php');
   update_last_active($username);
?>

<div id="right_menu">
   <?php include_once('inc/sidebar_statistics.php'); ?>
   <br/>
   <?php include_once('inc/sidebar_follow.php'); ?>
</div>

<div id="content">
   <div class="text">
      <br/>
      <h2 class="hr"><?php echo $lang['ann']; ?></h2>
      <?php
      if(!isset($_REQUEST["start"])) 
         $start = 0;
      
      else 
         $start = $_REQUEST["start"];
      
      $query = mysql_query ("SELECT * from news where lang='$language'")
      or die ("Couldn't connect to the do database.");
      $d=0;
      $f=0;
      $g=1;
      $query = mysql_query ("SELECT * from news where lang='$language' order by id DESC Limit $start, 7") or die ("Couldn't connect to the do database.");
      while($news = mysql_fetch_array($query)) 
         ?>
         <h3 class="hr"><font size=1><?php echo $news['tsubmit']; ?></font>&nbsp;        &nbsp;<?php echo $news['title']; ?></h3>
         <?php
         echo $news['body'];
      
      echo "<br/><br/><br/>";
      echo $lang['pages'] . ': ';
      while($order = mysql_fetch_array($query)) 
         if($f%7==0) 
            echo "<a href='index.php?start=$d'>$g</a>";
            $g++;
         
         $d++;
         $f++;
      
      ?>
   </div>
</div>

<?php
   include_once('inc/footer.php');

else 
   include_once('inc/offline_header.php');
   include_once('lib/stats_func.php');
?>

<div id="right_menu">
   <?php include_once('inc/sidebar_statistics.php'); ?>
   <br/>
   <?php include_once('inc/sidebar_follow.php'); ?>
</div>

<div id="content">
   <div class="text">
      <br/>
      <?php echo $lang['welcome']; ?>
      <br/><br/>
      <?php
      if (isset($_POST['submit'])) 
         $username = $_POST ['username'];
         $password = $_POST ['password'];
         $username = strip_tags ($username);   
         $password = md5 ($password);
         mysql_real_escape_string($username);
         $query = mysql_query ("SELECT id FROM users WHERE username='$username' AND password='$password'")
         or die ("Couldn't connect to the do database.") ;
         $result = mysql_fetch_array($query);
         if($result) 
            $_SESSION['username'] = $username;
            header('Location: index.php');
            if (!empty($_SERVER['HTTP_CLIENT_IP'])) 
               $ip=$_SERVER['HTTP_CLIENT_IP'];
            
            elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) 
               $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
            
            else 
               $ip=$_SERVER['REMOTE_ADDR'];
            
            $time = time();
            mysql_query ("INSERT into logins (userid, time, ip)
            VALUES ('$result[id]', '$time', '$ip')")
            or die ("Couldn't connect to the database.");
         
         else 
            echo $lang['login_error'];
         
         echo '<br/><br/>';         
      
      ?>
      <h2 class="hr"><?php echo $lang['about']; ?></h2>
      <?php echo $lang['intro']; ?>
   </div>
</div>

<?php

   include_once('inc/footer.php');
?> 

【问题讨论】:

这是这里最常被问到的问题,而且总是相同的原因。提问前请search。 @deceze 请在关闭前阅读。据我了解,他知道问题出在哪里。他在问最好的处理方法。因此,如果您有类似的问题,请分享,但不要链接一般的“标头已发送”问题,因为它们没有实际用处。 @Alin 答案总是一样的:不要在输出内容后开始会话。这个问题已经以几乎所有可能的形式回答了很多次。 @deceze 我确定之前已经回答过了,但请提供样本。和“输出内容后不要开始会话”。至少在他的情况下,可能并不像听起来那么容易。 @Alin:不在乎。如果 OP 懒得使用搜索,我为什么要搜索一个不错的副本?另外,是否对此表示赞同? 【参考方案1】:

在开始会话之前,您必须有一些回显的文本。尝试删除 session_start() 之前的任何输出,或将该函数移至 offline_header.php

【讨论】:

如果错误出现在 2 行,那么我会同意。错误发生在 84 行,因此与启动会话无关。 -1.【参考方案2】:

如果您在错误生成文件的第 15 行之前提供了代码,那就太好了。 无论如何,这个错误是由 session_start() 或其他 header() 函数被调用之前完成的输出引起的。

不管它是否是您的输出(如回显、打印等),它也可能是错误消息(通知、警告)的输出,可以在以前的主机上关闭,但现在它们出现在您调用之前一些头文件功能...

您应该检查第 15 行的代码以及所有代码,然后再检查它是否产生错误或直接输出...

希望对你有帮助。

【讨论】:

请阅读问题。他知道错误在哪里以及为什么。他在问下一步该怎么做。此外,如果您看一下,您会发现 PHP 在这里被用作嵌入式语言,因此输出到处都是,而不是来自错误或丢失的空白。 @Alin:他只是认为,他不确定......我给了他一个线索要搜索什么 - 在调用 header() 之前输出或通知/警告......那就是他应该做什么。一些输出必须在其他文件中完成,而不是在提供的文件中 - 错误是由 session_start() 引起的,但第一个输出可能在第 15 行的 offline_header.php ... 第一个输出在主文件&lt;div id="right_menu"&gt; :) 由于先前的输出,无法设置标题时会给出错误。【参考方案3】:

如错误所示,一旦标头已发送,您就无法修改标头信息(这是header 函数所做的)。标题在您第一次输出文本时发送。

在第 84 行之前,您有多个输出文本的位置(例如第 61、63 和 65 行),并且您包含的文件中可能有更多机会。这意味着您不能在这些行之前使用 header 函数,或者可能在该 else 分支中的任何包含调用之前使用。

你应该重构你的代码来放置

if (isset($_POST['submit'])) ...

作为else分支中的第一件事,在知道查询是否成功之前不要输出任何html或其他文本,以便知道是否要重定向到索引页面。

【讨论】:

以上是关于标题警告[重复]的主要内容,如果未能解决你的问题,请参考以下文章

删除带有警告的重复项

使用 printf 时的警告 [重复]

lint 警告:parseInt 缺少基数参数 [重复]

PCH警告:标题停止不能在宏或#if块中[重复]

如何修复代码分析警告[重复]

如何忽略声纳重复代码块警告