DB클래스는 넣지 않습니다. 참고정도 하시라고 공개합니다. 여기 게시판에서 팁도 좀 얻었습니다. 잘 보시고 응용해 보세요!
세션구울 때 DB를 사용합니다. 그리고 중복로그인을 막고, 2차도메인을 사용하는 사이트에서 통합로그인이 가능토록한 소스입니다.
늘 행복하세요!
====== 아래부터 소스입니다. ==============
//!! eZSession DB (세션 DB핸들링 및 통합로그인)
/*
CREATE TABLE “ezsession_session” (
“sesskey” varchar(33) NOT NULL,
“expiry” int4 NOT NULL,
“value” text NOT NULL,
“uid” int4 NOT NULL,
“security” varchar(1) NOT NULL,
“remoteip” varchar(20),
CONSTRAINT “ezsession_session_pkey” PRIMARY KEY (“sesskey”)
);
// start session handling
include_once( “classes/ezsession.php” );
session_set_save_handler (“sess_open”, “sess_close”, “sess_read”, “sess_write”, “sess_destroy”, “sess_gc”);
session_set_cookie_params( 0, “/”, “.ohmytravel.com” );
session_start();
*/
include_once( “classes/ezdb.php” );
$ini =& INIFile::globalINI();
$SesstionTimeOut = 30 * 60;
$maxlifetime = $SesstionTimeOut;
function sess_open( $save_path, $session_name )
{
global $sess_save_path, $sess_session_name;
// $sess_save_path = $save_path;
// $sess_session_name = $session_name;
return true;
}
function sess_close()
{
return true;
}
function sess_read( $key )
{
global $sess_save_path, $sess_session_name;
$db =& eZDB::globalDatabase();
$value_array = array();
$db->array_query( $value_array, “SELECT value FROM ezsession_session WHERE sesskey=’$key’ AND expiry > ” . time() );
if( count( $value_array ) == 1 )
{
// 세션시간이 현재시간보다 크다면 정보를 가져온다.
return $value_array[0][$db->fieldName(“value”)];
}
else
{
$db->query( “DELETE FROM ezsession_session WHERE sesskey=’$key'” );
return false;
}
}
function sess_write( $key, $sess_data )
{
global $sess_save_path, $sess_session_name, $maxlifetime;
$db =& eZDB::globalDatabase();
$ret = false;
$session_array = array();
$check_array = array();
$expiry = time() + $maxlifetime;
$value = addslashes( $sess_data );
$remoteip = $_SERVER[“REMOTE_ADDR”];
// 세션정보가 존재하는지 체크
$db->array_query( $session_array, “SELECT * FROM ezsession_session WHERE sesskey=’$key’ AND value IS NOT NULL” );
if ( count( $session_array ) == 1 ) // 세션업데이트 – DB의 시간이 현재시간보다 크면 계속 시간을 업데이트 시켜 세션을 유지.
{
$res = $db->query( “UPDATE ezsession_session SET expiry=’$expiry’ WHERE sesskey=’$key’ AND expiry > ” . time() );
if( $res == true )
$ret = true;
}
else if ( count( $session_array ) == 0 ) // 세션정보가 없는 경우. DB에 세션을 추가한다.
{
if ( $sess_data )
{
$uid = $GLOBALS[‘ezuser_session_id’];
// 이중 로그인 차단! 흐흐~ 주기넹! 완벽한 중복로그인 차단이얌! ㅋㅋㅋ~
$db->array_query( $check_array, “SELECT value FROM ezsession_session WHERE uid=’$uid’ AND remoteip!=’$remoteip'” );
// 중복로그인을 검사하기 위한 필드. O 정상, X 중복로그인.
$security = “O”;
if ( count( $check_array ) == 1 )
{
$security = “X”;
}
// lock the table
$db->begin();
$db->lock( “ezsession_session” );
// 세션추가 – 로그인했을 경우 $sess_data 정보가 한번 넘어온다. 그 때만 추가한다.
$res = $db->query( “INSERT INTO ezsession_session ( sesskey, expiry, value, uid, security, remoteip ) VALUES ( ‘$key’, ‘$expiry’, ‘$value’, ‘$uid’, ‘$security’, ‘$remoteip’ )” );
if ( $res == true )
$ret = true;
}
}
$db->unlock();
if ( $ret == false )
$db->rollback( );
else
$db->commit();
return $ret;
}
function sess_destroy( $key )
{
global $sess_save_path, $sess_session_name;
$db =& eZDB::globalDatabase();
$db->query( “DELETE FROM ezsession_session WHERE sesskey=’$key'” );
return true;
}
/*********************************************
* WARNING – You will need to implement some *
* sort of garbage collection routine here. *
*********************************************/
function sess_gc( $maxlifetime )
{
$db =& eZDB::globalDatabase();
$db->query( “DELETE FROM ezsession_session WHERE expiry < " . time() );
return true;
}
// 세션 핸들링 (도메인 입력시 1차도메인 앞에 .(점)을 찍어야 한다.)
session_set_save_handler (“sess_open”, “sess_close”, “sess_read”, “sess_write”, “sess_destroy”, “sess_gc”);
session_set_cookie_params( 0, “/”, “.domain.com” );
session_start();