is_unique在编码点火器中进行编辑功能


is_unique in codeigniter for edit function

>我有要求,我可以在新添加函数中对唯一值进行验证,例如

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

的工作,但在编辑功能中它不起作用..我编写了回调函数来检查唯一的电子邮件。这是我在编辑函数中编写的代码

$this->form_validation->set_rules('email','Email','required|valid_email|callback_check_email');
function check_username($email)
    { 
        $return_value = $this->user_model->check_email($email);
        if ($return_value)
        {
            $this->form_validation->set_message('email_check', 'Sorry, This username is already used by another user please select another one');
            return FALSE;
        }
        else
        {
        return TRUE;
        }
    }

和user_model

function check_mail($email)
    { 
        $sql = "SELECT users.Email
                FROM users
                WHERE 
                $email = users.Email
                ";
        $result = $this->db->query($sql)->result_array();
        return $result;
    }

我无法验证唯一的电子邮件

在控制器中尝试此代码(编辑视图(

    $original_value = $this->db->query("SELECT EMAIL FROM users WHERE id = ".$id)->row()->EMAIL ;
    if($this->input->post('username') != $original_value) {
       $is_unique =  '|is_unique[users.EMAIL]';
    } else {
       $is_unique =  '';
    }
$this->form_validation->set_rules('username', 'User Name', 'required|min_length[3]|max_length[30]|trim|xss_clean'.$is_unique);

简单的解决方案,灵感来自CodeIgniter的is_unique代码。

警告:仅当数据库中行的标识符是典型的"id"时才有效。虽然,这段代码很容易适应。

将is_unique更改为edit_unique,并连接正在编辑的行的 id,如下所示:

$this->form_validation->set_rules('email','Email','required|valid_email|edit_unique[users.Email.'.$id.']');

然后转到应用程序/库文件夹并使用以下代码创建MY_Form_validation.php:

<?php
class MY_Form_validation extends CI_Form_validation{
    public function edit_unique($str, $field)
    {
        sscanf($field, '%[^.].%[^.].%[^.]', $table, $field, $id);
        return isset($this->CI->db)
            ? ($this->CI->db->limit(1)->get_where($table, array($field => $str, 'id !=' => $id))->num_rows() === 0)
            : FALSE;
    }
}

然后编辑此文件:应用程序/系统/语言/英语/form_validation_lang.php

并在文件末尾添加以下代码:

$lang['form_validation_edit_unique']= 'The {field} field must contain a unique value.';

:D

假设系统为您提供更新应用程序中的用户名,然后:-

文件>>配置/form_validation.php

$config = array(
    "add_user" => array(
        array('field' => 'name','label' => 'name','rules' =>'required','errors' => array(
            'required' => '%s is required.' 
        )),
        array('field' => 'username','label' => 'username','rules' =>'required|is_unique[tbl_users.username]','errors' => array(
            'required' => '%s is required.',
            'is_unique' => 'Sorry, that %s value is already being used.', 
        )),
        array('field' => 'password','label' => 'password','rules' =>'required','errors' => array(
            'required' => '%s is required.' 
        )),
    ),
    "update_user" => array(
        array('field' => 'name','label' => 'name','rules' =>'required','errors' => array(
            'required' => '%s is required.' 
        )),
        array('field' => 'username','label' => 'username','rules' =>'required|callback_unique_username','errors' => array(
            'required' => '%s is required.' 
            'unique_username' => 'Sorry, that %s value is already being used.' 
        )),
        array('field' => 'password','label' => 'password','rules' =>'required','errors' => array(
            'required' => '%s is required.' 
        )),
    )
)

文件>>控制器/用户.php

    public function unique_username($username){
        /* 
        * At the time of update you will be needing the user_id 
        * of particular user whose profile you want to update
        * we have placed user_id as hidden field in user update view 
        * form like 
        * <input type="hidden" value="{user_id here}" name="user_id">  
        */ 
        $this->db->where_not_in('user_id',$this->input->post('user_id'));
        $this->db->where('username',$username);
        if($this->db->count_all_results('tbl_users') > 0){
            return false;
        }else{
            return true;
        }
    }

改进仅支持"id"作为列名的"DrPollit0"解决方案。此解决方案允许您清除列名称,如列 ID

在应用程序''库中创建自定义验证类MY_Form_validation.php

class MY_Form_validation extends CI_Form_validation
{
    public function __construct($rules = array())
    {
        $this->CI =& get_instance();
        parent::__construct($rules);
    }
    public function edit_unique($str, $field)
    {
        sscanf($field, '%[^.].%[^.].%[^.].%[^.]', $table, $field, $columnIdName, $id);
        return isset($this->CI->db)
            ? ($this->CI->db->limit(1)->get_where($table, array($field => $str, $columnIdName .'!=' => $id))->num_rows() === 0)
            : FALSE;
    }
}

将此添加到系统''语言''英语''form_validation_lang.php

$lang['form_validation_edit_unique']= 'The supplied value is already taken.';

在控制器中使用

$id = $this->uri->segment(3);
'rules' => 'trim|required|max_length[50]|edit_unique[mytable.mycolumn.columnID.'.$id.']'
<?php
/* Create MY_Form_validation.php  in ci_root/application/libraries */
class MY_Form_validation extends CI_Form_validation {
public function is_unique($str, $field) {
    if (substr_count($field, '.') == 3) {
        list($table, $field, $id_field, $id_val) = explode('.', $field);
        $query = $this->CI->db->limit(1)->where($field, $str)->where($id_field . ' != ', $id_val)->get($table);
    } else {
        list($table, $field) = explode('.', $field);
        $query = $this->CI->db->limit(1)->get_where($table, array($field => $str));
    }
    return $query->num_rows() === 0;
}
}
?>

<?php
/* implementation */
function update() {
$user_id = $this->input->post("user_id");
$rules = array(array(
        'field' => 'email',
        'label' => 'Email',
        'rules' => 'required|valid_email|is_unique[users.Email.id.' . $user_id . ']'));
$this->form_validation->set_rules($rules);
}
 $original_value = $this->db->query("select role_name from user_roles where iduser_roles = ".$iduser_roles)->row()->role_name ;
        if($this->input->post('role_name') != $original_value) {
            $is_unique =  '|is_unique[user_roles.role_name]';
        } else {
            $is_unique =  '';
        }
        $this->form_validation->set_rules('role_name', 'Role Name', 'trim|required|xss_clean'.$is_unique);

这样更灵活:

public function edit_unique($str, $field)
    {
        sscanf($field, '%[^.].%[^.].%[^.]', $table, $field, $value);
        return isset($this->CI->db)
            ? ($this->CI->db->limit(1)->get_where($table, array(''.$field.' !=' => $value))->num_rows() === 0)
            : FALSE;
    }

删除双 || 并将单 | 放在 is_unique 和函数名称之前check_username应该是您在callback_之后给出的名称,这意味着它应该在您的情况下check_email