BLOG main image
전체 (276)
[Computer] (42)
[Programming] (62)
[DBMS] (26)
[Operating System] (21)
[Study English] (8)
[For money] (28)
[Interest] (89)
«   2009/11   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
77890 Visitors up to today!
Today 82 hit, Yesterday 46 hit
'Cookie'에 해당되는 글 2건
[폭주기관차, 2009/09/14 16:33, [Programming]/PHP]

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

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 명령어 들은
        세션과 헤더 저장하기 전에 사용해도 무방하다!
Trackback Address :: http://kongmks.cafe24.com/trackback/301
곰아멍해봐 | 2009/11/12 23:22 | PERMALINK | EDIT/DEL | REPLY
형 C 언어랑 자바 독학하기 좋은책있나요? ㅋ 있으면 1청 홈피에서 쪽지로 좀 가르쳐주세요 /ㅁ/
제가 누군지는 닉네임 확인을 ㅎ
Name
Password
Homepage
Secret
[폭주기관차, 2008/03/18 20:22, [Programming]/JavaScript]
//쿠키 초 단위로 설정하는 함수
function setCookieTime(name, value, mSecond) {
    var today  = new Date();
    var expire = new Date(today.getTime() + mSecond);

    window.document.cookie = name + "=" + escape(value) + ((expire) ? ";path=/; expires=" + expire.toGMTString() : "");
}

// 날짜 단위로 설정하는 함수
function setCookie(name, value, days) {
    setCookieTime(name, value, days * 24 * 60 * 60 * 1000);
}

// 쿠키 읽어오는 함수
function getCookie(uName) {
    var strCookie = " " + window.document.cookie;
    var ptrFr = strCookie.indexOf(" " + uName + '=');

    if (ptrFr != -1) {
        ptrFr = ptrFr + uName.length + 2;
        ptrTo = strCookie.indexOf(';', ptrFr);

        if (ptrTo == -1) {
            ptrTo = strCookie.length;
        }
        return unescape(strCookie.substring(ptrFr, ptrTo));
    } else {
        return "";
    }
}


사용 예제)

setCookie( "Tester", "234", 30 );

var Tester = getCookie( "Tester" );

alert( Tester );


이렇게 사용하면 Tester에 234라는 값이 들어가게 된다.

이 쿠키의 setCookieTime의 window.document.cookie에 들어가는 값을 보면
window.document.cookie = "쿠키이름=쿠키의값;path=/;expires=유효기간;domain=도메인";

이렇게 되어있다.

path는 이 쿠키의 값을 읽어올 수 있는 경로의 범위이다. path값을 안넣어주면
이 쿠키가 설정되는 문서의 위치의 디렉토리와 하위디렉토리까지 문서에서만 사용할수가 있게 된다.
즉, 만약 상위 디렉토리에 있는 문서에서 이 쿠키값을 가져올 수가 없는 것이다.
path로 '/'를 주게 되면 루트 도메인에서부터 하위 디렉토리 전체에서 이 쿠키값을 사용할 수 있게 된다.
이 것을 모르고 2일 간을 고생했다.(괜히 쿠키 버그 탓 하고 있었다..ㅡㅡ;;)

도메인은 위의 경로처럼 한 사이트에서 만든 쿠키가 다른사이트에 영향을 주지 않으므로 적용될 도메인을
기록하면 된다. 생략하면 자동으로 사이트의 기본 도메인으로 설정된다.

유효기간은 설정하지 않으면 익스플로워를 닫을때까지 유효하게 된다.


그리고 생성된 쿠키의 값을 보면

*
Tester
234
www.test.co.kr/
1600
3762760832
29884808
1686902864
29881791
*


이렇게 들어가져있는 것이 보인다.
처음에는 쿠키 이름, 쿠키의 값, 쿠키가 적용될 사이트 이름, 그 밑으로는 아마 유효기간이나 기타 등등
정보가 저장된 듯 하다.

자세한건 책을 좀더 찾아봐야할 것 같고 여기서는 간단하게 쿠키를 자바스크립트로 저장하고 불러오는것만
알아보았다.

참고 : 굄돌님의 블로그 글
       황로거님의 블로그 글
       이명헌 경영스쿨
Trackback Address :: http://kongmks.cafe24.com/trackback/286
Name
Password
Homepage
Secret
*1