CI 묻고 답하기

제목 중복 로그인일 경우 세션 처리 질문있습니다~
글쓴이 가나다123 작성시각 2015/06/19 14:49:26
댓글 : 5 추천 : 0 스크랩 : 0 조회수 : 17059   RSS
안녕하세요~

기존 세션 데이터베이스에 저장된 user_data 컬럼의 특정 데이터 값과
기존 세션 정보 값 이외에 다른 곳에서 같은 정보를 가지고 DB에 저장했을 경우에 , 기존의 세션 데이터를 sessionDestroy 걸어주고 싶은데, 어떻게 하면 좋을까요?

user_data 컬럼에 sql로 like문을 쓰기엔 나중에 데이터가 많아질 경우 속도 저하가 오지 않을까해서, 혹시 다른 방법이 있나 여쭤봅니다~

 
 다음글 코디그나이터 초보자가 질문드립니다. (9)
 이전글 Mysql에 html형태의 데이터 입력시 문제. (1)

댓글

변종원(웅파) / 2015/06/19 15:28:05 / 추천 0
현재 구조에서는 like문밖에 방법이 없습니다.

세션 부분 확장해서 아이디나 아이디번호를 따로 필드로 빼는 작업을 하셔야 원활히 작업가능합니다.
가나다123 / 2015/06/22 13:42:06 / 추천 0
변종원(웅파) 답변 감사합니다
like문으로 데이터베이스에서 삭제쿼리문을 삽입 후 중복 로그인을 했을 때

Error : {"readyState":4,"responseText":"","status":500,"statusText":"Internal Server Error"}, error, Internal Server Error

라는 에러코드가 alert로 먼저 뜨고, 다시 로그인 버튼을 누르면 로그인이 이루어집니다.

model부분입니다
function sessionDataCheck($c_email){
        $sql = "select session_id from ci_sessions where user_data like '%".$c_email."%'";
        $query = $this->db->query($sql);
        $result = $query->result();
        $row = "";
        foreach($result as $rows){
            $row =  $rows->session_id;
        }
        return $row;
    }

    function sessionDestroy($session_id){
        $sql = "DELETE FROM ci_sessions WHERE session_id='".$session_id."'";
        $query = $this->db->query($sql);
        $result = $query->result();

        return $result;
    }


controller 부분입니다
function getUserData(){
        $c_email = $this->input->get_post('l_email',TRUE);
        $c_password = $this->input->get_post('l_password',TRUE);

        $result = $this->bhview_m->usercheck($c_email,$c_password);

        $count = $this->bhview_m->getUserData($c_email,$c_password);

        if($result==1){
            $session_id = $this->bhview_m->sessionDataCheck($c_email);
            if($session_id!=''){
                $this->bhview_m->sessionDestroy($session_id);
            }
            $newdata = array(
                'c_email'=>$count[0]->c_email,
                'c_name'=>$count[0]->c_name,
                'logged_in'=>TRUE
            );
            $this->session->set_userdata($newdata);
        }

        echo $result;
    }


답변 부탁드릴게요 ㅠ
변종원(웅파) / 2015/06/22 17:00:45 / 추천 0
sessionDataCheck 함수에서 기존 로그인된것이 1개만 있다고 가정하고 프로그램 한다면
result()함수 보다는 


$result = $query->row();
return $result; 

하시는게 좋을 것 같습니다.

위 로직에 의하면 가장 최근의 세션id 1개만 리턴되는 구조입니다.

500 에러로 봐서는 db에러 같은데 어디서 나는지는 해당 쿼리를 직접 실행해보셔야 할 것 같네요.
가나다123 / 2015/06/22 18:32:13 / 추천 0
변종원(웅파) //
디버깅 해본 결과는 db 삭제 쿼리문을 실행할 때 에러가 납니다.
 
function sessionDestroy($session_id){
        $sql = "delete from ci_sessions where session_id='".$session_id."'";
        $query = $this->db->query($sql);
        $query->row(); //이 부분에서 에러가 납니다
    }

에러 문구가 나오지만, 데이터베이스에선 삭제가 됩니다
$session_id에 값이 들어오는 것도 확인됬구, sql 퀴리문을 mysql에서 직접 실행 시켰을때도 삭제가 잘 되었습니다.
제가 놓치는 부분이 어디있을까요? ㅜ
한대승(불의회상) / 2015/06/22 21:14:44 / 추천 0
$query->row() 를 삭제 하세요.

delete, update, insert 시 결과가 TRUE 로 넘어 옵니다.
result object가 아니니 에러가 나오는게 당연 합니다.

row(), row_array() 함수는 select 를 실행하고 나서야 result object가 넘어 오니 delete 하고 난후의 $query->row()는 아무 의미 없이 에러만 만드는 라인이 된겁니다.