파일정보꺼내기

-주의점-
파일정보에 관련된 함수들은모두 그 결과가 메모리에 저장되어 있는 것들이므로, 항상 위의 함수를 사용하기 전, 후에는 clearstatcache함수를 호출하여 메모리를 비워주어야 한다.


stat
-지정된 파일의 여러가지 정보를 배열로 저장해 주는 함수
이 함수만으로도 파일에 대한 대부분의 정보를 가져올 수 있다
저장될 배열 = stat ("파일이름");

배열원소 7 - 파일의 크기
배열원소 8 - 마지막으로 접근된 시간 (유닉스타임스탬프)
배열원소 9 - 마지막으로 수정된 시간 (상동)

stat함수에서 리턴된 배열은 배열원ㅅ 0-12까지 13개의 정보를 저장하고 있지만
실제로 우리가 사용하는 정보는 위의 3가지 이다.


임의의 test.txt 파일을 서버루트에 만들고
우리가 만든 test.txt파일을 stat함수로 꺼내보자
<?
$file = stat("test.txt");
echo "
파일크기 : $file[7] <br>
마지막 접근시간:$file[8] <br>
마지막수정시간:$file[9] ";
?>
결과는
파일크기 : 13
마지막 접근시간:1232376054
마지막수정시간:1232376054

<?
$file = stat("test.txt");
echo "
파일크기 : $file[7] <br>
마지막 접근시간: ".date('Y-m-d H:i:s', $file[8])." <br>
마지막수정시간: ".date('Y-m-d H:i:s', $file[9]);
?>
결과는
파일크기 : 13
마지막 접근시간: 2009-01-19 23:40:54
마지막수정시간: 2009-01-19 23:40:54



filesize
-파일의 크기를 구하는 함수
filesize ("파일이름");

<?
echo filesize("test.txt");
?>



fileatime
-파일의 마지막 접근 시간을구하는 함수
fileatime("파일이름");

<?
echo date ('Y-m-d H:i:s', fileatime("test.txt"));
?>
결과는 2009-01-19 23:40:54




filemtime
-파일의 마지막 수정시간을 구하는 함수
filemtime ("파일이름");



fileperms
-파일의 퍼미션을 구하는 함수
fileperms ("파일이름");

<?
echo fileperms("test.txt");
?>
결과는 33206
->우리가 알고 있는 707(8진수) 이런 모양이 아닌데
그것은 함수가 10진수의 퍼미션을 알려주기 때문이다.
진수변경함수인 base_convert함수를 사용하여 10->8진수로 변경해야 한다

<?
$perms= fileperms("test.txt");
echo base_convert ($perms, 10, 8);
?>
결과는 100666
-> 퍼미션은 666 이다




file_exists
-어떤 파일이 존재하는지 알아보는 함수
존재하면 true, 없으면 false를 리턴
file_exists ("파일이름");

<?
echo file_exists("test.txt");
?>
결과는 1










디렉토리생성

mkdir("디렉토리이름", 퍼미션)

<?
mkdir ("a", 0777);
?>
결과 디렉토리a가 생성된 걸 알 수 있다.

다시 한번 위 예제를 실행하면 에러가 나는데
이미 존재하는 디렉토리를 또 생성할 수 없기때문

에러 메시지를 안 보이게 하려면 함수 앞에 @를 붙여주면 된다.

<?
@mkdir ("a", 0777);
?>



디렉토리삭제
rmdir ("디렉토리이름");

<?
@rmdir ("a");
?>



디렉토리열기
저장할변수=opendir("디렉토리이름");

<?
$result = opendir("test");
while ($file=readdir($result)){
 echo "$file <br>";
}
closedir($result);
?>
결과는
.
..
index.php.bak
login.php.bak
logout.php
logout.php.bak
result.php
result.php.bak
->test폴더 안에 있는 파일들의 이름을 출력해준다

