CI 묻고 답하기

제목 CI 2.1 세션 문제
글쓴이 마음열기 작성시각 2016/01/12 14:52:48
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 14584   RSS

안녕하세요. CI 공부를 하고 있는 중입니다.

 

보니까 2.1 이 세션 문제가 많은것 같네요. 이리저리 해보다 해결이 안되서 질문 올려봅니다.

 

$config['sess_cookie_name']		= 'ci_session';
$config['sess_expiration']		= 7200;
$config['sess_expire_on_close']	= TRUE;
$config['sess_encrypt_cookie']	= TRUE;
$config['sess_use_database']	= TRUE;
$config['sess_table_name']		= 'ci_sessions';
$config['sess_match_ip']		= FALSE;
$config['sess_match_useragent']	= TRUE;
$config['sess_time_to_update']	= 3600;

config.php 는 위와 같이 설정이 되어 있고

 

Ajax 컨트롤러를 통해 login_model에 접근하여 json으로 값을 돌려주고

 

페이지를 refresh 하는 형태로 로그인을 구현하였습니다.

 

분명 Ajax 컨트롤러에서는 session 이 생성된 기록이 있는데

 

정작 세션이 적용되야할 컨트롤러에서 세션을 호출 하지 못하고 있는 상황입니다.

 

Ajax 컨트롤러는 별거 없이 모델에서 처리된 값을 뿌려주기만 합니다.

 

login_model

 

class Login_model extends CI_Model {
	private $json = array();
	private $ci = '';

	public function __construct() {
		parent::__construct();
		$this->ci = & get_instance();
		$this->json['result'] = 'fail';
	}

	public function login() {
		$bind['user_id'] = $this->input->post('user_id');
		$bind['pwd'] = $this->input->post('pwd');

		$save_id = $this->input->post('save_id');

		$result = $this->db->query('select userid as user_id, name as user_name from member where userid = ? and pwd = ?', $bind);

		if ($result->num_rows() > 0) {
			$row = $result->row();

			$this->json['result'] = 'success';
			$this->json['user_id'] = $row->user_id;
			$this->json['user_name'] = $row->user_name;

			$this->ci->session->set_userdata(array('user_id' => $row->user_id, 'user_name' => $row->user_name));

			if ($save_id == 'Y') {
				$this->input->set_cookie(array(
					'name'   => 'save_id',
					'value'  => $bind['user_id'],
					'expire' => 86400 * 30,
					'path'   => '/',
					'secure' => true
				));
			}
		}

		return json_encode($this->json);
	}
}

별것도 아닌 부분에서 문제가 생기니 딱 손놔 버리고 싶은 심정이지만

 

성격이 그게 안되 몇시간째 혼자 낑낑 거리고 있습니다.

 

도움 부탁드립니다.

 

그리고 한 가지 더 

 

가장 많이 사용되고 있는 CI버전이 궁금합니다. CI 근황이 굳이 2.1을 안해도 된다면 3.0으로 넘어갈까 합니다. 

태그 세션
 다음글 문제없는 코드인가요? (2)
 이전글 코드이그나이터 컨트롤러에서 팝업띄우기 질문입니다. (4)

댓글

/ 2016/01/12 15:51:23 / 추천 0

//마음열기

1. ajax로 로그인 하는걸 만드시는거 같은데, 세션 생성기록이 있다면, 세션이 만들어 졌다고 가정하고 이야기하면,

   컨트롤러가 세션을 호출하는 시점이 세션을 생성한 시점보다 먼저 호출한건 아닐가요?? 

   세션 생성하는걸 보면 인스턴트를 ci 멤버변수에 컨트롤러가 생성할때 참조하여 대입하는데, 

   session 라이브러리를 로드해서 $this->session ... 이렇게 사용해도 될건데... 그리고 세션 라이브러리를 로드하는 코드가 없는걸 보니,

   세션을 오토로드 한거같은데, 그럼 바로 모델에서도 $this->session->set_userdata 사용하면되지 않을가요?

2. 저는 현재 2.6버전으로 개발하고 있는데 3버전으로 업글하려고 했다가 코어확장한 부분이 많아서 포기하고 그냥 2버전으로 쭉 개발    

   하고 있습니다만, 포럼 정보를 보면 2버전은 추가 개발이 별로 안되는거 같네요. 3버전이 현대화된 코드들이 많은거 같아서

   다음 개발에선 사용하려고 합니다. 어떤상황인지 모르겠지만, 3버전 할 수 있으면 3버전으로 넘어가는게 좋아보입니다.

 

한대승(불의회상) / 2016/01/12 15:51:37 / 추천 0

PHP 5.4.x 이상이고 신규 프로젝트를 진행중 이시라면 3.0을 추천 드립니다.

2.x 는 현재 보안 업데이트만 진행 하고 있습니다.

마음열기 / 2016/01/12 16:09:48 / 추천 0

-> 닉

실제 main 이라는 컨트롤러에서 아래와 같이 처리 합니다.

class Main extends CI_Controller {

 public function __construct() {
  parent::__construct();
 }

 public function index() {
  $this->load->model('main_model', 'main', true);

  $rolling_review = $this->main->rolling_review();
  $default_review = $this->main->get_default_review();

  $login = $this->util->login_status();

  $this->parser->parse('main', array(
   'inc_header' => $this->parser->parse('inc/header', array(
    'header_title' => '영풀 메인',
    'javascript_include' => $this->util->script_include('main'),
    'javascript' => '',
    'onload_javascript' => ''
   ), true),
   'inc_gnb' => $this->parser->parse('inc/gnb', array(
    'login_form' => $login['login_form'],
    'login_on' => $login['login_on']
   ), true),
   'inc_footer' => $this->load->view('inc/footer', '',  true),

   'rolling_review' => $rolling_review->result(),
   'default_review_subject' => $default_review['default_review_subject'],
   'default_review_userid' => $default_review['default_review_userid'],
   'default_review_hit' => $default_review['default_review_hit'],
   'default_review_content' => $default_review['default_review_content'],
   'default_review_comment' => $default_review['default_review_comment']
  ));
 }
}

그리고 util 라이브러리에서는

 

 public function login_status() {
  $login['login_form'] = array();
  $login['login_on'] = array();

  if ($this->ci->session->userdata('user_id') != '') {
   $login['login_on'][0] = array('user_name' => $this->ci->session->userdata('user_name'));
  } else {
   $login['login_form'][0] = array();
  }

  return $login;
 }

위와 같이 처리 검수 하고 값을 넘겨 줍니다.

$this->ci 는 __construct 단계 에서 생성 됩니다.

 

session은 autoload에 설정 되어 있는 상태입니다. 로그인 모델에서도 $this->session으로 처리 했다가 혹시나 해서 $this->ci로 처리도 해봤던 것입니다.

 

php 5.6에서 개발 중인데... 영 뭐가 안맞네요...ㅜㅜ

 

아무래도 3. 버전으로 갈아 타야 할것 같습니다.

 

답변해주신 닉님, 한대승님 감사합니다.

 

개발 한지 10년이 넘었는데 CI를 이제 접하게 되어서 참 웃기는 꼴이 되었습니다. ㅎㅎ