쿠키카운터만들기
<?
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으로 해주었다면 쿠키는 잘 구워진다.

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
















php에서 지원하는 암호와 방법은 crypt, md5를 이용하는 것인데
이들은 모두 문자열을 암호화하여 리턴하는 함수이며
암호화된 것을 해독하는 역함수가 존재하지 않는 단방향 암호화함수이다.
그러므로 암호화를 한 다음에는 아무도 원래의 내용이 무엇인지 알 수 없다.

md5 ( message digest algorithm 5 )
-RSA 암호 개발자가 개발한 메시지 다이제스트 함수 알고리즘으로 주로 데이터의 오류 검출에 이용

Hash
-특정한 데이터를 고정 길이의 유일한 값으로 대응되도록 하는것



crypt함수
-유닉스계열에서 기본적으로 지원하는 암호화 방식으로
입력받은 키 값에 의존하여 암호화한 후 저장될 변수에 저장
여기서 키 값이란 암호화를 하는데 있어서 의존하는 값으로, 키 값에 따라 암호화된 결과는 다르게 나타나며, 키 값은 두개의 문자로 이루어져야 한다.
저장될 변수 = crypt (문자열, 키값);

<?
$a="abcde";
echo crypt($a, "1a");
?>
결과는 1a8AAA/amoVDA
->결과는 13자리로 동일하다

<?
$a="abcde";
echo crypt($a, "2z");
?>
결과는 2z6wBLPW0IjT6
->암호화된 결과물의 맨 앞 두자리는 키값이 들어가게 됨

키 값에 한자리만 넣게 되면
나머지 한자리에는 $로 채우게 된다
->예> 키 값을 2로 넣으면 그 값은 2$ 로 주었을때와 동일하다.

키 값을 넣지 않으면 임의의 키 값을 실행하며 , 그 결과는 계속 다르게 나타난다.



md5
-실제로 암호화라기 보다는 단순히 어떠한 내용의 hash값을 계산해주는 것으로
crypt와 마찬가지로 해독방법이 존재하지 않는 단방향암호화 함수이다.

저장될 변수 = md5 (문자열);

<?
$a="abcde";
echo md5($a);
?>
결과는 ab56b4d92b40713acc5af89985d4b786
->결과는 32자리


<?
$a="abcdefgh";
$b="abcdefghi";

echo crypt ($a, 12). "<br>";
echo crypt($b,12)."<br>";
echo md5($a). "<br>";
echo md5($b). "<br>";
?>
결과는
12cmzKaxhUaiY
12cmzKaxhUaiY
e8dc4081b13434b45189a720b77b6818
8aa99b1f439ff71293e95357bac6fd94

->변수a는 8자, 변수b는 9자 이다
변환할 결과를 보면
크립트는 8개의 문자열만 취하고 나머지는 잘라 버린 후에 암호화한다는 것을 알 수 있다.
반면 md5는 8자 이상의 문자열을 지원한다.


<?
$a[0]="안녕";
$a[1]="어서";
$a[2]="반갑";

//백만분의 1초로 난수발생
////마이크로타임에 백마을 곱해 정수로 만들어 줌
mt_srand ( (double)microtime()*1000000 );

$result = mt_rand (0,2);
echo "$result <br>";
echo $a[$result];
?>
결과는
1
어서

배열a에 문자열대신
<img src='이미지'>와 같이 사용하면 랜덤이미지를 구현할 수 있다

rand - 정해진 범위에서 하나의 수를 결정하여 리턴
srand - 난수 발생 간격을 결정
getrandmax - 발생할 수 있는 난수의 최대 범위를 리턴

<?
echo getrandmax();
?>
결과는32767
->즉 0~32767의 수중 하나를 뽑을 수 있다는 말이다.

저장될 변수 = rand (최소값, 최대값);

랜드함수는 srand함수와 함께 사용되야 그 기능을 제대로 발휘할 수가 있다.

<?
//백만분의 1초로 난수발생
////마이크로타임에 백마을 곱해 정수로 만들어 줌
srand ( (double)microtime()*1000000 );

$result = rand (0,100);
echo $result;
?>


mt_rand, mt_srand, mt_getrandmax
- 함수들 앞에 mt 라는 문자를 붙여놓은 함수는
Mersenne Twister알고리즘을 이용하여 난수를 발생시키는 함수로
rand함수보다 속도가 네배정도 빠르고 더 큰 범위의 난수를 만들어 주며
사용형식은 랜드함수와 동일하다.

<?
echo mt_getrandmax();
?>
결과는
2147483647
->2147483647개의 수중에서 하나의 수를 뽑을 수 있다는 말이다.

<?
//백만분의 1초로 난수발생
////마이크로타임에 백마을 곱해 정수로 만들어 줌
mt_srand ( (double)microtime()*1000000 );

$result = mt_rand (0,100);
echo $result;
?>