만약 현재파일이 있는 서버의 루트 (d:\root)의 파일을 열려고 한다면
opendir의 디렉토리 이름에 ./라고 넣어주면 되고
상위디렉토리를 열기 위해서는 ../ 을 사용한다.

opendir을 이용하여 디렉토리 정보를 열어준 것은 디렉토리핸들 이라고 한다
이는 디렉토리의 위치를 잡아준것이다.
그 후 디렉토리핸들을 이용하여 디렉토리정보를 꺼내야하는데
이때 사용되는 것이 readdir함수이다

저장될 변수 = readdir("디렉토리핸들");





split함수는
explode함수처럼 문자열을 배열로 만들어주는 함수이지만
역시 정규표현식의 사용이 가능하다는 점이 다르다.

저장될 배열 = split ("정규표현식", 문자열);
-> 정규표현식에 통과되는 패턴을 기준으로 배열을 나누어 저장될 배열에 저장한다

<?
$a="a0b1c2d";
$b=split ("[0-9]", $a);
echo "$b[0] $b[1] $b[2] $b[3]";
?>
결과는 a b c d












ereg_replace함수는 정규 표현식을 이용하여 문자열을 치환할 수 있다.

저장될 변수 = ereg_replace ("정규표현식", "치환될문자", 문자열);
->정규표현식에 해당되는 패턴부분이 치환될 문자로 치환된다


<?
$a="abcde";
$b=ereg_replace ("[b-d]", "x", $a); //b에서 d까지의 문자를 x로 치환

echo $b;
?>
결과는
axxxe



이메일주소와 홈페이지주소 자동링크
이메일주소 정규표현식을 이용하면쉽게 자동링크를 시켜 줄수가 있다.
우선 이메일주소는 어떤문장속에 있는 것이기 때문에
정규표현식에서 시작과 끝을 의미하는 ^와 $는 제거한다.
그리고 자동링크를 위해
ereg_replace함수에 정규표현식을 넣어준다.

<?
$ex="^[-_a-z0-9]+(\.[-_a-z0-9]+)*@[_a-z0-9]+(\.[_a-z0-9]+)+$";
$b=ereg_replace($ex, " ", $a);
?>
그런데 여기서 무어으로 치환해 주어야 할까?
ereg_replace함수에서는 \\라는 특수문자를 사용하여 정규표현식에 해당하는
패턴의 내용을 그대로 사용할 수가 있는데,
\\0은 전체의 내용을 그대로 받아오게 한다

<?
$a="제 이멜주소는 naver@nate.com 입니다";
$ex="[-_a-z0-9]+(\.[-_a-z0-9]+)*@[_a-z0-9]+(\.[_a-z0-9]+)+";
$b=ereg_replace($ex, "<a href='mailto:\\0'>\\0</a>", $a);
echo $b;
?>

홈페이지주소도 마찬가지로 하면된다
<?
$a="제 이멜주소는 naver@nate.com 입니다";
$b="제 홈페이지 주소는 http://taeker.com 입니다";
$ex="[-_a-z0-9]+(\.[-_a-z0-9]+)*@[_a-z0-9]+(\.[_a-z0-9]+)+";
$ex2="http://[_a-z0-9]+(\.[_a-z0-9]+)*(/[^\\\/:\*\"<>\|]+(\.[^\\\/:\*\"<>\|]+)*)*/?";
$c=ereg_replace($ex2, "<a href='\\0' target=_blank>\\0</a>", $b);
echo "$c ;
?>









<?
$a="navy@nate.com";
$ex="^[-_a-z0-9]+(\.[-_a-z0-9]+)*@[_a-z0-9]+(\.[_a-z0-9]+)+$";
echo eregi($ex, $a);
?>


홈페이지주소
$ex="^http://[_a-z0-9]+(\.[_a-z0-9]+)*(/[-a-z0-9]+(\.[-a-z0-9]+)*)*/?$


