세션과 쿠키에서 자주 발생 되는 오류~


간혹 세션과 쿠키 때문에 아래와 같은 오류가 종종 발생한다.

Warning: Cannot modify header information - headers already sent by
(output started at /파일이름.php:라인번호) in /파일.php on line 번호

짧은 지식으로 해석해보자면

경고 : 헤더 정보를 수정할 수 없습니다 - 헤더가 이미 보내졌습니다.
(/파일이름.php파일의 몇번째 라인에서 출력이 시작되었습니다.)
/파일.php 파일의 몇 번째 라인에서 에러가 났심

즉, 세션과 쿠키는 헤더가 선언되기전에 문자가 출력이 되어서는 안된다는 뜻이다.

왜 그런고보니 아래의 출처를 보면 kyn810410님께서 자세히 설명을 해주셨다.

출처 : 네이버 오픈백과

왜 오류를 일으킬까?

그 이유는 세션이나 쿠키는 자신의 일을 수행함에 있어 헤더를 수정하여 사용하기때문입니다..

수정하여 사용하여야 되는데 이미 어떤값이 출력된 상태이면 헤더가 이미 사용되었기때문에
수정이 불가능한 상태로 되버려서 수정할수가 없기때문에 오류가 생기는 거죠..

아하~ 그렇다 그래서 <HEAD> 다음에 어떠한 문자라도 출력된 다음에 세션이나 쿠키에 저장하려고
하면 저런 에러가 나는 것이다.

참고로 정말 찾기 힘든 오류 중에 하나가 아래와 같은 경우 일 것이다.

<?
$a = 1; // 변수값설정
?>


<?
set_session("a",$a); // 세션함수콜
?>

위와 같은 경우도 에러가 난다.
세션 전에 $a = 1;과 같이 변수값 설정은 에러가 나지 않는다.
실제로 화면에 출력(HTML코드로 출력)되지 않기 때문이다.

그렇다면 왜 에러가 나느냐 하면 PHP 시작과 끝을
알리는 ?> <? 이것 사이에 [엔터]라는 빈공간이 삽입 되어서이다.
즉, 아래와 같은 경우도 에러난다.


<?
set_session("a",1); // 세션함수콜
?>


파일의 제일 맨 위에도 빈 공간(엔터)이 들어있어서는 안된다. 이것 때문에 하루종일 시간을 허비한 적도 있다.


요점정리

세션과 헤더에 저장을 할 때는 헤더가 선언되기 이전에 절대로 어떤 문자의 출력도 허용하지 말라!

단, echo와 같이 HTML 문자 출력을 제외한 PHP 명령어 들은
세션과 헤더 저장하기 전에 사용해도 무방하다!


Powered by Tattertools