wilson's story

php session 본문

PHP

php session

wilson 2008. 1. 8. 02:28
반응형

< Session Handling with PHP 4 >


저자 : Tobias Ratschiller

번역 : 김수희(ketchup@wowlinux.com)


1. Target Audience

2. Introduction

3. PHP's Built-in Session Library

4. Goals of the Tutorial

5. Basic Terms (기본 용어)

6. Background Information

7. Preliminary Tips and Prerequisites (예비 tip과 선행조건)

8. Starting a Session (세션 시작하기)

9. Ending a Session (세션 종료하기)

10. Storage Modules

11. Session ID Propagation (세션 ID 전달)

12. Example Code



Target Audience

이 tutorial은 고급 PHP 개발자를 위한 것입니다.

여기서는 당신이 이미 쿠키를 사용할 줄 안다고 가정합니다.

또한 POST나 GET method를 이용해 한 페이지에서 다른 페이지로 데이터를 넘길 줄도 알아야 합니다.



Introduction

PHP3와는 달리 PHP4는 세션 관리 기능이 기본적으로 제공됩니다.

PHP4의 세션 관리 기능은 사용하기 쉽고, 강력하며 필요에 따른 변경이 가능합니다.

세션은 특정한 사용자가 당신의 웹 사이트를 방문하고 있는 동안 그 사용자의 행동을 추적하도록 합니다.

세션 데이터를 한 사용자와 묶기 위해서는, 키 역할을 하는 세션ID가 필요합니다.

이 tutorial은 세션을 열고, 세션 데이터를 추적하며, 더 이상 필요하지 않을때 데이터를 삭제하는 방법에 대해 논합니다.



PHP's Built-in Session Library

다행히도 PHP4는 기본 세션관리가 제공되어, 세션 ID를 발명하고, 세션 데이터를 보관하는 작업을 직접 해야하는 수고를 덜어줍니다.

따라서 쉽고 간단하며, 아마도 당신의 요구를 만족시켜줄 수 있을지 모르지만, PHPLib가 제공하는 몇가지 기능들이 부족할 수 있습니다.



Goals of the Tutorial

이 tutorial에서 당신은 아래와 같은 내용을 배울 수 있습니다.


  세션이란?

  persistent variables 의 사용방법

  세션ID가 이 페이지에서 다른 페이지로 어떻게 전달되는가

  세션을 종료하고 데이터를 초기화하는 방법

  세션동안 변수를 등록하는 방법

  아래를 포함하는 PHP 4.0의 세션 관리함수의 사용법

    session_register()

    session_start()

    session_destroy()

    gc_probability()

    gc_maxlifetime

    serialize()

    deserialize()

    session_save_path()

  PHP가 세션 데이터를 저장하는 방법



Basic Terms (기본 용어)

세션관리는 어떤 기간동안 동일한 사용자로부터의 요청에 대한 상태를 유지하는 방법입니다.

세션이란 용어는 특정 웹 사이트에 사용자가 머무르는 시간을 뜻합니다.

문제는 HTTP는 상태를 유지하는 기능을 갖고 있지 못하므로 각각의 요청은 서로와 관련성을 갖지 못한다는 점입니다.

웹서버는 쉽게 개인 사용자들을 구분하지 못하고 사용자의 세션에 대해서 알지 못합니다.

세션관리는 웹페이지에 머무르는 한 사용자와 데이터를 묶는 방법을 뜻합니다.

이 tutorial에서는 세션이란 용어가 한 사용자의 한번의 방문을 뜻합니다.

예를 들면, 일반적인 온라인 쇼핑 세션은 로그인과 쇼핑카트에 제품을 넣는 것, 체크아웃 페이지로 가는 것, 주소와 신용카드 정보를

입력하는 것, 주문을 확인하고 브라우저를 닫는 것 까지를 포함합니다.

PHP 4.0는 사용자 세션관리의 편의를 위한 기본 세션 관리 함수를 포함합니다.


"life of a session"은 세션이 활성화되어 있는 기간을 의미합니다.

"Serializing"은 변수를 어디나 저장될 수 있는 일반 문자열로 변환하는 것을 뜻합니다.

serializing 기능이 없다면 PHP array를 데이터베이스에 넣는 것이 불가능합니다.

데이터의 serializing은 세션 라이브러리의 중요한 측면인 데이터의 요청에 따른 저장에 매우 유용합니다.

serialize()와 deserialize() 함수를 사용할 수 있지만, PHP3에서 이 함수들은 객체(클래스)에 대해 제대로 동작하지 않습니다.