디렉토리/파일명에 해당하는 부분은 서버명과는달리
\, /, :, *, ", <, >, | 이외의 문자는 모두 올 수 있으므로 [^]을 이용하여 보자
$ex="^http://[_a-z0-9]+(\.[_a-z0-9]+)*(/[^\\\/:\*\"<>\|]+(\.[^\\\/:\*\"<>\|]+)*)*/?$


<?
$a="http://naver.com/index.php";
$ex="^http://[_a-z0-9]+(\.[_a-z0-9]+)*(/[^\\\/:\*\"<>\|]+(\.[^\\\/:\*\"<>\|]+)*)*/?$";

echo eregi($ex, $a);
?>
결과는 1

정규표현식 Regular Expression
-어떠한 값이 특정한 형태를 갖는지 검사하는 도구
주로 폼에 입력된 데이터를 검사하기 위해 이용됨

예를들어, 숫자로 된 값만을 취하여 할때라거나,
이메일 주소가 형식에 맞는지 검사할때 등


문자열이 포함되어 있는가? ereg, eregi
-문자열에 어떤 문자가 포함되어 있는가를 검사하는 함수
저장될 변수 = ereg ("검사할문자", "검사대상문자열");

검사후 포함되어 있다면 TRUE
불포함이면 FALSE를 리턴한다.

<?
$a="abced";
echo ereg ("b", $a );
?>
결과는 1


<?
$a="abced";
echo ereg ("B", $a );
?>
결과는 없음


<?
$a="abced";
echo eregi ("B", $a );
?>
결과는 1
->ereg는 대소문자를 구분하지만
 eregi는 대소문자를 구분하지 않는다



시작과 끝 ^, $
^ - 문자열의 시작을 의미
$ - 문자열의 끝을 의미


<?
$a="abced";
echo eregi ("^a", $a );
?>
결과는 1

<?
$a="abc";
echo ereg ("c$", $a );
?>
결과는 1

대상문자열이 abc 일때 결과를 보자
^a - a로 시작하는 문자열 -> true
c$ - c로 끝나는 문자열 -> true
^ab - ab로 시작하는문자열 -> true
abc - abc를 포함하는 문자열 ->true
^abc$ - abc인 문자열 -> true



문자의 반복 *, +, ?
* - 0개 또는 1개이상
+ - 1개 또는 1개이상
? - 0개 또는 1개

abc* -> ab뒤에 c가 0개 또는 1개 이상이는 문자열을 말함 예>ab, abc, abcc, abccc.....
abc+ -> ab뒤에 c가 1개 또는 1개 이상있는 문자열 -> 예>abc,abcc, abccc....
abc? -> ab뒤에 c가 0개 또는 1개 있는 문자열  예> ab, abc

<?
$a="abccc";
echo ereg ("abc*", $a );
?>
결과는 1


반복횟수의 지정 {}
*,+,? 대신 {}를 사용하여 문자의 반복을 결정해 줄 수 있다.
문자{최소개수, 최대개수}

예를들어
abc{1,2} 라고하였다면 ab뒤에 c가 1개 또는 2개가 있다는 것으로 abc, abcc를 의미함

여기서 최소 개수는 꼭 적어주어야 하지만 {1, }와 같이 최대 개수를 적어주지 않으면
1개또는 1개 이상을 뜻하게 되고

{3}과 같이 하나의 숫자만을 적어 주었다면 3개만을 나타나게 된다


 연산자 {}로 표현 
 * {0, } 
 +  {1, }
 ?  {0, 1}

<?
$a="abccc";
echo ereg ("abc{2,3}", $a );
?>
결과는 1




문자열의 지정 ()
a 뒤에 bc 가 2개에서 3개 있는 문자열을 지정하기 위해서는 a(bc){2,3} 으로
b,c를 묶어준다.

<?
$a="abcbc";
echo ereg ("a(bc){2,3}", $a );
?>
결과는 1



OR연산 |
대상문자열이 abc 라고 할때
^a | c$ - a로 시작하거나 c로 끝나는 문자열 ->true
^(ab) | (bc)$ - ab로 시작하거나 bc로 끝나는 문자열 -> true

