CI 묻고 답하기

제목 비밀번호 변경시
글쓴이 가마니 작성시각 2016/02/26 01:26:34
댓글 : 5 추천 : 0 스크랩 : 0 조회수 : 15502   RSS

관리자단에서 회원 정보 수정 페이지를 만들고 있읍니다.

 

비밀번호 입력값이 있으면 수정 없으면 패스 하려고 합니다.

 

즉 비밀번호를 입력할수도 안할수도 있는데 form_validation 쪽에서 벽에 부딛히네요

 

비밀번호화 확인을 체크하자니 입력값이 없을때 오류가 나거나 디비에서 빈값으로 입력이 되고

 

무조건 입력시키자니 회원 비밀번호를 바꾸게 되네요

 

 array(           

'field' => 'member_passwd',           

'label' => '패스워드',           

'rules' => 'trim|required|min_length[4]'                    

),             

array(           

'field' => 'member_passwd_re',           

'label' => '패스워드 확인',           

'rules' => 'trim|required|min_length[4]|matches[member_passwd]'         

 ),

어떻게 해야 하는게 맞나요?

 

포럼 회원정보 수정에 가보니 이런 비슷한 구조 이네요

 

 다음글 ci 에서 캡슐화를 하고 싶은데 어떤식으로 처리하면 될... (2)
 이전글 Excel 사용하여 데이터 저장에서 문제가 생겼습니다. (2)

댓글

배강민 / 2016/02/26 07:59:15 / 추천 1

TapBBS/application/controllers/user.php

            //rules
            //비밀번호 입력했으면 수정, 아니면 통과
            //각 설정 길이들은 수정시에는 다른 항목 수정에서도 걸릴 수 있지만.. 이는 정책으로다가
            if($this->input->post('password'))
            {
                $this->form_validation->set_rules('password', lang('password'), 'trim|required|xss_clean|min_length[' . SETTING_user_password_length_minimum . ']|max_length[' . SETTING_user_password_length_maximum . ']');
                $this->form_validation->set_rules('password_confirm', lang('password_confirm'), 'trim|required|xss_clean|matches[password]');
            }
                //request
                if($this->input->post('password'))
                {
                    $req_password         = $this->form_validation->set_value('password');
                    $req_password_confirm = $this->form_validation->set_value('password_confirm');
                }
$values['password']             = ($this->input->post('password')) ? $super_secured_password : '';

 

TapBBS/application/models/users_model.php

        public function modify($values)
        {          
            $add_set = '';
            if($values['password'] !== '') 
            {
                $add_set = ' super_secured_password = \''.$values['password'].'\', timestamp_update_password = UNIX_TIMESTAMP(NOW()), client_ip_update_password = \''.$this->input->ip_address().'\', ';
            }
            
            $query = '
                        UPDATE
                            tb_users
                        SET
                            '.$add_set.'
                            name = ?
                            , nickname = ?
                            , email = ?
                            , message_receive_type = ?
                            , avatar_used = ?
                            , timezone = ?
                            , memo = ?
                            , timestamp_update = UNIX_TIMESTAMP(NOW())
                            , client_ip_update = ?
                        WHERE
                            idx = ? 
                    ';
            
			$query = $this->db->query($query, array(
													$values['name']
													, $values['nickname']
													, $values['email']
                                                    , $values['message_receive_type']
                                                    , $values['avatar_used']
													, $values['timezones']
                                                    , $values['memo']
													, $this->input->ip_address()
                                                    , USER_INFO_idx
													)
									);
			return $query;            
        }

 

헛발이 / 2016/02/26 12:30:05 / 추천 0

보통(?)은  비밀번호와 기본정보를 함께 수정하지 않고 기본정보만 수정기능과 비밀번호수정은 비밀번호만 해서

기능을 두개로 나눠서 하는데요...

개인적인 습관이겠지만

저도 간혹 사이트 이용시에 기본정보수정기능에 비밀번호도 같이 들어가 있으면 뭔가 이상한 느낌이 들던데...

