CI 묻고 답하기

제목 폼 검증시 널값이 아닐때에만 폼 검증을 할 수 있는 방법이 없을까요?
글쓴이 진공발차기 작성시각 2015/01/07 11:50:50
댓글 : 9 추천 : 0 스크랩 : 0 조회수 : 12210   RSS
$config = array(
    array('field'=>'mb_name', 'label'=>'사원명', 'rules'=>'trim|required|min_length[3]|max_length[20]|xss_clean'),
    array('field'=>'mb_birth', 'label'=>'생년월일', 'rules'=>'trim|required|alpha_dash|xss_clean'),
    array('field'=>'mb_id', 'label'=>'아이디', 'rules'=>'trim|required|alpha_dash|xss_clean|callback_mb_id_check'),
    array('field'=>'mb_password', 'label'=>'비밀번호', 'rules'=>'trim|required|max_length[20]'),
    array('field'=>'mb_password_re', 'label'=>'비밀번호 확인', 'rules'=>'trim|required|max_length[20]|matches[mb_password]'),
    array('field'=>'mb_hp[0]', 'label'=>'전화번호 첫번째', 'rules'=>'exact_length[3]|numeric'),
    array('field'=>'mb_hp[1]', 'label'=>'전화번호 두번째', 'rules'=>'numeric'),
    array('field'=>'mb_hp[2]', 'label'=>'전화번호 세번째', 'rules'=>'exact_length[4]|numeric')
   );
   
   $this->form_validation->set_rules($config);
위와 같이 해서 폼 검증을 하는데요

저 같은 경우에는 휴대폰 번호는 필수로 받고 싶지 않아서 required를 빼고 쓰려고 하는데 뒤에 조건들 때문에 null 값을 경우에도 문제가 생깁니다. null 값이 아닐때에만 사용할 수 있는 방법은 없는 건가요?




 
 다음글 컨트롤러에서 생성자는 사용가능한데요. 소멸자는 사용 못... (2)
 이전글 url 경로 변경방법 궁금합니다 (1)

댓글

한대승(불의회상) / 2015/01/07 12:15:48 / 추천 0
아래 처럼 하시면 되겠네요.
 
$config = array(
    array('field'=>'mb_name', 'label'=>'사원명', 'rules'=>'trim|required|min_length[3]|max_length[20]|xss_clean'),
    array('field'=>'mb_birth', 'label'=>'생년월일', 'rules'=>'trim|required|alpha_dash|xss_clean'),
    array('field'=>'mb_id', 'label'=>'아이디', 'rules'=>'trim|required|alpha_dash|xss_clean|callback_mb_id_check'),
    array('field'=>'mb_password', 'label'=>'비밀번호', 'rules'=>'trim|required|max_length[20]'),
    array('field'=>'mb_password_re', 'label'=>'비밀번호 확인', 'rules'=>'trim|required|max_length[20]|matches[mb_password]'),
);

if($this->input->post('mb_hp[0]') && $this->input->post('mb_hp[1]') && $this->input->post('mb_hp[2]')) {
    $config[] = array('field'=>'mb_hp[0]', 'label'=>'전화번호 첫번째', 'rules'=>'exact_length[3]|numeric');
    $config[] = array('field'=>'mb_hp[1]', 'label'=>'전화번호 두번째', 'rules'=>'numeric');
    $config[] = array('field'=>'mb_hp[2]', 'label'=>'전화번호 세번째', 'rules'=>'exact_length[4]|numeric');
}
   
$this->form_validation->set_rules($config);
진공발차기 / 2015/01/07 12:39:50 / 추천 0
감사합니다.
방법은 위에 주신 것처럼 먼처 체크하는 방법 밖에는 없나 보네요. ^^
한대승(불의회상) / 2015/01/07 13:27:43 / 추천 0
진공발차기// 다른 방법도 있겠지만 가장 직관적이고 유지보수가 쉽습니다. ^^
진공발차기 / 2015/01/07 13:39:48 / 추천 0
네 감사합니다.
그런데 테스트를 하다 보니까요
$this->input->post('mb_hp[0]') 값이 안나오네요.
 
print_r($_POST["mb_hp"]); 
Array (     [0] => 010     [1] => 1234     [2] => 5678 ) 
/* 결과 값이 정상적으로 들어옮 */ 

$this->input->post('mb_hp[0]'); 
/* 결과 값이 없음 */ 

$this->input->post('mb_hp'); 
/* 결과 값이 Array 가 나오기 때문에 값은 있는 것 같은데요 print_r 도 되지가 않네요 */ 

$this->input->post("mb_name"); /* 배열이 아닌 것들은 결과 값이 받아짐 */

$this->input->post('mb_hp') 으로 했을 때에는 array 가 나와요.

진공발차기 / 2015/01/07 13:55:14 / 추천 0
참고로 값을 보내보니까

mb_hp[]=010&mb_hp[]=1234&mb_hp[]=5678 이렇게 가고 있네요.
한대승(불의회상) / 2015/01/07 14:26:02 / 추천 0
네.. 생각지 못했던 거네요.
아래 처럼 해보세요.
$mb_hp = $this->input->post('mb_hp);
if($mb_hp[0] &&$mbhp[1]&&$mbhp[2]) {
.
.
}
진공발차기 / 2015/01/07 14:28:14 / 추천 0
되네요 ^^ 진짜 이것 저것 해보면 답은 나오는데 이게 아직까지 응용하는 방법에 있어서 생각을 잘 못하네요 ㅜㅜ
진공발차기 / 2015/01/08 16:52:33 / 추천 0
문제점은 어제 해결을 했는데요 이거를 하다 보니까 좀 불편함이 생겨서.
$mb_hp = $this->input->post('mb_hp); 이쪽을 권장하는 core쪽을 건드려 보려고 했습니다.
 
function post($index = NULL, $xss_clean = FALSE)
 {
  // Check if a field has been provided
  if ($index === NULL AND ! empty($_POST))
  {
   $post = array();

   // Loop through the full _POST array and return it
   foreach (array_keys($_POST) as $key)
   {
    $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean);
   }
   return $post;
  }

  return $this->_fetch_from_array($_POST, $index, $xss_clean);
 }
위와 같이 써져 있는 부분의 소스를 아래와 같이 고쳐보기로 했습니다.

function post($index = NULL, $xss_clean = FALSE, $CHK = '')
 {
  // Check if a field has been provided

  if ($index === NULL AND ! empty($_POST))
  {
   $post = array();
  
   if($CHK == '') {
    // Loop through the full _POST array and return it
    foreach (array_keys($_POST) as $key)
    {
     $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean);
    }
   } else {
    foreach (array_keys($CHK) as $key)
    {
     $post[$key] = $this->_fetch_from_array($CHK, $key, $xss_clean);
    }
   }
   return $post;
  }

  return $this->_fetch_from_array($_POST, $index, $xss_clean);
 }

그리고 불러오기를 아래와 같이 불러왔는데 
$this->input->post('mb_mail[0]', TRUE,'mb_mail');

위에 소스중 $index === NULL 때문에 안되는데 이거 해결 방법이 없을까요?



한대승(불의회상) / 2015/01/09 11:32:47 / 추천 0
문제가 무엇인지 알고 계시니 해결 방법은 고민하면 해결 될 것 같습니다.

프레임워크 코어는 수정은 될수 있으면 하지 않는게 좋습니다.
프레임워크 업데이트나 문제 발생시 어느부분에서 발생했는지 추적을 하지 못하는 경우가 발생 할 수 있습니다.