특정일로부터의날짜
<?
/////////////////////////현재의 시간정보를 구함
$now = time();//유닉스 타임 스탬프
$hour = date('H'); //현재의 시간
$min = date ('i');
$sec= date ('s');

//////////////////////////기념일의 유닉스타임스탬프를 구함
$day = mktime($hour, $min, $sec, 11,1,1983);

///////////////////////////유닉스 타임스탬프의 차를 구함
$result = $now - $day;

//////////////////////////결과를 날짜로 환산 후 출력
///////////////////유닉스타임은 초단위이기에 86400 (=24시간*60분*60초) 으로 나눠줘야
///////////날짜단위가 된다
$result = $result / 86400;
echo "기념일로 부터 $result 날이 지났습니다.";

?>


특정일까지의 날짜
<?
/////////////////////////현재의 시간정보를 구함
$now = time();//유닉스 타임 스탬프
$hour = date('H'); //현재의 시간
$min = date ('i');
$sec= date ('s');

//////////////////////////기념일의 유닉스타임스탬프를 구함
$day = mktime($hour, $min, $sec, 11,1,1983);

///////////////////////////유닉스 타임스탬프의 차를 구함
$result = $now - $day;

//////////////////////////결과를 날짜로 환산 후 출력
///////////////////유닉스타임은 초단위이기에 86400 (=24시간*60분*60초) 으로 나눠줘야
///////////날짜단위가 된다
$result = abs($result / 86400);
echo "기념일까지 $result 날이 남았습니다.";

?>

microtime
-백만분의 1초까지 측정한 시간 값을 알려주는 함수로
결과값은 공백을 사이로 두고 "소수점이하의 초" "자연수 형태의 초" 의 형식을 가지며
자연수 형태의 초는 유닉스 타임스탬프값이 된다.
저장할 변수 = microtime ();

<?
$time = microtime();
echo $time;
?>
결과는
0.34375200 1231772417
->백만분의 1초까지 측정한 결과 0.34375200 초가 측정되었고,
현재 유닉스 타임스탬프값은1231772417 라는 뜻이다.


위 두개의 값을 각각의 변수에 저장하려면?
<?
$time = explode (" ", microtime() );//공백을 기준으로 마이크로타임변수를 나눔

echo "
microtime : $time[0] <br>
time : $time[1]";
?>
결과는
microtime : 0.42187700
time : 1231772622

[참고]더 간단하게 구하는 방법
<?
echo (double)microtime();
?>



mktime
- 현재의 시간을 기준으로 유닉스타임스탬프를 구하는 것이 아니라,
주어진 시간을 기준으로 유닉스타임스탬프를 구하는 함수
저장할변수 = mktime (시간, 분, 초, 달, 날짜, 년도);

<?
$time = mktime (9,10,15, 11,1, 1977);
echo $time;
?>
결과는
247191015

<?
$time = date (' Y m d H i s', 247191015);
echo $time;
?>
결과는
1977 11 01 09 10 15


checkdate
-지정된 날짜가 실제 존재하는지 확인하고 그 결과를 빈값(false) 또는 1(True)로 리턴해준다
저장될 변수 = checkdate(달, 날짜, 년도);

<?
echo checkdate(2,29,2002);
?>
결과는 없음

<?
echo checkdate(2,28,2002);
?>
결과는 1
->존재하는 날짜임을 증명
















date(시간형식);
주의! 대소문자구분함

<년도관련>
L-윤년인지의 여부표시 예> 0 또는 1
Y-년도를 4자로 표시 예> 2009
y-년도를 2자로 표시 예>09


<달 관련>
F - 달을 영문으로 표시 예>January
m - 달을 숫자로 표시 예>01,02,03....12
M - 달을 3글자로 표시 예>Jan
n - 달을 0없이 표시 예>1,2,3...12
t - 몇일까지 있는 달인지를 표시 예>28,30,31


<날짜관련>
d - 날짜를 두 자리로 표시 예> 01,02,03...31
j - 날짜를 0없이 표시 예>1,20....31
S - 순서를 나타내는 2글자의 접미사로 표시 예>st, th, rd
z - 해당년도의 몇번째 날일지를 표시 예> 0~365



<요일관련>
D - 요일을 세글자로 표시 예>Fri
l(소문자L) - 요일을 표시 예>Friday
w - 요일을 숫자로 표시 예> 0(일), 1(월)...6(토)



<시간관련>
h - 시간을 12시간 단위로 표시 예>01,02 ....12
H - 24시간 단위로 표시 예>00,01....23
g - 12시간 단위로 0없이 표시 예>1,2,...12
G - 24시간 단위로 0없이 표시 예>0,1,2,...23
y - 년도를 2자로 표시 예>09


<분관련>
i - 분을표시 예>00,01 ....59


<초관련>
s - 초를 표시 예>00,01 ....59



