22

is_unique次の状況で、Codeigniter フォーム検証ライブラリのルールをどのように使用できるかを理解しようとしています。

ユーザー編集フォームを送信しようとしていて、次のルールがあります。

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

フォーム内の他の値が変更されているが、この値は同じままである場合はどうなりますか? フォームは、この値が既に存在することを確認するため、この値が変更されていない場合、どのようにして編集から保護するのでしょうか。

4

10 に答える 10

40

コードを例として使用すると、検証ルールは、データベース テーブルでis_unique呼び出されたフィールドを探すことによって機能します。同じ値を持つフィールドが存在する場合は、false として検証されます。user_nameusers

ユーザーが新しい値を送信したときにのみ実行されるようにするには、投稿され $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);
于 2012-12-04T01:35:23.367 に答える
3
$something = $this->input->post('something');

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

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

}
于 2016-07-12T15:54:19.337 に答える
2

シンプルな方法

system/libraries/form_validation.php で isset を is_object に変更するだけです

public function is_unique($str, $field)
{
    sscanf($field, '%[^.].%[^.]', $table, $field);
    return is_object($this->CI->db) //default isset
        ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)
        : FALSE;
}
于 2018-06-27T11:24:54.977 に答える
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[users.user_name@id@'.$id.']');  

"@" を使用して文字列を展開しました
。ここで、id は users テーブルの主キーで
、$id は id の値です。これで、この is_unique_update 検証を任意のコントローラーで使用できるようになりました。

于 2016-05-02T07:01:13.653 に答える