Background Information

PHP의 세션 관리 라이브러리는 세션관리 라이브러리에서 필요로 하는 주요 특성을 포함합니다.


  세션 데이터를 서버에 저장합니다. 라이브러리가 다른 저장 모듈을 사용하기 때문에 데이터는 일반 텍스크 화일이나 공유 메모리 또는

   데이터베이스에 저장될 수 있습니다. (매체의 퍼포먼스가 충분한 이상) 데이터의 정확한 위치는 그렇게 중요하지 않습니다.

  암호화 된 랜덤한 세션ID를 사용자 식별을 위해 사용합니다.

  쿠키나 GET/POST, 또는 스크립트 경로를 이용해 세션ID를(세션ID만) 클라이언트쪽에 저장합니다. (PHP 라이브러리는 이 모든

    방법을 제공합니다. 잠시 후 어떻게 이들을 사용하는지 보게 될 것입니다.)

  만약 사용자가 쿠키를 사용하지 않을 경우, 어플리케이션은 다른 세션 전달 수단을 사용할 수 있습니다.



Preliminary Tips and Prerequisites (예비 tip과 선행조건)

사용자와 세션 데이터를 연결하기 위해서는 사용자와 그 데이터를 묶는 키가 되는 session identity number가 필요합니다.

PHP 4.0의 세션 관리는 세션 ID를 만들고 세션 데이터를 serializing 하는 작업의 수고를 덜어줍니다.


Note: 만약 기본 PHP 세션 함수 이상의 것을 원한다면 PHPlib가 고급 세션관리 함수를 제공합니다.



Starting a Session (세션 시작하기)

PHP 4 세션은 명시적으로 session_start() 함수로 시작되거나, 함축적으로 session_register()를 사용해 세션 변수를 등록함으로써

시작됩니다.

일반적으로 session_start()는 페이지의 맨 위에서 호출되므로 세션 변수는 스크립트에서 사용될 수 있고, 스크립트에서 세션에 변수를

등록할 수 있습니다.

그러나 session_register()를 스크립트 초기에 써서 세션 변수를 등록하고 session_start()를 호출하지 않아도 다르지는 않습니다.

세션이 시작되지 않았으면 session_register()는 내부적으로 session_start()을 호출하기 때문입니다.

세션을 어떻게 시작하던간에 아래의 절차가 발생합니다.


  PHP는 유효한 세션ID가 존재하는 지 확인합니다.

  세션ID가 없으면 PHP는 새로운 ID를 만듭니다.

  유효한 세션 ID가 있으면, 동결되어 있던 세션 변수는 재활성화 되고 global namespace에 다시 전달됩니다.


세션변수의 등록은 session_register() 명령을 통해 이뤄집니다.

이는 세션을 통해 저장되고 세션동안 참조될 수 있는 변수를 만들 수 (저장할 수)있도록 허용합니다.

페이지 요청에 따른 저장하고자 하는 모든 변수는 session_register()에 의해 세션 라이브러리에 등록이 되어야 합니다.

함수가 변수 자체가 아닌 변수 명을 인수로 받는 다는 사실을 확인해 주십시오.

사용자가 쇼핑카트로부터 아이템을 삭제하는 등의 경우에는 session_unregister()를 사용하여 세션으로부터 변수를 삭제할 수 있습니다.


    Syntax Example - 카운터의 예제

        session_start();  //세션을 시작

        print($counter);  //카운터의 가장 최근값을 출력

        $counter++;       //카운터를 증가

        session_register("counter");   //카운터를 등록


        물론 이 예제는 일반 페이지 카운터와는 다릅니다.

        세션은 한 특정 사용자와 묶여 있습니다.

        PHP의 기본 설정으로 세션 쿠키의 지속시간은0입니다.

        만약 브라우저를 닫고나서 다시 열면 쿠키가 지워졌기 때문에 카운터는 0부터 다시 시작될 것입니다.


    Syntax Example - $foo라는 변수를 등록

         session_register("foo");


    Syntax Example - 미리 정의된 함수 $bar를 등록

         $bar = "This is a string";

         $foo = "bar";

         session_register($foo);


두 예제의 차이점은 첫번째 예제에서는 "foo"라는 이름의 변수가 세션변수로 등록이 되었지만, 두번째 예제에서는 사실상 "bar"라는

이름의 변수가 등록이 되었다는 것입니다.

Session_register()는 착각하기 쉽지만 예제에서 보여지듯이 변수가 아닌 변수명을 인수로 사용합니다.


