2015-11-04 3 views
1

У меня проблема с моей функцией обратного вызова. Я создаю обратный вызов, который может подтвердить, что введенное имя пользователя совпадает с именем пользователя. Если это не то же самое, то подтвердите, если они уже существуют. Если не существует, то проверка должна пройти.Всегда возвращайте TRUE в Codeigniter form_validation callback

Вот что я сделал в процессе:

  1. Стараюсь обычно проверяются поля (требуется, max_length, min_length) == OK
  2. Input уже существует имя пользователя = OK
  3. ввода нового username = NOT OK

Когда я пытаюсь ввести новое имя пользователя. Он сказал, что он уже существует. И когда я проверил базу данных, он уже обновил мое имя пользователя.

Вот что у меня есть в моем коде:

CONTROLLER

$this->form_validation->set_rules('username', 'Username', 'required|trim|min_length[8]|max_length[30]|username_check'); 
$this->form_validation->set_rules('lastname', 'Last Name', 'required'); 
$this->form_validation->set_rules('firstname', 'First Name', 'required'); 
$this->form_validation->set_rules('email', 'Email Address', 'required|valid_email'); 
$this->form_validation->set_rules('phone1', 'Primary Contact', 'required'); 
$this->form_validation->set_rules('address1', 'Primary Address', 'required'); 
$this->form_validation->set_rules('birthday', 'Birthday', 'required'); 
$this->form_validation->set_rules('gender', 'Gender', 'required'); 

if($this->input->post('password1')) { 
    $this->form_validation->set_rules('password1', 'Password', 'required|trim|min_length[8]|max_length[16]'); 
    $this->form_validation->set_rules('password2', 'Confirm Password', 'required|trim|matches[password1]'); 
} 

if($data['role_id'] == 1 || $data['role_id'] == 2) { 
    $this->form_validation->set_rules('role', 'User Role', 'required'); 
    $this->form_validation->set_rules('status', 'Status', 'required'); 
} 

if($this->form_validation->run() == TRUE) { 

    $username = strtolower($this->input->post('username')); 
    $password = $this->input->post('password1'); 

    /** some code here **/ 

МОЙ ХЕЛПЕР CALLBACK

if(!function_exists('is_username_exists')) { 
     function is_username_exists($username) { 

      $ci =& get_instance(); 

      $ci->db->select('user_id'); 
      $ci->db->where('username', $username); 
      $checkValid = $ci->db->get('user'); 
      $num = $checkValid->num_rows(); 

      if($num > 0) { 
       return FALSE; 
      } else { 
       return TRUE; 
      } 


     } 
    } 


    if(!function_exists('username_check')) { 
     function username_check($username) { 

      $ci =& get_instance(); 

      $current_value = $ci->flx_user->getUsername(); 

      //check if the input value is same as the saved value 
      if($current_value != $username) { //if not same check if already existed 

       $is_available = is_username_exists($username); 

       if(!$is_available) { 
        $ci->form_validation->set_message('username_check', 'Username already taken. Please try again.'); 
        return FALSE; 
       } else { 
        return TRUE; 
       } 

      } else { 
       // if the same just bypass it 
       return TRUE; 
      } 
     } 
    } 

Можете ли вы помочь мне с этим?

+0

Если это не будет: 'WHERE имя пользователя =«». $ ci-> db-> escape ($ username). "'? (с окружающими одинарными кавычками?) –

ответ

2

Если пользователь существует в вашей базе данных вы должны return FALSE не return TRUE

И изменить ваш запрос

$ci->db->select("user_id"); 
$ci->db->where('username',$username); 
$checkValid=$ci->db->get("user"); 
$num = $checkValid->num_rows(); //counting row 

if($num>0){ 
    return FALSE; 
}else{ 
    return TRUE; 
} 
+0

Спасибо. Я попробую это .. :) – Jerielle

+0

Хорошо, я уже пробовал этот, но все тот же эффект. – Jerielle

+0

Я уже обновил код выше с пересмотренным. – Jerielle

1

Используйте num_rows() для лучшего опыта. Также см return заявления

$queryValid = $ci->db->query("SELECT * FROM user WHERE username = " . $ci->db->escape($username) . ""); 
    //$checkValid = $queryValid->row_array(); <-- remove this line 

    if($queryValid->num_rows() > 0) { 
     return FALSE; 
    } else { 
     return TRUE; 
    } 
Смежные вопросы