CI 묻고 답하기

제목 DB에서 불러온 값이 없을 때 아래와 같은 에러가 나옵니다.
글쓴이 송군 작성시각 2011/09/29 11:32:06
댓글 : 11 추천 : 0 스크랩 : 0 조회수 : 19194   RSS

상황은 이렇습니다.

로그인을 할 떄 아이디와 패스워드를 입력받습니다.
그 이후 확인버튼을 눌러 폼 검증을 할 때
아이디 부분과 패스워드 부분에 콜백함수를 걸어놨습니다.

비밀번호가 틀렸을 때는 제대로 작동하지만
아이디가 틀렸을 경우엔 아래와 같은 에러가 뜹니다.
 

A PHP Error was encountered

Severity: Notice

Message: Undefined index: password

Filename: controllers/member.php

Line Number: 236


위의 에러는 입력받은 잘못된 아이디 값을
아이디의 콜백함수를 실행한 후
비밀번호의 콜백함수를 실행할 때 문제가 생겨서 나옵니다.

잘못된 아이디로 비밀번호의 콜백함수를 진행하니
쿼리엔 값이 안나오고 그래서 저런 에러가 나오는 것 같습니다.

하나의 폼 검증이 안맞는다면
다음 폼 검증을 실행하지 않는 방법이 없나요?

 다음글 변수 사용의 궁금증 (2)
 이전글 hooks 사용해서 다국어 페이지를 만드는 중 입니다. (3)

댓글

변종원(웅파) / 2011/09/29 11:59:53 / 추천 0
 소스를 올려주셔야 할 것 같네요.
소스상의 로직 문제인지 판단을 해야할거 같구요.
제가 보기엔 아이디가 틀렸다면 비번을 체크하기전에 먼저 폼에러를 뿌릴텐데
필요없는 변수를 콜백함수로 넘기시는건 아닌가 싶습니다.
콜백함수는 한번에 하나 처리하고 넘어가는거라 저렇게 나올 수가 없거든요.
한대승(불의회상) / 2011/09/29 12:16:41 / 추천 0
password가 선언되어 있지 않나보네요.. ^^

member.php 열어서 password 라는 단어로 검색을 해보시면 오류 해결 하실듯..
송군 / 2011/09/29 14:28:13 / 추천 0

아이디가 틀렸는데도 다음 폼검증에서 콜백함수를 호출하는것 같습니다ㅠㅠ

아이디가 맞고 비번이 틀리면 비번이 틀렸다고 제대로 나옵니다.
아이디가 맞고 비번도 맞으면 로그인이 정상적으로 이루어 집니다.

아이디가 틀리면 비번 폼검증 콜백함수에서 에러가 나옵니다.


function login()
{  
   $this->form_validation-> set_rules('user_id', 'User_id','xss_clean|required|callback_login_id');
   $this->form_validation-> set_rules('password', 'Password', 'xss_clean|required|callback_login_password');
   $this->input->post('user_id');// 패스워드 폼검증에서 이용
        
   if($this->form_validation->run() == FALSE)
   {
       $data['sess'] = FALSE;
       $this->load->view('common/header_v', $data);
       $this->load->view('member/login');
       $this->load->view('common/footer_v');
   }
   else
   {
       $this->member_m->login();
       redirect('pwoom');
   }
}


//폼검증콜백함수_로그인↓
function login_id( $str )
{
    $this->db->where( 'm_id', $str );
    $query = $this->db->get('Pwoom_member');
    $result = $query->num_rows();
        
    if( !$result )
    {
          
        $this->form_validation->set_message('login_id', '일치하는 아이디가 없습니다.');
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}
function login_password( $str )

    $str = md5( $str );
    $this->db->where( 'm_id', $this->input->post('user_id') );
        
    $query = $this->db->get('Pwoom_member');
    $result = array();
    $result = $query->row_array();
        
    if( $result['password'] == $str )  //오류나는 부분 : 아이디가 어긋나서 result[password]가 null일 때 에러가 나는듯합니다
    {
        return TRUE;
    }
    else
    {
        $this->form_validation->set_message('login_password', 'password가 맞지 않습니다.');
        return FALSE;
    }
}
송군 / 2011/09/29 15:06:41 / 추천 0
alert_helper로 두 함수에 alert을 시켜보았는데
아이디가 불일치 하는 경우에도 login_password 함수에서 alert이 나오는 것을 확인했습니다;
변종원(웅파) / 2011/09/29 15:16:12 / 추천 0
 로직이 잘못됐는데요?

