| 제목 | db 쿠키 헬퍼 | ||
|---|---|---|---|
| 글쓴이 | 알브레드 | 작성시각 | 2016/06/16 11:44:43 |
|
|
|||
|
쿠키를 db에 저장해서 사용해야할 일이 있어서 만들어본 헬퍼입니다. 혹시 필요하신 분이 계실까? 해서 소스 올려봅니다(쑥쓰럽네요 ~~ ;;)
--- db_cookie_helper.php ---
<?php defined('BASEPATH') or exit('No direct script access allowed');
/**
* DB 쿠키 헬퍼
*
* @subpackage Helpers
* @category Helpers
* @author nina514
* @link
*/
// ------------------------------------------------------------------------
defined('DC_GLOBAL_COOKIE_NAME') OR define('DC_GLOBAL_COOKIE_NAME', 'DC_COOKIE'); // 전역변수로 사용할 쿠키 변수명
defined('DC_COOKIE_NAME') OR define('DC_COOKIE_NAME', 'DC_COOKIE_ID'); // db cookie 식별 토큰 쿠키명
if (! function_exists('dc_set_cookie')) {
/**
* db쿠키 set 함수
*
* @param string 쿠키 key
* @param mixed 쿠키 value
*/
function dc_set_cookie($key, $val = NULL)
{
if(empty($key)) {
throw new Exception('쿠키의 키 값은 필수 요소입니다.');
}
$dc_cookie = &$GLOBALS[DC_GLOBAL_COOKIE_NAME];
$dc_cookie[$key] = $val;
}
}
if (! function_exists('dc_get_cookie')) {
/**
* db쿠키 get 함수
*
* @param string 쿠키 key
*/
function dc_get_cookie($key)
{
if(empty($key)) {
return NULL;
}
if(array_key_exists($key, $GLOBALS[DC_GLOBAL_COOKIE_NAME])) {
return $GLOBALS[DC_GLOBAL_COOKIE_NAME][$key];
}
return NULL;
}
}
if (! function_exists('dc_delete_cookie')) {
/**
* db쿠키 삭제 함수
*
* @param string 쿠키 key
*/
function dc_delete_cookie($key)
{
if(empty($key)) {
throw new Exception('쿠키의 키 값은 필수 요소입니다.');
}
if(array_key_exists($key, $GLOBALS[DC_GLOBAL_COOKIE_NAME])) {
unset($GLOBALS[DC_GLOBAL_COOKIE_NAME][$key]);
}
}
}
if (! function_exists('dc_start_cookie')) {
/**
* db쿠키 시작 함수
*
*/
function dc_start_cookie()
{
// 컨트롤러 인스턴스 가져오기 및 쿠키 모델 로드
$CI = &get_instance();
$CI->load->model('Cookie_m');
// 쿠키 ID GET 및 쿠키 데이터 조회
$cookie_id = $CI->input->cookie(DC_COOKIE_NAME);
if(!empty($cookie_id)) {
$result = $CI->Cookie_m->get_cookie($cookie_id);
if($result !== FALSE) {
$GLOBALS[DC_GLOBAL_COOKIE_NAME] = $result;
}
}
if(array_key_exists(DC_GLOBAL_COOKIE_NAME, $GLOBALS) === FALSE) {
$GLOBALS[DC_GLOBAL_COOKIE_NAME] = array();
}
}
}
if (! function_exists('dc_commit_cookie')) {
/**
* db쿠키 저장(커밋) 함수
* redirect를 이용할 경우 redirect전에 꼭 커밋을 해야함
*
*/
function dc_commit_cookie()
{
$CI = &get_instance();
$cookie_id = $CI->input->cookie(DC_COOKIE_NAME);
if(empty($cookie_id)) {
$cookie_id = md5(time() . $CI->input->ip_address() . $CI->agent->agent_string());
}
$CI->Cookie_m->set_cookie($cookie_id, $GLOBALS[DC_GLOBAL_COOKIE_NAME]);
$CI->input->set_cookie(DC_COOKIE_NAME, $cookie_id, 30*24*60*60);
}
}
--- Cookie_m.php ---
<?php defined('BASEPATH') or exit('No direct script access allowed');
class Cookie_m extends CI_Model
{
public function __construct()
{
parent::__construct();
}
public function set_cookie($key, $data) {
$sql = "INSERT INTO CI_COOKIES
(
id
, agent
, ip_address
, timestamp
, data
)
VALUES
(
?
, ?
, ?
, ?
, ?
)
ON DUPLICATE KEY
UPDATE ip_address = ?
, timestamp = ?
, data = ?";
$timestamp = time();
$serialize_data = serialize($data);
$agent = $this->agent->platform() . '/' . $this->agent->browser();
$insert_val = array($key, $agent, $this->input->ip_address(), $timestamp, $serialize_data
, $this->input->ip_address(), $timestamp, $serialize_data);
return $this->db->query($sql, $insert_val);
}
public function get_cookie($key) {
$sql = "SELECT data
FROM CI_COOKIES
WHERE id = ?
AND ip_address = ?
AND agent = ?";
$agent = $this->agent->platform() . '/' . $this->agent->browser();
$result = $this->db->query($sql, array($key, $this->input->ip_address(), $agent));
if($result->num_rows() === 0) {
return FALSE;
}
else {
return unserialize($result->result_array()[0]['data']);
}
}
}
--- 테이블 생성 쿼리 --- CREATE TABLE `CI_COOKIES` ( `id` VARCHAR(40) NOT NULL, `agent` VARCHAR(150) NOT NULL, `ip_address` VARCHAR(45) NOT NULL, `timestamp` INT(10) UNSIGNED NOT NULL DEFAULT '0', `data` BLOB NOT NULL, PRIMARY KEY (`id`) )
제가 작성한 코드는 위와 같고요. 사용법은 헬퍼 파일과 모델 파일을 생성하시고 위 소스를 붙여넣어주세요. 그리고 sql문으로 테이블을 생성합니다.(테이블 스크립트는 CI 세션 테이블과 동일하고 agent컬럼만 추가되었습니다.) ci에서 헬퍼를 로드하시고, db cookie를 이용하실 구간에서 dc_start_cookie() 함수를 호출합니다.(이때 쿠키에 사용자 구분 토큰을 생성하여 로컬 쿠키에 저장합니다. 그리고 생성된 토큰으로 테이블을 조회하여 데이터를 가져옵니다.) db cookie 조작함수 dc_set_cookie(), dc_get_cookie(), dc_delete_cookie() 함수로 db cookie를 조작한 뒤 마지막으로 dc_commit_cookie() 함수를 호출하여 쿠키를 커밋하시면 cookie가 db에 저장됩니다. 아 저같은 경우에는 dc_start_cookie(), dc_commit_cookie()함수를 hook에서 호출하고 컨트롤러에서 get, set, delete함수를 이용하여 조작하는 방식으로 사용을 하고있습니다. 주의점은 redirect하실때는 redirect전에 dc_commit_cookie() 함수를 호출하여야 redirect된 컨트롤러에서 정상 반영된 쿠키가 보인다는 점입니다.
// 컨트롤러가 인스턴스화 되고 실행되기 전에 실행되는 훅
$hook['post_controller_constructor'][] = function() {
dc_start_cookie();
};
// 컨트롤러 실행이 모두 완료되었을때 실행되는 훅
$hook['post_controller'][] = function() {
dc_commit_cookie();
};
위 과정이 사용법 전부입니다. 설명을 잘 못쓴것 같아 많이 부끄럽네요. 다음에도 필요해서 만든 소스들 많이 올릴 수 있도록 노력해보겠습니다. 감사합니다^^ |
|||
| 태그 | cookie,쿠키,db cookie | ||
| 다음글 | Apache Memory Leak 대응방법 (3) | ||
| 이전글 | 위젯 라이브러리(?) 입니다. (1) | ||
|
한대승(불의회상)
/
2016/06/16 16:58:44 /
추천
1
|
|
수야디벨
/
2016/07/05 09:30:34 /
추천
1
역시 숨은 고수는 많아요 ! 눈 호강 잘하고 갑니다 :)
|
|
알브레드
/
2016/07/14 00:06:55 /
추천
0
@수야디벨 과찬이십니다. :) 제 소스가 조금이나마 다른 분들께 도움이 되었으면 좋겠네요 ㅎㅎ |
훅을 이용해서 쿠키를 DB에 저장 하는군요.
좋은 코드 감사 합니다. ^^