세션 변수를 사용하는 것은 GET/POST 변수를 다루는 것만큼 쉽습니다.

foo라는 이름의 변수를 등록하면 session_start() 함수를 호출한 후 바로 $foo를 사용할 수 있습니다.

PHP4에서 serialize() 함수가 개선되어졌기 때문에 객체(클래스)를 세션 변수 취급하는 것도 가능합니다.


    Tips

    Note: 세션을 시작할때 세션이 거부되고 부적합하다고 표시되면 새ID가 만들어질 수 있습니다.

   이는 페이지의 HTTP 참조자가 외부 사이트로부터 오며, extern_referer_check ("r"이 한개임) 가 PHP설정에서 enable 되어있기

   때문입니다.

   이로 인해 추가적인 보안을 가져오게 되는데, 사용자로 하여금 다른 PHP 사이트로부터 세션을 이어받는 것을 방지하기

    때문입니다.(그러나 세션ID를 만들어내는 데에 사용한 알고리즘때문에 이런 일이 발생할 가능성은 거의 없습니다.).




Ending a Session (세션 종료하기)

세션은 자동으로 종료되지 않습니다. 시스템이 언제 사용자가 세션을 종료했는지 알아내기가 어렵기 때문입니다.

여러 명령어가 시스템이 언제 세션을 종료할지 알아내는가를 제어하도록 돕습니다.

session_destroy() 명령을 이용해 세션 종료를 강요할 수 있습니다.

쿠키를 이용해 세션 ID를 전달했다면 쿠키의 디폴트 지속시간은 0이므로 사용자가 브라우저를 닫음과 동시에 쿠키가 지워지게 됩니다.

쿠키의 지속시간은 지속시간의 설정값을 이용해 변경할 수 있습니다.

gc_maxlifetime 설정을 통해 마지막으로 접근한 후 얼마나 지난 후에 데이터가 삭제되어야 할 지 지정할 수 있습니다.

이는 서버가 클라이언트에 쿠키가 존재하는지 여부를 알 수 없기 때문입니다.

그러나 모든 페이지의 요청에 대해 오래된 세션을 청소하는("garbage collection"이라고 불립니다.)등의 작업은 심각한 오버헤드를

발생시킬 수 있습니다.

그러므로 gc_maxlifetime의 탄젠트 값인 gc_probability를 사용하여야 합니다.

This specifies with what probability the garbage collection routine should be invoked.

gc_probability가 100이면, 모든 요청마다 세션을 비웁니다.(100%의 확률); 디폴트로 정의된 1이라면 오래된 세션은 요청 발생에

대해 1%의 비율로 삭제됩니다.

만약 쿠키를 사용하지 않고 GET 이나 POST를 통해 세션 ID를 전달한다면 garbage collection routine에 관심을 기울여야 할 필요가

있습니다.

사용자는 세션ID를 포함하는 URL을 북마크하려 할 수 있으므로 세션이 자주 초기화되도록 확인해 줄 필요가 있습니다.

만약 사용자가 나중에 세션 ID를 포함하는 페이지에 접근하려고 할때 세션 데이터가 남아있으면 PHP는 당신의 의도와는 달리 새로운

세션을 시작하는 대신 이전의 세션을 회복시킵니다,

이 경우 gc_probability의 디폴트 값인 0보다는 10에서 20정도의 값이 적당합니다.


    Tips

     왜 PHP가 정해진 시간마다 삭제를 하는 대신 언제 garbage collection이 발생할지를 결정하는 확률(gc_probability)을 사용자로

     하여금 지정할 수 있도록 하는지 궁금해 하실지도 모릅니다.

     만약 PHP가 카운트를 하는 함수를 사용한다면 서버는 열려있는 세션의 숫자를 추적할 필요가 생깁니다.

     확률 함수를 사용하는 것은 서버가 청소를 위한 카운터를 저장할 필요가 없다는 의미이고 따라서 정확하고 빠른 실행이 이뤄진다는

     의미입니다.



Storage Modules

