这是我的第二页,我的第一页是下载按钮
<?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)in /home/content/59/8131259/html/leadyourtran/offer1/admin/downld.php on 第8行
和
警告:无法修改标头信息 - 已发送的标头 (输出始于 /home/content/59/8131259/html/leadyourtran/offer1/config.php:6)in /home/content/59/8131259/html/leadyourtran/offer1/admin/downld.php on 第9行
我的第8行和第9行都只是标题。
答案 0 :(得分:1)
header()
之类的{p> session_start()
必须在任何输出或html代码之前调用。如果在header()
之前包含的文件中有输出(或警告错误),则会导致这些错误。
检入你的config.php第6行(在错误消息中指定)。
答案 1 :(得分:0)
尝试添加,
ob_start();
位于php文件的顶部。
如果默认情况下您的output_buffering
为Off
并且您不幸将单个字节的数据发送回客户端,则您的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,这些Cookie会作为HTTP标头传递)。
一旦必须发送任何数据,就会发送标题 - 即,只要有任何输出,即使是<?php ?>
标记之外的一个空格:
注意:如果您使用的是基于cookie的 会议,你必须打电话 session_start()在任何事情之前 输出到浏览器。
ob_start
表示PHP必须缓冲数据:
此功能将变为输出 缓冲。输出缓冲 处于活动状态,没有从中发送输出 相反,脚本(标题除外) 输出存储在内部 缓冲液中。
这样,在您实际说“发送数据”之前,不会发送输出。这意味着标题不会立即发送 - 这意味着session_start
可以稍后调用,即使应该有输出,如果没有使用ob_start
。
希望这会让事情变得更清晰......