ob_start()和ob_end_flush()的PHP头问题

时间:2010-01-30 18:39:11

标签: php header

我在页面开头使用ob_start()并在结尾使用ob_end_flush()时遇到标题问题。因为我在执行某些查询后使用了头函数。

 ob_start();
 include_once("header.php");
 global $db;

 $countstmt="SELECT COUNT(*) FROM tbl_lib_hours dh WHERE book_id IN(SELECT book_id FROM tbl_book WHERE user_id=".$_SESSION['uid'].") ";       
 $delHourExist=$db->query($countstmt);  
 if($delHourExist){
      header("location:edit_delivery_hours.php");
 }
 ....
include_once('footer.php');
ob_end_flush();

header.php 中,我还添加了 ob_start(); ,并在 footer.php 中添加了 ob_end_flush(); ,但我认为这不是问题,尽管其他页面使用我在上面写的相同脚本运行

我得到的错误:

  

警告:无法修改标题信息 - 已在第9行的D:\ xampp \ htdocs \ project \ add_book_hours.php中发送的标题

5 个答案:

答案 0 :(得分:5)

第一个<?php之前是否有空格?

文件开头是否有UTF8-BOM?

答案 1 :(得分:3)

您的代码中有很多不可见的输出:

<?php ob_start();?> --- THERE IS A LINE RETURN HERE ---
--- SPACES OR TABS ---<?php include_once("header.php"); ?> --- LINE RETURN ---
--- AND HERE ---<?php global $db;
     ...

退出开始和结束你的php标签。就这样做:

<?php 
    ob_start();
    include_once("header.php");
    global $db;
    ...

在调用ob_start()之前,请确保没有输出,标签外没有空格。如果您的错误在第9行,那么在调用之前您可能会遇到很多行,这可能是问题所在。您可能希望发布所有这些编号的行,以便我们仔细查看。

答案 2 :(得分:3)

我有点困惑,警告消息不包括导致第一个内容被发送到客户端的代码的位置。函数headers_sent()也可以返回该位置。因此,出于调试目的,请尝试

if($delHourExist)
{
  if ( headers_sent($path, $lineno) ) {
    echo '<pre>Debug: output started at ', $path, ':', $lineno, "</pre>\n";
  }
  header("location: edit_delivery_hours.php");
}

答案 3 :(得分:0)

我认为问题可能是您在已经向输出发送了其他内容之后尝试更改标题。即使使用缓冲,我也不认为这是可能的。我认为你需要调用ob_end_clean()来丢弃当前缓冲区并写入标题信息。

答案 4 :(得分:0)

我使用ob_start()解决了脚本中的一些空格问题。 ob_end_flush()函数;和ob_end_clean(); 所以你可以测试你的代码

<?php
ob_start();
include_once("header.php");

global $db;
$countstmt="SELECT COUNT(*) FROM tbl_lib_hours dh WHERE book_id IN(SELECT book_id FROM tbl_book WHERE user_id=".$_SESSION['uid'].")";
$delHourExist=$db->query($countstmt);  
if($delHourExist)
{
ob_end_flush();
ob_end_clean();
header("location:edit_delivery_hours.php");
}
include_once('footer.php');
?>

<?php ob_start(); include_once("header.php"); global $db; $countstmt="SELECT COUNT(*) FROM tbl_lib_hours dh WHERE book_id IN(SELECT book_id FROM tbl_book WHERE user_id=".$_SESSION['uid'].")"; $delHourExist=$db->query($countstmt); if($delHourExist) { ob_end_flush(); ob_end_clean(); header("location:edit_delivery_hours.php"); } include_once('footer.php'); ?>