簡體   English   中英

Codeigniter 不允許我更新條目,因為某些字段必須是唯一的

[英]Codeigniter doesn't let me update entry, because some fields must be unique

所以我想要做的是:

  1. 從數據庫中提取用戶數據,包括電子郵件地址、用戶名等。

  2. 編輯它

  3. 保存

但我想保持用戶名和電子郵件的唯一性。 為此,我正在設置如下驗證規則:

$this->form_validation->set_rules('firstname', 'First Name', 'required|min_length[2]|max_length[15]');
$this->form_validation->set_rules('lastname', 'Last Name', 'required|min_length[2]|max_length[15]');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[users.email]');
$this->form_validation->set_rules('username', 'Username', 'required|min_length[4]|max_length[12]|is_unique[users.username]');
$this->form_validation->set_rules('password1', 'Password', 'required|matches[password2]');
$this->form_validation->set_rules('password2', 'Password Confirmation', 'required');
$this->form_validation->set_rules('group', 'User Group', 'required');

正如你所看到的,我有is_unique[users.username]is_unique[users.email]規則。 但它不允許我使用此規則更新我的條目。

所以問題是,如何更新數據庫條目,並保持這兩個字段的唯一性(用戶名和電子郵件)?

使用回調驗證功能

$this->form_validation->set_rules('email', 'Email', 'required|valid_email|callback_check_user_email');

function check_user_email($email) {        
    if($this->input->post('id'))
        $id = $this->input->post('id');
    else
        $id = '';
    $result = $this->user_model->check_unique_user_email($id, $email);
    if($result == 0)
        $response = true;
    else {
        $this->form_validation->set_message('check_user_email', 'Email must be unique');
        $response = false;
    }
    return $response;
}

在模型中

    function check_unique_user_email($id = '', $email) {
        $this->db->where('email', $email);
        if($id) {
            $this->db->where_not_in('id', $id);
        }
        return $this->db->get('user')->num_rows();
    }

使用相同的用戶名....

在 Codeigniter 4

// is_unique[table.field,ignore_field,ignore_value]

$validation->setRules([
 'name' => "is_unique[supplier.name,uuid, $uuid]",  // is not ok
 'name' => "is_unique[supplier.name,uuid,$uuid ]",  // is not ok
 'name' => "is_unique[supplier.name,uuid,$uuid]",   // is ok
 'name' => "is_unique[supplier.name,uuid,{uuid}]",  // is ok - see "Validation Placeholders"

]);

例如。

$validation->setRules(['email' => 'required|valid_email|is_unique[users.email,id,4]']);
// 'id' = ignore table field name (users table 'id' field) 
// '4' = ignore field value(currnet user id)

codeigniter 4 驗證

對於 Codeigniter 3

  1. 添加以下助手類(edit_unique_helper.php)

    function edit_unique($value, $params) { $CI =& get_instance(); $CI->加載->數據庫();

     $CI->form_validation->set_message('edit_unique', "Sorry, that %s is already being used."); list($table, $field, $current_id) = explode(".", $params); $query = $CI->db->select()->from($table)->where($field, $value)->limit(1)->get(); if ($query->row() && $query->row()->id != $current_id) { return FALSE; } else { return TRUE; }

    }

  2. 添加到自動加載 ()

  3. 在傳遞額外參數的地方使用 edit_unique,該參數是您正在編輯的行的 ID,例如。 $this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|edit_unique[users.user_name.'.$id.']');

來源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM