2009-06-12 5 views
1

저는 처녀 (처음)이므로 천천히 입력하십시오.PHP가 setcookie에 실패했습니다

페이지가 새로 고침 될 때마다 회전 할 이미지 수 bg_001.jpg, bg_002.jpg 등이 있습니다. 나는 이기에, setcookie있는 행 되

Warning: Cannot modify header information - headers already sent by (output 
started at /home2/.../about.php:7) in /home2/.../about.php on line 31 

라인 (31)을 얻을 대신 쿠키의

if (isset($_COOKIE["bg1"])) { 
    $img_no = $_COOKIE["bg1"] + 1; 
} else { 
    $img_no = 1; 
} 
$filename = 'bg_' . sprintf("%03d", $img_no) . '.jpg'; 
if (!file_exists("/img/" . $filename)) { 
    $img_no = 1; 
    $filename = 'bg_' . sprintf("%03d", $img_no) . '.jpg'; 
} 
setcookie("bg1", $img_no, time() + 86400); 
print '<img src="img/' . $filename . '" alt="" height="175" width="800"> '; 

: 나는 이것을 시도했다. 이미 유니 코드의 BOM에 문제가있는 PHP에 대한 포인터를 찾았지만 문제를 해결하는 방법을 알지 못합니다 (처음에는 문제가있는 경우). 공식적으로 사용하려면 (그리고 "진짜 질문이 아님"을 피하십시오.) 어떻게 수정해야합니까? :-)

제 코드에 대한 건설적인 비판도 환영합니다.

는 에필로그 :
는 일반적인 초보자의 오류처럼 보였다 : 십오분 내에서 동일한 솔루션을 향해 몇 가지 답변을. 고마워. guyz/galz.

그래서 인쇄을 제외한 모든 부분을 파일의 시작 부분으로 옮겼습니다. 실제로는 수정되었습니다.

+1

모든 사람의 머리글 우선 순위에 추가하려면 해당 페이지에서 7 번 줄을 확인하십시오. 그것이 출력 범인입니다. – Galen

+0

라인 7? ''와 같이 ?? – stevenvh

+0

솔직히 "7"이 줄 번호를 참조한다고는 생각하지 못했습니다. (다른 오류/경고 코드는 무엇입니까?) 같은 메시지에서 줄 번호를 나타내는 데 두 가지 다른 방법을 사용하는 이유는 무엇입니까? "... php : 7"대 "... php on line 31" – stevenvh

답변

8

이전에 보낸 정보가없는 경우에만 쿠키를 보낼 수 있습니다. 즉, PHP 파일의 첫 번째 내용은 <?php이어야하며, 무언가가 첫 번째 <?php (예 : <html>)보다 먼저 나오면 php가 전송하기 때문에 그 부분 (두려운 UTF-8 BOM조차도) 전에 아무것도 얻을 수 없습니다. 브라우저 용 데이터와 데이터를 보낸 후에는 setcookie를 사용할 수 없습니다. 이 같은 것을보고 코드를 리팩토링 : 메모장 등의 편집기는 파일의 첫 번째 <?php 전에 UTF-8 BOM 서명을 넣어하지 않았다

 
<?php 
(...) 
setcookie(...) 
(...) 
?> 
<HTML> 
(...) 
</HTML> 

그리고 한 번 확인.

3

헤더 (요청/응답 정보)와 콘텐츠 (실제 텍스트 또는 이진 콘텐츠)는 별도로 설정되며 머리글은 콘텐츠보다 우선해야합니다.

쿠키를 설정하면 실제로 헤더 응답에 명령이 추가되므로 콘텐츠 출력을 시작하기 전에 쿠키를 수정해야합니다.

페이지의 시작 html 요소 앞에 쿠키를 참조하는 코드를 모두 옮기면됩니다.

0

를 보라 등의 session_start()은 여전히 ​​기타 콘텐츠 앞에 와야 할 필요가 있지만 쉽게 데이터 구조를 저장 할 수 있습니다 - -

<?php 
    ob_start(); 
    // ... my code here 
?> 
<html></html> 
<?php 
    // ... end of the file 
    ob_end_flush(); 
?> 
0

오류는/당신이있어 경고하는 것은 모든 것을 말해 : 헤더가 이미이 출력이 이미 이기에, setcookie() 메소드 w 전에 브라우저로 전송되었음을 의미

전송됩니다 전화로.

출력물이 브라우저에 전송되기 전에 쿠키가 "설정되어야"하는 것을 이해할 수 있습니다.

약 7시에 확인하십시오. 거기에 HTML 코드가 있거나 인쇄 또는 에코 콜이 필요할 수 있습니다.