비밀번호를 공백으로 해야 할지 아니면 기존 비밀번호를 넣어야 할지...

 

그래서 저같은 경우는 기본정보 수정과 비밀번호수정을 둘로 나눠서 기능을 만들고 있답니다...

가마니 / 2016/02/26 13:24:24 / 추천 0

배강민님 : 자세한 설명 감사합니다. 많은 도움이 되었읍니다.

헛발이님 : 저도 그말이 맞다고 생각이 드는데 조금이라도 코딩량을 줄여보고 싶은 마음에^^

             관리자단만 그렇게 하고 있읍니다.

배강민 / 2016/02/26 14:16:10 / 추천 0

전 회원정보수정이 그닥 많은것도 아니고, 비번 입력란에 안넣어도 되는 로직이지만, 넣는다고해서 문제될건 없어서 

제가 기획까지 하는거면 그냥 이렇게 합니다.ㅋ

마카오최 / 2016/02/27 02:34:07 / 추천 0

저도 이 문제때문에 고민을 한적이 있었는데요.

일단 인풋의 네임들이 필드명과 동일하다면 포스트로 넘어온 인풋배열들을

각종 처리과정을 거치고 모델로 넘기기 직전 필요없는 배열들은

unset($data['member_passwd_re']);

이런식으로 일괄적으로 깔끔하게 삭제후 넘겨줘서 처리하고 있습니다.

패스워드 확인 필드같은 것들은 굳이 디비저장을 하지 않아도 무관하므로 검사만 하고 필요없어지면 버리면 되거든요.

물론 마찬가지로 기본 패스워드 필드 조차도 입력되었을때만 처리하고 입력되지 않았다면 (패스워드 변경의사가 없는것이겠지요..)

패스워드필드와 패스워드 확인필드도 모두 unset() 시키시면 되구요..

이렇게 하시면 회원정보와 함께 섞여 와도 아무 문제 없죠.

unset() 가공후 남은 배열들을 $data 등에 담아 모델로 전송하시면 될듯 합니다.

 

예를들자면 아래와 같은 형태로 될듯 합니다. Modfy.php (컨트롤러)

$data = $this->input->post();
$data = $this->security->xss_clean($data);

// 폼 검증 ( 폼검증 룰들을 적용할 필드들을 쭉 나열하시면 됩니다. )
// name
// age

// ----------------------------------------------------------------------
// 만약 패스워드를 입력했다면?
if( !empty( $data['member_passwd'] ) ) 
{
	// 폼검증룰 적용
	$this->form_validation->set_rules('password', lang('password'), 'trim|required|xss_clean|min_length[' . SETTING_user_password_length_minimum . ']|max_length[' . SETTING_user_password_length_maximum . ']');
    $this->form_validation->set_rules('password_confirm', lang('password_confirm'), 'trim|required|xss_clean|matches[password]');
} 
else 
{
	// 패스워드를 입력하지 않았다면
	unset( $data['member_passwd'] );		// 패스워드 필드 삭제
	unset( $data['member_passwd_re'] ); // 패스워드 확인 필드 삭제
}
// ----------------------------------------------------------------------

// ----------------------------------------------------------------------
if ($this->form_validation->run() == FALSE)
{
	// 폼 검증 실패시 복구
	$this->load->view('수정페이지'); 
}
else
{
	// 폼 검증 성공시
	// 패스워드 암호화
	$data['member_passwd'] = 암호화시키는함수($data['member_passwd']);

	// 필요없는 배열값들은 삭제
	unset( $data['member_passwd_re'] );	// 패스워드 확인필드

	// 모델로 업데이트 시킬 배열 전송
	$this->member_m->update_row($data);
}
// ----------------------------------------------------------------------

 

업데이트 모델 부분 ( 기본적인 배열처리 업데이트 모델 입니다 ).

// 업데이트
function update_row($data)
{
	$this->db->where('member_id', $data['member_id']);
	$result = $this->db->update('멤버테이블명', $data);
	return $result;
}