<?
$a="abc";
echo ereg ("^a | b$", $a );
?>
결과는 1



어떤한문자 .
특정한 문자가 아닌 어떤 하나의 문자를 의미하는 연산자로 . 이 있다.

예를들어
.{3} 을 보면 .은 하나의 문자를 의미하므로 .{3}은 3개의 문자를 말한다.
그런데 .{3}이라고만 하면 3개의 문자를 포함한다는 얘기이므로 4개의 문자라도 true가 된다
그렇기에 정확히 3개의 문자로 지정하기 위해 ^와 $를 붙여준다
^.{3}$

<?
$a="abc";
echo ereg ("^.{3}$", $a ); //3개의 문자로 구성된 문자열
?>
결과는 1

<?
$a="abcd";
echo ereg ("^a.{2}d$", $a ); //a와 d사이에 2개의 문자가 있는 문자열
?>
결과는 1



사용 가능한 문자열의 지정 []
예를들어 생년월일을 입력받는데 숫자로만 입력받고 싶다면?
또는 알파벳이나 특수문자를 구분하여 검사할때 사용하는 것이 []이다.

[abc] - abc로만 이루어진 문자열
[a-c] - a에서 c까지의 문자로만 이루어진 문자열
[a-z] - a에서 z까지의 문자로만 이루어진 문자열
[A-Z] - A에서 Z까지의 문자로만이루어진 문자열
[a-zA-Z] - a에서 z까지와 A에서 Z까지의 문자로만 이루어진 문자열
[0-9] - 0에서 9까지의 문자로만 이루어진 문자열
[!@#_0-9] - !, @, #, _  와 0에서 9까지의 문자로만 이루어진 문자열

<?
$a="a3";
echo ereg ("^[a-z][0-9]$", $a ); //a에서 z사이의 한 문자로 시작하고 0에서 9사이의 한 숫자로 끝나는 문자열
?>
결과는 1


<?
$a="abc123";
echo ereg ("^[a-z]{3}[0-9]{3}$", $a ); //a에서 z사이의 문자 3개로 시작하고 0에서 9사이의 숫자 3개로 끝나는 문자열
?>
결과는 1



사용불가능한 문자열의 지정 [^]

[^abc] - a, b, c를 포함하지 않는 문자열
[^a-c] - a에서 c까지의 문자를 포함하지 않는 문자열
[^a-z] - a에서 z까지의 문자를 포함하지 않는 문자열
[^A-Z] - A에서 Z까지의 문자를 포함하지 않는 문자열
[^a-zA-Z] - a에서 z까지와 A에서 Z까지의 문자를 포함하지 않는 문자열
[^0-9] - 0에서 9까지의 숫자를  포함하지 않는 문자열
[^!@#_0-9] - !, @, #, _ 와 0에서 9까지의 숫자를 포함하지 않는 문자열

<?
$a="3a";
echo ereg ("^[^a-z][^0-9]$", $a ); //a에서 z사이의 한 문자로 시작하지 않고 0에서 9사이의 한 숫자로 끝나지 않는 문자열
?>
결과는 1




특수문자의 사용
?가 0개 또는 1개 있는 문자열을 검사한다면 다음과 같을 것이다.
??

위의 정규표현식을 검사하는 예제를 보자

<?
$a="3a";
echo ereg ("^[^a-z][^0-9]$", $a ); // ?가 0개 또는 1개있는 문자열
?>
결과는 에러발생

왜냐하면 ?가 특수문자가 아닌 연산자로 인식되기 때문
즉 ??라고 하면 ? 뒤에 ?연산자가 아니라,
?연산자를 두번 적은것으로 인식되기 때문에 에러가 발생하는 것
이렇게 ?를 연산자가 아닌 특수문자로 지정하기 위해서는 앞에 \를 붙여준다

?이외에도 ^ . [ $ ( ) | + { } \ 와 같은 문자를 연산자가 아닌 특수 문자로 사용하기 위해서는 앞에 \를 붙여주면 된다

그리고 []에 ]를 포함하기 위해서는
[]a-z]와 같이 ]를 가장 처음에 넣어주고,
-는 [-a-z]와 같이 가장 처음이나 [a-z-]와 같이 가장마지막에 넣어주면 된다