세션 데이터를 읽고 저장하기 위해서 PHP는 storage module을 사용합니다. 현재 사용 가능한 storage module은 세가지 입니다.

  Files.

   기본적으로 PHP는 세션 데이터를 디스크에 저장하기 위해 화일 모듈을 사용합니다. /tmp에 세션ID의 이름을 딴 텍스트 파일을

   만들게 되지만 이 화일들을 직접적으로 접근할 필요는 없을 것입니다. 세션 카운터의 예제에서는 변수가 serialize된 다음의 형태처럼

   보여질 것입니다.: counter|i:4;

  mm.

   더 높은 퍼포먼스를 원한다면, mm 모듈은 적절한 대안입니다. 이것은 공유 메모리에 데이터를 저장하므로 하드웨어의 I/O 시스템에

   의해 제약을 받지 않습니다.

  User.

   session_set_save_handler()로 정의된 user-level의 회수(callback)함수를 인식하기 위해 내부적으로 사용됩니다.

   정말 강력한 힘은 사용자의 회수(callback)를 저장 모듈로 지정할 수 있는 기능에 있습니다.


기준화 된 PHP API에 의존할 수 있으면서 동시에 세션을 다루기 위한 함수를 직접 만들 수 있기 때문에, 어디에나 어떻게든

- MySQL같은 데이터베이스나 XML 화일, 원격 FTP 서버 등- 세션을 저장할 수 있습니다. (FTP 서버는 좀 다르지만, 이해하시겠지요.).

session_set_save_handler() 함수는 callback 함수인 6개의 문자열을 인수로 받습니다.


이 함수의 문법은 아래와 같습니다.

void session_set_save_handler(string open, string close, string read, string write, string destroy, string gc);


    Tip

    인수 하나를 남겨두려면 비어있는 문자열("")을 session_set_save_handler()에 전달하십시오.

 

함수들은 아래와 같이 정의되어 있습니다.

  bool open (string save_path, string sess_name);

   이 함수는 세션의 초기화때 실행됩니다. 함수를 준비하고 변수를 초기화 하는 등에 사용해야 합니다.

   이 함수는 두개의 문자열을 인수로 갖습니다. 첫번째 인수는 세션이 저장되는 경로입니다.

   이 변수는 php,ini에 지정되거나 session_save_path() 함수를 통해 지정될 수 있습니다.

   이 변수를 joker로 사용하거나 (?) 모듈에 특화된 설정을 위해 사용할 수 있습니다.

   두번째 인수는 디폴트로 PHPSESSID 값을 갖는 세션의 이름입니다. 성공하면 true를, 에러가 발생하면 false를 리턴합니다.


  bool close ();

   이 함수는 세션을 닫을때 실행됩니다. 메모리를 해지시키거나 변수를 삭제하기 위하여 사용하십시오.

   아무 인수를 받지 않으며 성공하면 true를, 에러가 발생하면 false를 리턴합니다.


  mixed read (string sess_id, );

   이 중요한 함수는 세션이 시작할때마다 호출됩니다.

   이 함수는 세션ID에 의해 식별되는 세션 데이터를 읽고 serialize된 문자열을 리턴합니다.

   이 ID에 대한 세션이 없으면 비어있는 문자열인 ""가 리턴되며, 에러가 발생하면 false를 리턴합니다.


  bool write (string sess_id, , string value);

   세션이 저장될 필요가 있을때, 이 함수가 발생됩니다.

   첫번째 인수는 sess_id를 포함하는 문자열이고, 두번째 인수는 세션 변수의 serialize된 형태입니다.

   이 함수는 성공하면 true를, 에러가 발생하면 false를 리턴합니다.


  bool destroy (string sess_id, );

   개발자가 session_destroy()를 호출하면 이 함수가 실행됩니다. 이 함수는 세션의 sess_id와 관련된 모든 데이터를 삭제하고

   성공하면 true를, 에러가 발생하면 false를 리턴합니다.


  bool gc (int max_lifetime, );

   이 함수는 세션이 gc_probability에 지정된 확률로 시작될 때 호출됩니다.

   이 함수는 garbage collection에 이용됩니다.; 즉, gc_maxlifetime에 해당하는 기간(단위:초) 이상 갱신되지 않은 세션을

   삭제하게 됩니다.

   이 함수는 성공하면 true를, 에러가 발생하면 false를 리턴합니다.


만약 자신의 저장 모듈을 지정하고 싶다면 (예를 들자면 MySQL 데이터베이스에 세션 데이터를 저장하고자 한다면) 이러한 함수들을

PHP로 구현해주어야 합니다.

그 함수들의 prototype은 아래의 예와 비슷하게 될 것입니다.


function sess_open($save_path, $sess_name)

{

}


function sess_read($sess_id)

{

}


function sess_write($sess_id, $val)

{

}


function sess_destroy($sess_id)

{

}


function sess_gc($max_lifetime)

{

}