<기타>
r - 몇가지 정보를 종합하여 표시 예> Fri, 5 Apr 2002 21:54:51 +0900
U - 기준시점(GMT 1970년 1월 1일 00:00:00)으로부터 지난 시간을 초로 표시
Z - 지역간의 시간 편차를 초 단위로 표시 예> -43200~43200

<?
$time = date('Y년도 m월 d일 H시 i분 s초'  );
echo $time;
?>
결과는
2009년도 01월 12일 23시 43분 47초


date(시간형식, 유닉스타임스탬프);

<?
$time = date('Y년도 m월 d일 H시 i분 s초',0 );
echo $time;
?>
결과는
1970년도 01월 01일 09시 00분 00초
->유닉스타임스탬프는 1970.1.1 9시부터 몇시간이 지났는지 알려주는 값이다
(유닉스타임스탬프는 시간을 다룰때 기본적으로 사용되는 중요한 값,
몇자리숫자 하나로, 그 순간의 년도, 월, 날짜, 시간,분,초 등 모든 정보를 알 수 있기 때문)

<?
$time = date('Y년도 m월 d일 H시 i분 s초',1018002274 );
echo $time;
?>
결과는 2002년도 04월 05일 19시 24분 34초





time함수
-유닉스타임스탬프를 구하기 위해 주로 사용하는 함수
저장할변수 = time ();

<?
$time = time(); //현재의 유닉스 타임스탬프를 구한후 변수에 저장하고 출력하는 예제
echo $time;
?>
결과는 1231771933















반올림
지정될변수 = round(소수, 자릿수);

<?
$b=round(1.55,1);
echo "$b";
?>
결과는 1.6

<?
$b=round(1.55);
echo "$b";
?>
결과는 2
->자릿수를 적지 않으면 , 소수 0째자리 즉 정수의 형태로 반올림한다



올림
지정될변수= ceil(소수);

버림
지정될변수= floor(소수);


거듭제곱
저장될변수 = pow (진수, 지수);

<?
$b=pow(3,2);//3의 2제곱
echo "$b";
?>
결과는 9


제곱근 square root
저장될 변수 = sqrt (제곱근값);

<?
$b=sqrt(2);
echo "$b";
?>
결과는 1.41421356237


삼각함수
저장될변수 = sin(값);
저장될변수 = cos(값);
저장될변수 = tan(값);
저장될변수 = asin(값);
저장될변수 = acos(값);
저장될변수 = atan(값);

<?
$a= sin(0);
$b=cos(0);
$c=tan(0);

echo "
sin0= $a <br>
cos0= $b <br>
tan0= $c";

?>
결과는
sin0= 0
cos0= 1
tan0= 0


최대값 max
max(값1, 값2, 값3......);
max(배열);
//배열의 원소중 가장 큰 원소 찾을때

<?
$a= array(1,2,3,4,5);
echo max($a);

?>
결과는 5

최소값 min
min(값1, 값2, 값3......);
min(배열);
//배열의 원소중 가장 작은 원소 찾을때



진법변환 base_convert
저장될 변수 = base_convert (변환할 값, 값의 진법, 변환할진법);

<?
$a= base_convert (9,10,2); //10진수 9를 2진법으로 변환
echo $a;

?>
결과는 1001




절대값 abs
저장될변수 = abs(값);

<?
echo abs(-10);
?>
결과는 10




두수의 차 ^

<?
echo 1^3 //1과 3의 차
?>
결과는 2
->즉 abs(1-3) 과 같다고 보면된다.




숫자의 형태변환 number_format
저장될변수 = number_format (숫자, 소수점자리, 솟점에 사용할 문자, 콤마대신 사용할문자);

<?
echo number_format(1000000);
?>
결과는 1,000,000
->아무옵션도 안넣고 숫자를 넣으면 3자리마다 콤마로 표시해줌을 알 수 있다.

예제
콤마대신에 *넣고
소수점대신에 $넣고
그 뒤에 소수점둘째자리까지 표현하기

<?
echo number_format(1000000,2,"$", "*");
?>
결과는 1*000*000$00








문자열을 배열로 만들기explode
-변수에 저장된 문자열을 임의의 구분자를 사용하여 배열로 만들어 주는 함수
저장될 배열 = explode (구분자, 문자열);

예를들어 공백을 구분자로 하여 배열을 만들면
$a="문자열을 배열로 만들기";
$b= explode( " ", $a);

이렇게 하게되면
$b[0]=문자열을
$b[1]=배열로
$b[2]=만들기
가 된다


<?
$a="문자열을/배열로/만들기";
$b= explode( "/", $a);

echo "$b[0] $b[1] $b[2] $b[3] $b[4] $b[5]";
?>
결과는
문자열을 배열로 만들기

배열을 문자열로 만들기implode
저장될변수 = implode (구분자, 배열명);

<?
$a[0]="배열을";
$a[1]="문자열로";
$a[2]="만들기";

$b=implode(" ", $a);

echo "$b";
?>
결과는
배열을 문자열로 만들기






























+ Recent posts