<?
$a="?";
echo ereg ("\??", $a ); //?가 0개 또는 1개가 있는 문자열
?>











<?
session_start();

if ($HTTP_SESSION_VARS[counter_session]) {
 $counter_session = $HTTP_SESSION_VARS[counter_ssion]+1;
 session_register (counter_session);
}

else {
 $counter_session = 1;
 session_register(counter_session);
}

$counter =$HTTP_SESSION_VARS[counter_session]+1;
echo "$counter 번째로 방문입니다.";
?>


세션이란
 클라이언트가 서버에 접속해 있는 상태를 말하는 것,
방문자가 웹브랑저를 열어 서버에 접속하고, 다시 웹프라우저를 닫아 서버와의 연결을 종료하는 하나의 단위를 세션이라 한다.

먼저 세션을 시작하면, 서버에서는 세션 아이디라는 것을 생성한다.
이는 클라이언트에게 각각의 유일한 세션 아이디를 부여하여클라이언트를 구분하는 기능을 한다.

그리고 부여한 세션아이디는 클라이언트의 쿠키에 저장된다.
기본적으로 PHPSESSID라는 쿠키로세션아이디가 저장되는데, 이 쿠키의 값으로 세션 아이디가 들어가는 것이다.
그리고 서버측에서는 세션을 저장하는 곳에 그 세션 아이디를 이름으로 갖는 파일을 하나 생성하며, 그 파일에 세션 아이디에 해당하는 클라이언트의 세션 정보가 저장되게 된다.


apm설치할때 수정하는 php.ini
을 보면 세션에 관한 내용이 있다.

[Session]
session.save_handler = files

session.save_path = "d:/temp" //세션이 저장될 경로
session.use_cookies = 1 //클라이언트의 쿠키로 세션 아이디를 저장함

session.name = PHPSESSID //세션아이디를 저장할 쿠키 이름

session.auto_start = 0 // 자동으로 세션을 시작함

session.cookie_lifetime = 0 // 세션아이디를 저장할 쿠키의 폐기시간

session.cookie_path = /   //세션 아이디를 저장할 쿠키 경로

session.cookie_domain =        //세션 아이디를 저장할 쿠키의 도메인


위의 설정을 setcookie함수로 정리해 보면 다음과 같다
setcookie ( "PHPSESSID", "세션아이디", 0, "/", "");



세션의 시작 session_start
세션을 사용하기 전에는 session_start함수를 호출하여, 세션이 시작되는 것을 알려주어야함. 주의할 것은 쿠키와 마찬가지로 세션은 헤더데이터이므로,
세션을 사용하기 전에 어떠한 출력이 있으면 안됨.
session_start();
세션스타트 함수를 호출하고 난다음에 세션을 사용할 수 있다.


세션의 등록 session_register
세션스타트 함수를 호출한 다음 세션을 등록해야 하는데,
쿠키에서의 setcookie의 기능과 비슷하지만 형식은 다르다
$변수명 = "값";
session_register (변수명);

세션을 등록하기 위해서는 일단 변수를 하나 만들고, 값을 넣어준 다음
session_register함수를 호출하고, 매개변수로 변수명을 넣어준다.
이때 변수명에서 $를 제외하고 넣어주어야 하며, 이렇게 되면 변수명에 해당하는 세션이 등록되고 , 그 세션의 값으로 변수의 값이 들어간다.

$변수명1 = "값1";
$변수명2 = "값2";
session_register (변수명1, 변수명2);
위와 같이 여러개를 한번에 세션으로 등록할 수도 있다.



<?
session_start();
$test="세션예제";
session_register(test);
?>

