【问题标题】:download header showing an error on my server下载标头在我的服务器上显示错误
【发布时间】:2013-08-11 15:37:38
【问题描述】:

这是我的第二页,我的第一页是下载按钮

<?php
session_start();

//user not logged in, no direct access
if (!isset($_SESSION['user'])) header("location:../admin/");

include "../config.php";
if(isset($_POST['downld'])) {
header( "Content-Type: application/vnd.ms-excel" );
header( "Content-disposition: attachment; filename=emc_promo_".date("m-d-Y").".xls" );
$q="select * from emc_leadgen2 order by emc_time_date desc  ";
$r=mysql_query($q);
$count=mysql_num_rows($r);
if($count>0) {?> 
<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
<head>
<meta http-equiv="Content-type" content="text/html;charset=utf-8" />
</head>
<body>
<table cellpadding="3" cellspacing="0"  border="1" >    
<tr><td colspan="8" align="center"><b>Lead Gen Form for EMC on <?=date("m-d-Y")?></b></td></tr>  
<tr>
<td style="padding:5px;"><b>FIRST NAME</b></td>
<td style="padding:5px;"><b>LAST NAME</b></td>
<td style="padding:5px;"><b>NAME OF ORG.</b></td>
<td style="padding:5px;"><b>JOB TITLE</b></td>
<td style="padding:5px;"><b>MAIL</b></td>
<td style="padding:5px;"><b>PHONE</b></td>
<td style="padding:5px;"><b>ADDRESS</b></td>
<td style="padding:5px;"><b>STORAGE</b></td>
<td style="padding:5px;"><b>TIME & DATE</b></td>
</tr>
<?php while($row=mysql_fetch_array($r)) {?>
<tr>
<td style="padding:5px;"><?=$row['emc_fname']?></td>
<td style="padding:5px;"><?=$row['emc_lname']?></td>
<td style="padding:5px;"><?=$row['emc_organization']?></td>
<td style="padding:5px;"><?=$row['emc_job_title']?></td>
<td style="padding:5px;"><?=$row['emc_email']?></td>
<td style="padding:5px;"><?=$row['emc_phone']?></td>  
<td style="padding:5px;"><?=$row['emc_address']?></td>
<td style="padding:5px;"><?=$row['emc_storage']?></td>
<td style="padding:5px;"><?=$row['emc_time_date']?></td>
</tr>
<?php
}
}
}
?>
</table>
</body>
</html>

当我点击下载按钮时,它显示此错误

警告:无法修改标头信息 - 标头已由 (输出开始于 /home/content/59/8131259/html/leadyourtran/offer1/config.php:6) 在 /home/content/59/8131259/html/leadyourtran/offer1/admin/downld.php 上 第 8 行

警告:无法修改标头信息 - 标头已由 (输出开始于 /home/content/59/8131259/html/leadyourtran/offer1/config.php:6) 在 /home/content/59/8131259/html/leadyourtran/offer1/admin/downld.php 上 第 9 行

我的第 8 行和第 9 行都只是标题之一。

【问题讨论】:

标签: php header


【解决方案1】:

header()session_start() 一样,必须在任何输出或 html 代码之前调用。如果您在 header() 之前包含的文件中有输出(或警告错误),则会导致这些错误。

检查您的 config.php 第 6 行(在错误消息中指定)。

【讨论】:

    【解决方案2】:

    尝试添加,

    ob_start();
    

    在您的 php 文件的顶部。

    如果默认情况下您的output_bufferingOff,并且您不幸将单个字节的数据发送回客户端,那么您的HTTP 标头已经发送。这有效地阻止了session_start() 将 cookie 标头传递回客户端。通过调用ob_start(),您可以启用缓冲,从而延迟发送 http 标头。

    借用另一个答案,

    在“正常情况”中,我认为 ob_start 不必在 session_start 之前被调用 -- 反之亦然。

    引用manual page of session_start,虽然:

    session_start() 将在内部注册 用于 URL 重写时的输出处理程序 trans-sid 已启用。如果用户使用 ob_gzhandler 或与 ob_start() 类似, 输出处理程序的顺序是 对正确的输出很重要。为了 例如,用户必须注册 会话开始前的 ob_gzhandler。

    但这是一种特殊情况:这里的问题是,输出处理程序的顺序很重要:如果您希望一个处理程序修改另一个处理程序所做的事情,它们必须在“正确”中执行顺序。


    通常,如果您不使用那种处理程序(例如,Apache 和 mod_deflate 在压缩输出方面做得很好),唯一重要的是标题不能在您调用session_start 之前发送(因为,根据您的配置,session_start 发送 cookie,它们作为 HTTP 标头传递)

    只要需要发送任何数据,就会发送标头——即,只要有任何输出,即使是&lt;?php ?&gt; 标签之外的一个空格:

    注意:如果您使用的是基于 cookie 会议,你必须打电话 session_start() 在任何事情之前 输出到浏览器。

    ob_start表示PHP要缓存数据:

    这个函数将输出 缓冲上。输出缓冲时 处于活动状态 没有输出从 脚本(除了标题),而不是 输出存储在内部 缓冲区。

    这样,在您自己说“发送数据”之前,不会发送输出。这意味着标头不会立即发送 - 这意味着 session_start 可以在以后调用,即使应该有输出,如果 ob_start 没有被使用。


    希望这能让事情更清楚一点...

    【讨论】:

      猜你喜欢
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多