2012-12-03 198 views
14

我想弄清楚如何在以下情況下使用Codeigniter表單驗證庫中的is_unique規則。is_unique for codeigniter表單驗證

我試圖提交編輯用戶表單,並有規則:

$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|is_unique[users.user_name]'); 

如果被改變了形式與其他值,但該值保持不變。表單將會看到這個值已經存在,所以如果這個值沒有改變,我將如何保護它免於編輯。

回答

28

以您的代碼爲例,is_unique驗證規則的工作原理是在users數據庫表中查找名爲user_name的字段。如果存在相同值的字段,則驗證爲false。

爲了確保它只在用戶提交新值時運行,您可以檢查發佈的值$this->input->post('user_name')與從數據庫中提取的值來填充表單。如果它們相同,則不驗證is_unique;

if($this->input->post('user_name') != $original_value) { 
    $is_unique = '|is_unique[users.user_name]' 
} else { 
    $is_unique = '' 
} 

$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean'.$is_unique); 
+0

我將原始值定義爲什麼? –

+1

這將是從數據庫中提取的用戶user_name的原始值。 if語句將原始user_name與用戶提交的數據進行比較。如果用戶更改他們的用戶名,它將檢查該值是否已經存在,否則它只會進行正常的驗證。 – Jeemusu

+0

因此,我需要設置另一個查詢來查明舊值是什麼? –

6

有一個更好的辦法去解決它,我想,還是用CodeIgniters'驗證庫... ,你傳遞一個額外的參數,這是你正在編輯的行的id使用edit_unique ..見下面。我使用它,工作得對我很好..希望它有助於

$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|edit_unique[users.user_name.'.$id.']'); 
+4

函數edit_unique()在[此答案](http://stackoverflow.com/a/15930074/1356425)中可用。 – Apostle

0

下面是爲我工作,並使用有據可查的代碼的簡單方法(感謝https://github.com/ivantcholakov分享吧!)。我發現它在https://github.com/bcit-ci/CodeIgniter/issues/3109#issuecomment-46346280

  1. 下載https://github.com/ivantcholakov/starter-public-edition-3/blob/master/platform/application/libraries/MY_Form_validation.php引用(MIT許可),並將其保存到您在申請\庫應用程序\ MY_Form_validation.php
  2. 刪除__construct這兩條線路():

    $這 - > Cl - >負載>助手( '複選框'); $ this-> CI-> load-> helper('email');

  3. 刪除除__construct()和unique()之外的所有函數。

  4. 在控制器的__construct()方法的末尾添加這一行:

    $這 - >負載>庫( 'form_validation');

  5. 按照獨特的()方法的文檔更新您的驗證規則添加一個「獨特」的規則是這樣的(例如,如果你已經需要和修剪規則):

    ... |需要|獨特的[ 。tablename.fieldname,表名(PrimaryKey的使用的換更新)|修剪...

0
function check_unique_user_name($user_name) { 
      $query= $this->db->select('user_name') 
        ->from('emp') 
        ->where('id',$user_name); 

      $query = $this->db->get(); 
      if ($query->num_rows() > 0) { 
      return $query->row()->user_name; 
     } 
for $original_value you have to write function in model after Jeemusu code 
0

擴展Form_validation.php庫應用程序中創建的類/庫文件名MY_Form_validation。PHP

<?php 

class MY_Form_validation extends CI_Form_validation{ 
    protected $ci; 
    public function __construct($config = array()){ 
       parent::__construct($config); 
       $this->ci =& get_instance(); 
     } 

       public function is_unique_update($str, $field){ 
       $explode=explode('@', $field); 
       $field_name=$explode['0']; 
       $field_id_key=$explode['1']; 
       $field_id_value=$explode['2']; 
       sscanf($field_name, '%[^.].%[^.]', $table, $field_name); 

       if(isset($this->ci->db)){ 
         if($this->ci->db->limit(1)->get_where($table, array($field_name => $str,$field_id_key=>$field_id_value))->num_rows() === 0){ 
          $this->ci->form_validation->set_message('is_unique_update', 'The {field} field must contain a unique value.'); 
          return false; 
         } 
         return true; 
        } 


      } 
} 

現在在你的控制器

$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|is_unique_update[[email protected]@'.$id.']'); 

「@」 我用爆炸的字符串
其中id是用戶表的主鍵
並且$ id是id的值。 現在,您可以在任何控制器中使用此is_unique_update驗證。

1
$something = $this->input->post('something'); 

$this->form->validation->set_rules('something','Something','xss_clean|is_unique['tbl'.users]'); 

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

} 
0

,我們必須要爲is_unique

對於精通添加的表名。

is_unique[users.email]