<?
echo $HTTP_COOKIE_VARS[PHPSESSID];
?>
결과 dcd93aff8941d6340285850ea58269c4
->세션아이디를 확인 할 수 있다. 이것은 곧 생성된 파일명앞에 sess_ 를 붙인것과 같다


<?
session_start();
echo $test;
?>
결과 세션예제
->세션의 값을 출력할 수 있다.

<?
session_start();
echo $HTTP_SESSION_VARS[test];
?>
위 위의 예제처럼 $test를 변수로 사용하면, 'index.php?test=값' rhk rkxdms
get방식의 접근에서 엉뚱한 값이 사용되는 경우가 있으므로
$test의 값이 아닌 $HTTP_SESSION_VARS라는 환경변수를 사용한다.




세션의 삭제 session_unregister
$변수명 = "";
session_unregister (변수명);

<?
session_start();
$test="";
session_unregister (test);
 ?>
이렇게 하고 난후
<?
session_start();
echo $HTTP_SESSION_VARS[test];
?>
위처럼하여 test의 세션값을 확인하려고 하면
아무값도 출력이 안되는 걸 알 수 있다. (세션을 삭제했기에)

세션은 삭제되었지만 세션파일이 그대로 남아있는 걸 알 수 있는데
그것은 세션이 폐기되지 않았기 때문이다.



세션의 폐기 session_destroy
-세션을 폐기한다는 것은 세션파일이 저장되는 경로에서 세션파일을 삭제한다는 것이다
클라이언트가 웹브라우저를 종료하여 세션을 종료하였다고 하더라도
서버의 입장에서는 세션이 종료되었는지 알 수 없으므로 이 세션 파일을 계속해서 남아있게 된다.
이때 강제적으로 세션파일들을 삭제하기 위해 session_destroy함수를 사용한다.

<?
session_start();
session_destroy();
?>
실행해보면 세션 파일이 삭제되는 것을 알 수 있다.


php.ini을 다시 보자

session.gc_probability = 1 //세션파일삭제작업을 몇%의 비율로 실행할 것인지를 결정
session.gc_maxlifetime = 1440 //지정된 시간(초)이 지난 세션은 삭제 대상으로 간주함

위 두가지 함수는 우리가 session_destroy함수로 일일이
세션 데이터를 삭제하지 않아도, 자동으로 데이터들을 삭제하도록 설정해주는 것으로
즉 위의 조건하에서는
1440초 (24분)이 지난 세션파일은 폐기 대상으로 간주하겠다는 것이고,
매번 세션을 시작할때, 전체의 1%의 비율로 폐기 작업을 실행한다는 것이다.

예를들어 비율이 1%이고, 세션 작업을 하는 페이지를 100번 실행한다고 하면
100번중 1번만 세션폐기 작업을 실행하게 되는 것이다.
물론 100으로 해주면 100번 모두 폐기 작업을 실행하지만
그만큼 서버의 부하는 늘어나게 된다.

 

쿠키카운터만들기
<?
if ($HTTP_COOKIE_VARS[counter_cookie]) {
 setcookie ("counter_cookie", $HTTP_COOKIE_VARS[counter_cookie]+1, 30*24*60*60+time(), "/");
}
else {
 setcookie ("counter_cookie", 1, 30*24*60*60+time(), "/");
}

$counter = $HTTP_COOKIE_VARS[counter_cookie]+1;
echo "$counter 번째로 방문하셨습니다.";


?>
카운터쿠키변수가 존재하면 1을 증가시켜주고 없으면 카운터쿠키를 생성하여 1값을 넣어준다.









회원로그인만들기
login.php
<?
if (!$HTTP_COOKIE_VARS[member]) {
 echo "
<form method='post' action='check.php'>
비밀번호 : <input type='password' name='pass' size='10'><br>
<input type='submit' value='로그인'>
</form>";
}

else {
 echo "로그인이 되어 있습니다 <br>
 <a href='logout.php'>로그아웃</a>";
}
?>




check.php
<?
$member_pass = "1234";

