Codeigniter doesn't let me update entry, because some fields must be unique
use the call back validation function
$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;}
in model
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(); }
use same for the user name....
In 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"]);
Eg.
$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)
For Codeigniter 3
Add following helper class (edit_unique_helper.php)
function edit_unique($value, $params) {$CI =& get_instance();$CI->load->database();
$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;}
}
Add to autoload ()
Use edit_unique where you pass an extra parameter which is the id of the row you're editingeg.
$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|edit_unique[users.user_name.'.$id.']');
Just change the name of your input in edit form and it will work.