2012-12-03 20 views
14

私は、以下の状況でCodeigniterフォーム検証ライブラリからis_uniqueルールをどのように使用できるかを理解しようとしています。codeigniterフォームの妥当性確認のためのis_unique

私は編集ユーザーフォームを提出し、ルールを持ってしようとしています。フォーム内の他の値は変更されているが、この値は同じままならば

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

何。フォームにはこの値がすでに存在することがわかります。この値が変更されていない場合は、編集から保護する方法を教えてください。

答えて

28

例としてコードを使用すると、データベーステーブルのuser_nameというフィールドが検索され、is_unique検証ルールが機能します。同じ値のフィールドが存在する場合は、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

[この回答](http://stackoverflow.com/a/15930074/1356425)で使用できるedit_unique()関数です。 – Apostle

0

に役立ちます私のために働いたとよく文書化コード使用しています簡単な方法願っています(それを共有するためのhttps://github.com/ivantcholakovに感謝を!)。

$:私はそれが(MITがライセンス)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で参照し、アプリケーションの\ライブラリでは、アプリケーション\ MY_Form_validation.php
  2. __constructからこれらの2行を()の削除に保存しましたthis-> CI-> load-> helper( 'checkbox'); $ this-> CI-> load-> helper( 'email');

  3. __construct()およびunique()を除くすべての機能を削除します。お使いのコントローラ次の行を追加する__construct()メソッドの終わりに

  4. $ this-> load-> libraryメソッド( 'form_validation');独特の文書を1として

  5. ()メソッドは、このような「ユニークな」ルールを追加するためにあなたの検証ルールを更新(すでに必要としてきた場合などをしてルールをトリム):

    ... |必要|ユニーク[テーブル名、テーブル名(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ファイルの中にクラスを作成します。idは、usersテーブルの主キー
で、$ idはIDの値である文字列
を爆発するために私が使用し、 "@" の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.']'); 

。 これで、どのコントローラでも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] 
関連する問題