이러한 callback 함수들을 등록하기 위해서는 session_set_save_handler(): 함수를 사용합니다.

session_set_save_handler("sess_open", "", "sess_read", "sess_write", "sess_destroy", "sess_gc");



Session ID Propagation (세션 ID 전달)

PHP4 세션은 세션ID 전달을 위해 아래의 방법들을 지원합니다.

  쿠키 (디폴트)

  GET/POST

  직접 입력하거나 자동으로 재지정된 URL에 감춰져서


쿠키는 페이지들간에 세션 ID를 주고받는 기본적인 방법입니다.

쿠키가 잘 된다면 다른 설정에 대해 걱정할 필요가 없습니다.

다른 일반적인 방법은 GET/POST로 ID를 전달하는 것입니다.

이 경우 URL은 script.php3?<session-name>=<session-id> 와 비슷한 형태가 될 것입니다.

global constant SID를 이용해 이러한 URL을 만들 수 있습니다.


printf('<a href="script.php?%s">Link</a>', SID);


자동으로 URL을 재정의 하는 것은 PHP4의 멋진 새 기능 중 하나이며, 세션 ID를 페이지 안의 링크에 추가할 수 있도록 해줍니다.

이것을 가능하게 하려면 PHP를 --enable-trans-id 옵션으로 설정하고 재 컴파일 해야 합니다.

그러면 PHP로 해석되는 페이지 내의 폼의 세션ID는 모든 관련 링크에 추가가 될 것입니다.

이것은 간편한 기능이지만 퍼포먼스가 높은 사이트에서는 조심스럽게 쓰여져야 합니다.

PHP는 각각의 개별적인 페이지들을 찾아서 관련 링크를 가졌는지 확인하고 ID를 링크에 더해야 하기 때문입니다.

물론 퍼포먼스의 저하를 가지고 오겠지요.

반대로 쿠키는 한번만 세팅되므로 URL의 재지정에 따른 오버헤드를 피할 수 있습니다.



Example Code

아래는 주석이 달린 샘플 코드입니다.

인기있는 행맨 게임(역자 주 : 주어진 단어의 스펠링을 맞추는 게임)은 어떻게 persistent variables을 사용하는 지를 보여주는 좋은

방법입니다.

이 게임에서 컴퓨터는 랜덤하게 5글자짜리의 단어를 고르고, 게이머는 어떤 글자가 그 단어안에 포함되는지 맞춰야 합니다.

사용자는 6번의 시도를 할 수 있고 맞추지 못하면 교수형에 처해집니다.

우리는 흔한 영어의 여자이름 데이터베이스를 골랐지만, 당신은 원하는 아무 단어나 사용할 수 있습니다.

단순히 words.txt화일만 바꾸시면 됩니다. 단 하나의 제약조건은 각 단어는 한 줄에 위치해야 한다는 것입니다.

물론 이 게임은 상태 정보를 유지하지 않고는 이뤄질 수 없습니다.

게이머는 언제나 5번의 기회가 남겨지게 되며, 한번에 단어 전부를 맞추지 못하면 절대 이길 수 없고, 당연히 재미가 없겠지요.

잠시 이 게임의 로직에 대해 생각해보시면 매번 요청되는 내용에 대해 기억되어져야 할 변수 3개를 찾아내실 수 있으실 것입니다.

  게이머가 맞춰야 할 랜덤한 단어

  사용자가 이미 추측해 낸 글자들

  사용자가 시도해 본 회수

시도한 회수는 약간의 트릭으로 계산이 가능하지만, 그러나 이 예제에서는 명백하게 하기 위해 별도로 저장을 했습니다.


예제는 세션 ID와 쿠키의 기본 전달방법을 사용하였으므로, 세션 라이브러리를 사용하는데에 어떠한 기교도 필요하지 않습니다.

예제는 아래의 프로그램 로직을 따라 작성되었습니다.

세개의 세션 변수가 등록되었습니다.

스크립트는 form이 Post에 의해 발생되었는지, 즉 사용자가 선택을 했는지를 확인합니다. 이 경우, 스크립트는 입력된 내용을 전달하고,

게임 상태(승패 여부, 추정의 정확/부정확 여부)를 갱신하며 적절한 메시지를 출력합니다.

그렇지 않으면 새 게임이 시작되고 랜덤한 단어가 words.txt 화일로부터 선택됩니다.

추측된 단어에서 아직 추측하지 않은 글자를 감추고 있는 문자열이 만들어지고 화면에 출력됩니다.

