2013-08-11 4 views
1

이것은 내 첫 번째 페이지다운로드 헤더는

<?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> 

내가 다운로드 버튼을 클릭, 그이 오류

에게 보여주는 다운로드 버튼 내 2 페이지입니다 경고 : 헤더 정보 (헤더가 이미 ( /home/content/59/8131259/html/leadyourtran/offer1/config.php:6에서 시작됨)가 /home/content/59/8131259/html로 전송 된 것으로 수정할 수 없습니다./leadyourtran/offer1/admi 라인 n은/downld.php 8

경고 : 헤더 정보를 수정할 수 없습니다 - 이미 에 의해 전송 헤더 (출력 /집/컨텐츠에서 시작/8,131,259분의 59/HTML/leadyourtran/offer1/config.php를 : 6) /home/content/59/8131259/html/leadyourtran/offer1/admin/downld.php 9

라인 에 내 라인 8 및 9에 모두 헤더입니다 한 명 와이.

+0

는 일반적으로이 오류가 발생합니다. 이 페이지는 이미이 주제를 다룹니다 : http://stackoverflow.com/questions/8028957/headers-already-sent-by-php/8028987#8028987 – Cameron

+0

하지만 내 코드에서 무엇을하고 있습니까 ?? –

+0

config.php 파일에 echo 문이있을 수 있습니다. 파일을 확인하십시오. – Cameron

답변

1

header() 등의 출력 또는 HTML 코드보다 먼저 session_start()을 호출해야합니다. header() 이전에 포함 된 파일에 출력이 있거나 경고 오류 인 경우 이러한 오류가 발생합니다.

config.php의 6 행 (오류 메시지에 지정)을 확인하십시오.

0

시도하여 PHP 파일의 상단에

ob_start(); 

추가.

기본적으로 output_bufferingOff이고 1 바이트의 데이터를 클라이언트에 보내면 불편하므로 HTTP 헤더가 이미 전송되었습니다. session_start()이 쿠키 헤더를 다시 클라이언트로 전달하지 못하게합니다. ob_start()을 호출하면 버퍼링이 활성화되므로 http 헤더를 보내는 데 시간이 걸립니다. 도 arround를 다른 방법 -은 "일반적인 경우"나는 ob_startsession_start 전에 호출 할 수 있다고 생각하지 않습니다에서 다른 답변에서 차용

,

.

그래도 manual page of session_start을 인용 : 트랜스 SID가 활성화되면 재기록 URL 내부 출력 핸들러를 등록한다

으로 session_start을(). 사용자가 ob_gzhandler를 사용하거나 ob_start()와 같은 경우 출력 핸들러의 순서는 적절한 출력을 위해 이 중요합니다. 예 : 의 경우 세션 시작 전에 ob_gzhandler를 등록해야합니다.

그러나 이것은 출력 핸들러의 순서가 중요하다는 것을 의미합니다. 한 핸들러가 다른 핸들러를 수정하도록하려면, 다른 핸들러에서 수정해야합니다. "올바른 순서. 당신이 핸들러 그런 종류의 사용하지 않는 (아파치를하고 출력을 압축에 관해서 mod_deflate는 예를 들어, 좋은 일을 할) 경우


일반적으로, 중요한 유일한 것은 헤더가 아니어야한다는 것입니다 당신이
(구성에 따라, session_start는 HTTP 헤더로 전달 된 쿠키를 전송하기 때문에) session_start호출하기 전에 보냈습니다.

그리고 헤더 데이터의 조각으로 즉시 전송은 전송되어야한다 - 즉, 즉시 모든 출력, <?php ?> 태그 밖에서도 하나의 공백이 같이

참고 : 당신이 경우 쿠키 기반 세션을 사용하는 경우 브라우저에 이 출력되기 전에 session_start()를 호출해야합니다. 이 함수는 버퍼링 출력 바뀔 것이다

:

ob_start

은 PHP가 데이터를 버퍼링하는 것을 나타낸다. 출력 버퍼링이 활성화되어 있지만 스크립트 (헤더 제외)에서 출력이 보내지지 않는 대신 출력은 내부 버퍼에 저장됩니다. 실제로, " 데이터을 보내"자신을 말을하기 전에

이 방법은, 출력이 전송되지 않습니다. 즉, 헤더는 즉시 전송되지 않습니다. 즉, ob_start을 사용하지 않은 경우 나중에 출력 할 수 있더라도 session_start을 나중에 호출 할 수 있습니다. 모든 출력이 사용자에게 전송되기 전에 헤더 문을 표시해야하기 때문에이 조금 더 명확 일을하게


희망 ...