아이디 중복체크 하시는거 아닌가요? 

!$result -> 아이디 중복이 아닐 경우 true로 리턴해야 하는데 반대네요.

그리고 login_password() 이 함수의 용도는 뭔가요?

로그인 처리하는 함수가 따로 있는데 굳이 앞단에서 미리 로그인 되는지 체크할 필요가 있을까요? 로직을 분화하지 않고 섞어서 작업하면 나누는 의미가 없습니다.



송군 / 2011/09/29 15:27:57 / 추천 0
웅파님 아닙니다.
아이디 중복체크가 아니라
입력받은 아이디가 DB에 있는지 체크하는 겁니다.^^;
그래서 값이 없을 때 FALSE를 반환한 거구요.

login_password()  이 함수의 용도는
입력 받은 패스워드가 같이 입력받은 아이디의 비밀번호가 맞는지
검사하는 함수 입니다.
변종원(웅파) / 2011/09/29 19:44:56 / 추천 0
 그게 중복체크입니다. ^^

값이 없으면 가입이 가능한 아이디이므로 통과를 시켜야죠. True....
가입가능한 아이디인데 false를 주면.... 

두번째도 앞단에서 할 필요가 있을까 하는겁니다. 어차피 뒷단에서 처리를 하는데요. 양쪽에 놔둘 필요가...
앞단에서 했다고 뒷단에서 안하면 보안문제 생길 수 있구요.
송군 / 2011/09/29 22:13:52 / 추천 0

헉;; 웅파님 아닙니다. 아닙니다

값이 없으면 가입이 가능한 아이디므로 통과를 시켜야죠. 라고 하시는거 보니
제가 회원가입을 위한 폼을 만들었다고 생각하시는거 같습니다;

저는 로그인부분을 만든겁니다.
ㅠㅠ

한대승(불의회상) / 2011/09/29 23:44:08 / 추천 0
ㅎㅎㅎ 결국 null 이 아니고 password 가 동일하면 되는군요.
오류난다고 생각되는 이부분을

    if( $result['password'] == $str )  //오류나는 부분 : 아이디가 어긋나서 result[password]가 null일 때 에러가 나는듯합니다

요렇게 해보세요.



    $result = $query->row_array();
        
    if(!empty($result) && $result['password'] == $str )  //오류나는 부분 : 아이디가 어긋나서 result[password]가 null일 때 에러가 나는듯합니다









변종원(웅파) / 2011/09/30 09:53:38 / 추천 0
아. 메세지가 일치하는 아이디가 없습니다라고 되어 있어서 제가 착각을 했네요. ^^;

답은 불의회상님이... ^^
송군 / 2011/09/30 10:33:12 / 추천 0

불의회상님의 답변대로 하니 잘 돌아갑니다.
ci관련된 질문을 올렸지만 php문법에 대한 것이 답이 되어서 부끄럽네요..
죄송합니다.

하루빨리 실력을 키워서 이런일 없도록 노력할게요^^ㅎㅎ
뭐가 문제인지는 모르겠지만 웅파님 말씀대로라면 패스워드 콜백함수가 실행되지
않아야 할텐데.. 이부분은 제가 주말에 테스트를 해보면서 공부해봐야겠네요.

웅파님// 괜찮습니다 ㅎㅎ 항상 친절하게 답변달아주셔서 감사합니다^^


그럼 다들 즐거운 금요일밤 보내세요!