2013-01-22 63 views
3

is_unique是表單驗證,它不允許數據庫中存在該值。 但是,我可以做相反的嗎?例如,我想需要的是在數據庫中存在 的價值,所以,我作出這樣的規則:如何在codeigniter中進行否定表單驗證?

$this->form_validation->set_rules('email', 'Email', 'required|max_length[32]|valid_email|(!(is_unique[users.email]))'); 

但正如我預期它似乎沒有成功,任何建議?謝謝。

+0

最簡單的方法是寫一個新的'is_unique' like函數,如'is_present'並將驗證邏輯修改爲h並且它。 – wallyk

+0

我會做一個單獨的規則是唯一的模型。並在控制器中捕獲結果。那麼我會扭轉結果 –

回答

2

你可以像下面這樣做

$this->form_validation->set_rules('email', 'Email', 'required|max_length[32]|valid_email|callback_email_available'); 

控制方法

public function email_available($str) 
{ 
    // You can access $_POST variable 
    $this->load->model('mymodel'); 
    $result = $this->mymodel->emailAvailability($_POST['email']); 
    if ($result) 
    { 
     $this->form_validation->set_message('email_available', 'The %s already exists'); 
     return FALSE; 
    }else{ 
     return TRUE; 
    } 
} 

型號mymodel.php

public function emailAvailability($email) 
{ 
    $this->db->where('email',$email); 
    $query = $this->db->get('tablename'); 
    return $query->row(); 
} 
0

通過在/application/core文件夾中添加像MY_Form_validation.php類擴展Form_validation庫(假設你的子類的前綴是MY,它是使用默認設置,這是一個簡單的例子,它只是通過改變最後的反轉現有的is_unique功能從return $query->num_rows() === 0;線。

class MY_Form_validation extends Form_validation 
{ 
    /** 
    * Match one field to others 
    * 
    * @access public 
    * @param string 
    * @param field 
    * @return bool 
    */ 
    public function is_not_unique($str, $field) 
    { 
     list($table, $field)=explode('.', $field); 
     $query = $this->CI->db->limit(1)->get_where($table, array($field => $str)); 

     return $query->num_rows() > 0; 
    } 
} 
0

嘗試自己的回調函數

$this->form_validation->set_rules('email', 'Email', 'required|max_length[32]|valid_email|callback_email_check'); 

功能會是這樣的

public function email_check($str) 
    { 
     if ($str == '[email protected]') 
     { 
      $this->form_validation->set_message('email_check', 'The %s field can not be the word "[email protected]"'); 
      return FALSE; 
     } 
     else 
     { 
      return TRUE; 
     } 
    }