if ($pass == $member_pass) {
 setcookie("member", "$pass", 0, "/");
 header ("location:login.php"); //쿠키를 구워준후 헤더함수를 이용하여 다시 login.php페이지로 이동하도록 한다
}
else {
 echo "비밀번호가 다릅니다";
}

?>


logout.php
<?
setcookie ("member", "", 0, "/");
header ("location:login.php");
 ?>











php에서는 쿠키와 세션을 가지고 인증을 한다.

쿠키
-클라이언트에 데이터를 저장하였다가 서버의 요청에 의해 다시 서버로 보내주는 정보

세션
-컴퓨터 간의 연결이 이루어진 시점부터 연결을 끊을 때까지의 기간



쿠키란?
-방문자의 컴퓨터에 어떠한 정보를 저장해 놓는 것을 말한다.
어떤 사이트에 로그인을 하면 사용자 컴퓨터에 쿠키를 저장해 놓고 그 쿠키를 갖고 있는지를 확인하여 회원인지 아닌지 판단한다.
쉽게 생각하여 학교에서 학생들을 쉽게 알아보기 위해 가슴에 이름표를 달아 주는데, 그것이 바로 쿠키이다.

쿠키굽기
setcookie (이름, 값, 폐기시간, 경로, 호스트, 보안사용);
주로 이름,값,폐기시간,경로 네가지 매개변수만 많이 사용된다.

이름-쿠키의 이름

값-쿠키의 값

폐기시간- 쿠키의 폐기시간(주로 유닉스타임스탬프를 사용하며, 0일때는 웹브라우저가 닫히
면서 쿠키가 사라진다. 적지 않으면 0과 같은 효과)

경로 - 쿠키가 적용될 경로 ( /로 설정하면 서버의 루트 하위의 폴더에 모두 적용)

호스트 - 쿠키가 적용될 호스트 이름

보안사용- HTTPS프로토콜에 의한 보안 접속시에만 쿠키굽기


<?
echo "잘못된 예제";
setcookie("test", "123");//테스트라는 이름의 쿠키에 123이라는 값을 넣어준다는 뜻
?>
위 예제는 에러가 나는데 그 이유는
setcookie함수는 header함수와 마찬가지로 함수 호출전 어떠한 출력문도 오면 안되기 때문이다.
이런 에러를 방지하기 위해서는
ob_start라는 함수를 호출하여 출력버퍼링을 사용해야 한다.

ob_start함수
-이 함수는 출력버퍼링이라는 기능을 사용하도록 해주는 함수
이 함수를 페이지의 첫 부분에 사용하면 출력문의 출력 내용을 출력하지 않고, 페이지의 내용을 모두 처리한 다음에 비로소 출력문의 내용을 출력한다.
때문에 header, setcookie, session함수와 같이 출력문이 있기 이전에 사용되어야 하는
함수의 이전에 출력문이 있는 경우라면
ob_start함수를 호출하면 에러없이 잘 작동하게 된다


<?
ob_start (); //출력버퍼링시작
echo "잘못된 예제";
setcookie("test", "123");
$print=ob_get_contents(); //버퍼의 내용을 $print에 저장
ob_end_clean (); //버퍼를 비움
echo $print; //출력
?>
결과는 잘못된 예제
->ob_start함수로 출력 버퍼링을 실행하여 실제로 에코문에서의 출력내용은 출력되지 않고 출력버퍼에 저장된다. 그렇기에 셋쿠키함수가 에러없이 호출되며, 셋쿠키 함수처리가 끝난 후 ob_get contents함수를 호출하여 출력버퍼에 저장된 내용을 $print변수에 저장하고, ob_end_clean함수를 호출하여 출력버퍼링을 종료하고 출력버퍼를 비워주게 된다. 마지막으로 $print를 출력해주면 출력버퍼에 저장되어있던 내용이 화면에 출력된다.
물론 위 과정 없이 소스의 가장 처음에 ob_start함수만 호출해주어도 소스는 이상없이 실행된다.

