Я пытаюсь выяснить, как я могу использовать правило is_unique
из библиотеки проверки формы Codeigniter в следующей ситуации.
Я пытаюсь отправить редактирующую форму пользователя и имею правило:
$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|is_unique[users.user_name]');
Что делать, если другие значения в форме изменяются, но это значение остается неизменным. Форма увидит, что это значение уже существует, поэтому как бы защитить его от редактирования, если это значение не изменилось.
Используя код в качестве примера, is_unique
проверки is_unique
работает, ища поле с именем user_name
в таблице базы данных ваших users
. Если поле с тем же значением существует, оно проверяется как 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);
Есть лучший способ обойти это, я думаю, все еще используя библиотеку проверки CodeIgniters … Используйте edit_unique, где вы передаете дополнительный параметр, который является идентификатором строки, которую вы редактируете. См. Ниже. Я использую его и работает очень хорошо для меня .. надеюсь, что это поможет
$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|edit_unique[users.user_name.'.$id.']');
$something = $this->input->post('something'); $this->form->validation->set_rules('something','Something','xss_clean|is_unique['tbl'.users]'); if($this->form_validation->run()== FALSE){ }
-$something = $this->input->post('something'); $this->form->validation->set_rules('something','Something','xss_clean|is_unique['tbl'.users]'); if($this->form_validation->run()== FALSE){ }
-$something = $this->input->post('something'); $this->form->validation->set_rules('something','Something','xss_clean|is_unique['tbl'.users]'); if($this->form_validation->run()== FALSE){ }
Вот простой способ, который работал для меня и использовал хорошо документированный код (благодаря https://github.com/ivantcholakov для его обмена!). Я нашел ссылку на https://github.com/bcit-ci/CodeIgniter/issues/3109#issuecomment-46346280
Удалите эти две строки из __construct ():
$ This-> CI-> load-> помощник ( 'флажок'); $ This-> CI-> load-> помощник ( 'электронная почта');
Удалите все функции, кроме __construct () и unique ().
В конце метода __construct () вашего контроллера добавьте эту строку:
$ This-> load-> библиотека ( 'form_validation');
В соответствии с документацией метода unique () обновите правило валидации, чтобы добавить «уникальное» правило, подобное этому (например, если у вас уже есть необходимые правила и правила обрезки)
… | требуется | [. Tablename.fieldname, имя_таблицы (PrimaryKey используемый-для-обновления)] Уникальный | отделка …
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
Расширить библиотеку 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 – первичный ключ таблицы пользователей
и $ id – значение id. Теперь вы можете использовать эту проверку is_unique_update в любом контроллере.
нам нужно добавить имя таблицы для is_unique
для Exp.
is_unique[users.email]