PHP 웹 프로그래밍 (PHP Web Programming) 세션 (Session) 문양세 강원대학교 IT대학 컴퓨터과학전공
세션 변수 (Session Variable) (1/2) 쇼핑몰 장바구니 장바구니에서는 사용자가 페이지를 이동하더라도 장바구니의 구매 물품 리스트의 내용을 유지하고 있어야 함 PHP에서 사용하는 일반적인 변수는 스크립트의 수행이 끝나면 모두 없어지기 때문에 페이지 이동 시 변수의 값을 유지할 수 없음 이러한 문제점을 해결하기 위해서 PHP에서는 세션(session)을 제공
세션 변수 (Session Variable) (2/2) 일반 변수와 세션 변수 일반 변수 지역 변수(local variable): 변수의 범위는 한 함수의 내부로 제한 (함수 내부) 전역 변수(global variable): 변수가 속하는 스크립트가 실행되는 동안 값을 유지 (스크립트 내부) 세션 변수 전역변수보다 더 큰 범위 동안 값을 유지 (문서 간에도 범위 유지) 명시적으로 변수를 없애지 않는 한 그 값을 유지
전역 변수 vs. 지역 변수 (1/2) 프로그램 예제 (g_l_var1.php) 프로그램 실행 결과 세션 (Session) 프로그램 예제 (g_l_var1.php) <?PHP function A () { global $n; $n = “A”; $m = “A”; print “$n, $m<br>”; } $n = “M”; $m = “M”; A (); ?> 프로그램 실행 결과 M, M A, A A, M 위 프로그램에서 함수 A() 안에서 $n은 전역 변수로, $m은 지역 변수로 사용 따라서, 함수 A()를 호출하고 나서 $n의 값은 변했지만 $m은 변하지 않음
전역 변수 vs. 지역 변수 (2/2) 프로그램 예제 (g_l_var2.php) 프로그램 실행 결과 세션 (Session) 프로그램 예제 (g_l_var2.php) <?PHP function A() { global $n; print $n.”<br>”; } function B() $n = “B”; // local variable A(); $n = “M”; // global variable B(); ?> 프로그램 실행 결과 M 함수 B()에서 $n은 지역 변수이므로, 적용 결과($n = “B”)가 스크립트의 전역 변수인 $n에 영향을 주지 않음에 유의
세션 변수를 사용하기 전에 … 1. “php.ini” 파일에서 다음을 수정합니다. 세션 (Session) 1. “php.ini” 파일에서 다음을 수정합니다. 2. APM 설정에서 오른편과 같이 수정합니다. 3. 아파치를 재시작합니다.
세션 변수의 예제 (1/2) page1.php page2.php 세션 (Session) page1.php page2.php 상기 프로그램(page1.php page2.php)을 실행하면 아무것도 출력되지 않음 전역 변수는 한 스크립트가 끝나면 그 변수가 소멸되기 때문 따라서 세션 변수를 사용하여 변수 값을 유지하는 방법을 이용해야 함 <?PHP $G = “This is a Global variable”; ?> <a href=“./page2.php”>다음페이지</a> <?PHP print $G; ?>
세션 변수의 예제 (2/2) 세션을 이용한 예 (page_session1.php, page_session2.php) session_register(‘G’); $G = “This is a Global variable”; ?> <a href=“./page_session2.php”>다음페이지</a> <?PHP session_start (); print $G; ?>
세션 변수의 선언 (1/5) session_register() session_start() 세션 변수를 등록할 때 사용하는 함수임 name 은 세션 변수의 이름이 되며, 이 함수를 한번 사용하여 여러 개의 변수를 한꺼번에 등록시킬 수 있음 session_start() 세션 변수의 사용을 시작할 때 사용하는 함수임 세션이 시작되면, 세션이 정의된 모든 세션 변수는 전역 변수로 선언되어 짐 bool session_register (mixed name [, mixed ...]) bool session_start (void)
세션 변수의 선언 (2/5) session_id() session_save_path() session_id() 함수를 이용하여 현재 사용자의 세션 ID를 알 수 있음 session_save_path() 지정되어 있는 PATH로 이동하면 sess_ 로 시작하는 파일에 저장 string session_id ([string id]) string session_save_path ([string path])
세션 변수의 선언 (3/5) session_id() 예제 (session_id.php) <?PHP session_register (‘session_var’); $session_var = “This is a Session variable”; print “세션ID: “ . session_id (); ?>
세션 변수의 선언 (3/5) session_save_path() 예제 (session_save_path.php) print “세션의 저장 위치: “ . session_save_path (); ?> Let’s see C:/APM_Setup/temp
세션 변수의 선언 (4/5) 배열형 변수의 세션 등록 (arr_session.php, arr_session_view.php) session_register (‘fruit’); $fruit = array (“Apple”, “Banana”, “Pear”, “Orange”); ?> <a href=“./arr_session_view.php”>확인</a> <?PHP session_start (); foreach ($fruit as $fr) print “$fr<br>”; ?>
세션 변수의 선언 (5/5) 세션 (Session) 실행 결과: 배열형 변수의 세션 등록
세션의 조작 (1/3) session_unregister() session_unset() session_destroy() name: 등록을 취소하고자 하는 변수의 이름 등록이 성공적으로 취소되었을 때 TRUE를 리턴 session_unset() 등록된 변수들의 값을 초기화(initialization) session_destroy() 등록된 변수들을 파괴 (destruction) bool session_unregister (string name) void session_unset (void) bool session_destroy (void)
세션의 조작 (2/3) 세션 변수의 등록 취소 (session_reg_unreg1/2.php refresh 시켜본다.) session_register (‘var1’); session_register (‘var2’); $var1 = “Variable1”; $var2 = “Variable2”; session_unregister (‘var2’); ?> <a href=“./viewvar.php”>확인 페이지</a> session_unregister() 함수를 이용하여 $var2를 제거 <?PHP session_start (); print “$var1<br>”; print “$var2”; ?>
세션의 조작 (3/3) 세션 (Session) session_unset(), session_destroy()의 사용 예 (session_mani1/2/3.php refresh 시켜본다.) <?PHP session_register (‘apple’); $apple = 4; ?> <a href=“./session_mani2.php”>session_unset() 함수사용</a><br> <a href=“./session_mani3.php”>session_destroy() 함수사용</a> <?PHP session_start (); session_unset (); print $apple; ?> session_unset: 변수값 초기화 session_destroy: 세션 데이터 파괴 <?PHP session_start (); session_destroy (); print $apple; ?>
간단한 장바구니 구현 (1/7) session/products.inc <?PHP $fruit = array (“사과” => 10, “배” => 20, “복숭아” => 30, “수박” => 40, “감” => 50, “토마토” => 60, “바나나” => 70, “키위” => 80, “파인애플” => 90, “대추” => 100); ?>
간단한 장바구니 구현 (2/7) session/product_list.php <html> <body> <p><font size=“6”>제품 목록</font></p> <p><a href=“cart.php”>장바구니</a></p> <table width=“420” border=“1” cellpadding=“1”> <tr align=“center”> <td width=“200”>이름</td> <td width=“80”>가격</td> <td width=“140”>장바구니</td> </tr> <?PHP include (“./products.inc”); while (list ($name, $price) = each ($fruit)) { ?> <form name=“insert_form” method=“post” action=“./cart.php?code=insert&name=<?=$name?>”>
간단한 장바구니 구현 (3/7) session/product_list.php (계속) <tr> <td width=“200”><?=$name?></td> <td width=“80” align=“right”><?=$price?>원</td> <td width=“140” align=“center”>수량 <select name=“amount”> <option value=1>1</option><option value=2>2</option> <option value=3>3</option><option value=4>4</option> <option value=5>5</option> </select> <input type=“submit” name=“submit” value=“추가”> </td> </tr> </form> <?PHP } ?> </table> </body> </html>
간단한 장바구니 구현 (4/7) 세션 (Session) 출력 결과 (product_list.php)
간단한 장바구니 구현 (5/7) session/class.inc <?PHP class Cart { var $contents; function add ($name, $amount) $this->contents[$name] = $amount; } function delete ($name) if (count ($this->contents) > 0) { while (list ($key, $value) = each ($this->contents)) if ($key != $name) $new_cart[$key] = $value; $this->contents = $new_cart; function get_list() { return $this->contents; } function get_count() { return count ($this->contents); } ?>
간단한 장바구니 구현 (6/7) 세션 (Session) 세션 시작 및 장바구니 객체 생성, 메소드 이용 (session/cart.php) 자세한 Source는 교재 참조 <?PHP include (“./class.inc”); include (“./products.inc”); session_start (); if (!session_is_registered (‘cart’)) { $cart = new Cart; session_register (‘cart’); } if ($code == “insert”) $cart->add ($name, $amount); else if ($code == “delete”) $cart->delete ($name); ?>
간단한 장바구니 구현 (7/7) 세션 (Session) 현재 장바구니의 상황을 보여주는 부분 (session/cart.php) 자세한 Source는 교재 참조 <?PHP if ($cart->get_count ()) { $sum = 0; $contents = $cart->get_list (); while (list ($name, $value) = each ($contents)) $sum += $value[amount] * $fruit[$name]; } print “이름: “ . $name . “<br>”; print “수량: “ . $value[amount] . “<br>”; echo “총합: “ . $sum . “<br>”; ?>