제목 | 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에 저장 하는군요.
좋은 코드 감사 합니다. ^^