나머지 페이지가 그려집니다.

모든 HTML 출력물은 별개의 템플릿 클래스에 의해 조정됩니다. 이것은 프로페셔널 웹 어플리케이션에서 자주 이용되는 코드와

레이아웃의 분리를 가능하게 합니다. 그러나 이 내용에 대해서는 다른 tutorial에서 다루도록 합니다.

이 코드는 간단하지만 때문에 이해하기 쉬워 어떻게, 그리고 어떤 목적으로 세션 라이브러리를 사용할 수 있다는 것을 알 수 있게

합니다.

또한 게이머의 최고 점수를 데이터베이스에 저장하는 등의 어플리케이션의 확장까지도 가능합니다.

만약 이 게임으로 그런 근사한 일을 했다면 알려주셔서 우리 웹 사이트에게 당신의 버전을 실을 수 있도록 해주십시오.



NOTE :  앞에 "//"로 표시된 부분은 주석입니다.

require("EasyTemplate.inc.php3");

define("HANG_MAX_TRIES", 6);


$guess = strtolower($guess);


function hang_get_random_line($file)

{

// 화일을 열기위해 시도

if(!file_exists($file) || !($fp = fopen($file, "r")))

{

die("Could not open file \"$file\" fo reading.");

}


// 화일의 크기를 가져온다

$size = filesize($file);


// 랜덤함수를 초기화 하고 화일 크기의 범위 안해서 랜덤한 값을 얻는다.

srand((double)microtime()*1000000);

$randval = rand(0, $size);


// 화일 내에서 랜덤한 포지션을 찾는다

fseek($fp, $randval);


// 몇번째 열인지 구한다.

$line = trim(fgets($fp, 1024));

$line = trim(fgets($fp, 1024));


// 화일을 닫는다.

fclose($fp);


// 비어있는 열이면 재시도

if(empty($line))

{

$line = hang_get_random_line($file);

}


// 랜덤한 열을 리턴

return($line);

}


// 세션의 초기화

session_start();


// 변수를 등록한다.

session_register("num_of_tries");

session_register("guessed_chars");

session_register("word");

 

if($REQUEST_METHOD == "POST" && !empty($word) && !empty($guess))

{

$guessed_chars[] = $guess;

if(!strstr($word, $guess))

{

// 글자가 단어 안에 없을때

$num_of_tries++;

$message = "Wrong guess.";

}

else

{

$message = "Correct guess!";

}


}

else

{

$word = strtolower(hang_get_random_line("words.txt"));

$message = "Welcome to Hangman!";

$num_of_tries = 1;

$guessed_chars = array();

}



$guessed_word = $word;


// 추측해야 하는 단어를 만들어낸다.(아직 추측되어지지 않은 글자 대신 "_"를 넣는다)

for($i=0; $i<strlen($word); $i++)

{

if(!strstr(implode("", $guessed_chars), $word[$i]))

{

$guessed_word = str_replace($word[$i], "_ ", $guessed_word);

}

}


$button = "Go";


// 게이머가 이겼는지 졌는지 확인

if($guessed_word == $word || $word == $guess)

{

$message = "Correct guess - you've won!";

session_destroy();

$button = "New Game";

$num_of_tries = 1;

}

elseif($num_of_tries == HANG_MAX_TRIES || strlen($guess) > 1)

{

$message = "You've lost. The word was \"$word\".";

session_destroy();

$button = "Try Again";

$num_of_tries = HANG_MAX_TRIES;

}


// 새로운 template instance를 만든다

$tpl = new EasyTemplate("template.inc.html");


// template변수값 지정

$tpl->assign("ACTION", basename($PHP_SELF));

$tpl->assign("NUM_OF_TRIES", $num_of_tries);

$tpl->assign("BUTTON", $button);

$tpl->assign("MESSAGE", $message);

$tpl->assign("WORD", $guessed_word);

$tpl->assign("GUESSED_CHARS", @implode("", $guessed_chars));


// template을 출력

$tpl->easy_print();




Tobias Ratschiller is a New Media Consultant in Italy, specializing in the creation of large scale dynamic websites.

He has provided consulting and implementation work for some of the world's largest websites and has contributed to several PHP titles.

Together with Till Gerken, he's currently writing a book titled "Advanced Web Application Development with PHP", which will be published in May 2000 by New Riders.

Apart from that, he teaches at seminars about usability, user interface design and content management systems.

Tobias runs http://phpwizard.net/


편집자 : 박희수(peterpan@wowlinux.com)


반응형