Intereting Posts

is_unique для проверки правильности формы кода

Я пытаюсь выяснить, как я могу использовать правило 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

  1. Загрузите https://github.com/ivantcholakov/starter-public-edition-3/blob/master/platform/application/libraries/MY_Form_validation.php (лицензия MIT) и сохраните его в своем приложении в приложении \ libraries \ MY_Form_validation.php
  2. Удалите эти две строки из __construct ():

    $ This-> CI-> load-> помощник ( 'флажок'); $ This-> CI-> load-> помощник ( 'электронная почта');

  3. Удалите все функции, кроме __construct () и unique ().

  4. В конце метода __construct () вашего контроллера добавьте эту строку:

    $ This-> load-> библиотека ( 'form_validation');

  5. В соответствии с документацией метода 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]