<?
ob_start (); //출력버퍼링시작
echo "잘못된ss 예제";
setcookie("test", "123");
?>
->잘 실행됨


<?
setcookie ("a", "123", 60 + time(), "/");
?>
60초 동안만 쿠키가 존재하며, 60초 이후에는 쿠키가 사라진다.
하루동안 쿠키를 주려면 24*60*60 + time() 으로 주면된다.

/
서버의 루트를 말함, 그 하위 모든 폴더의 문서에서 그 쿠키를 꺼내올 수 있게 한다.
만약 /test 라고 하였다면 테스트 하위에서는 그 쿠키를 꺼내올 수 있으나, 그 상위폴더에서는 꺼내 올 수 없게된다.


쿠키값체크
<?
setcookie("test", "123", 60+time(), "/");
echo $test;

?>
결과는 123


<팁>
폼에서 넘어온 post, get 방식의 변수와 쿠키 변수의 사용에 관한 우선 순위는
php.ini의
gpc_order라는 부분에서 결정된다. g(get), p(post), c(cookie)
기본적으로 gpc라는 값으로  설정되어 있기에 겟방식으로 넘어온 변수를 가장 먼저 처리하고 쿠키변수를 가장 마지막에 처리한다.
cpg로 바꾸면 반대로 처리되며, pg와 같이 해주면 쿠키변수는 처리하지 않게 된다



쿠키값확인
$HTTP_COOKIE_VARS[쿠키이름]


<?
setcookie("test", "123", 60+time(), "/");
echo $HTTP_COOKIE_VARS[test];
?>
결과는 123

위의 예제를 바로 수정하여
<?
$test=456;
echo $HTTP_COOKIE_VARS[test];
?>
이라고 하였다면 1분동안은 123이라고 나오지만
곧 1분후에는 아무값도 출력되지 않는다.
쿠키변수와 일반변수는 다르기에


쿠키값의 삭제
쿠키를 삭제해주는 명령어나 함수는 존재하지 않기에
셋쿠키함수를 이용하여 같은 이름의 쿠키를 빈값으로 구워주는 것으로 쿠키를 삭제할 수 있다.

<?
setcookie ("test", "", 0, "/");
?>
쿠키이름을 test로 하여 빈값을 넣고, 시간을 0으로 주어 브라우저가 닫히면서
test라는 쿠키가 완전히 사라지도록 해주었다.

<?
setcookie ("test", "", time(), "/");
?>
폐기시간을 time()으로 해주면 페이지가 실행된 후 1초가 지나면 바로 폐기시간이 되어 쿠키는 완전히 사라진다.



쿠키의 문제점
-웹프로그램에 있어서 시간이라는 것은 서버의 시간과, 클라이언트의 시간으로 나누어 생각할 수 있는데,
우리가 쿠키를 구울 때 사용하는 time()함수는 서버의 시간을 기준으로 현재 시간을 가져온다.
그러나 쿠키의 폐기 시간이 되었는지 확인하는 것은 바로 클라이언트로,
폐기의 유무는 클라이언트시간을 기준으로 판단하는 것이기에
서버시간과 클라이언트 시간이 다르면 쿠키에 있어서 문제가 발생할 수 있다.

예를들어 서버시간이 1시1분0초에 60초 동안 쿠키를 구워주었다고 하자
그런데 클라이언트시간은 서버시간보다 2분이 빠른 1시3분0초였다.
쿠키는 1시2분0초까지 살아있게 되는데
클라이언트 시간은 이미 1시3분0초이므로 절대 쿠키가 구워지지않는 현상이 발생한다.

물론 쿠키의 폐기시간을 0으로 해주었다면 쿠키는 잘 구워진다.

그 다음문제로 쿠키의 값이 삭제가 되지 않는 문제인데, 위의 경우와 반대로, 서버의 시간이 클라이언트의 시간보다 빠르다면 쿠키는 우리가 정해진 시간에 폐기되지 않게 된다.
















+ Recent posts