Is_unique для проверки правильности формы кода - программирование
Подтвердить что ты не робот

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

Я пытаюсь выяснить, как я могу использовать правило is_unique из библиотеки проверки формы Codeigniter в следующей ситуации.

Я пытаюсь отправить редактирующую пользовательскую форму и имею правило:

$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|is_unique[users.user_name]');

Что делать, если другие значения в форме изменяются, но это значение остается неизменным. Форма увидит, что это значение уже существует, и как бы защитить его от редактирования, если это значение не изменилось.

4b9b3361

Ответ 1

Используя ваш код в качестве примера, правило проверки 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);

Ответ 2

Есть лучший способ обойти это, я думаю, все еще используя библиотеку проверки CodeIgniters... Используйте edit_unique, в котором вы передаете дополнительный параметр, который является идентификатором строки, которую вы редактируете. См. Ниже. Я использую его и отлично работаю для меня.. надеюсь, что это поможет

$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|edit_unique[users.user_name.'.$id.']');

Ответ 3

$something = $this->input->post('something');

$this->form->validation->set_rules('something','Something','xss_clean|is_unique['tbl'.users]');

if($this->form_validation->run()== FALSE){

}

Ответ 4

Вот простой способ, который работал у меня и использовал хорошо документированный код (благодаря https://github.com/ivantcholakov для его обмена!). Я нашел ссылку на https://github.com/bcit-ci/CodeIgniter/issues/3109#issuecomment-46346280

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

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

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

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

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

  • В соответствии с документацией метода unique() обновите правило валидации, чтобы добавить "уникальное" правило, подобное этому (например, если у вас уже есть необходимые правила и правила обрезки):

    ... | требуется | уникальный [tablename.fieldname, имя_таблицы (PrimaryKey используемый-для-обновления).] | Подрезать...

Ответ 5

    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

Ответ 6

Расширить библиотеку 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[[email protected]@'.$id.']');  

"@" Я использовал для взорвания строки
где id - первичный ключ таблицы пользователей
и $id - значение id. Теперь вы можете использовать эту проверку is_unique_update в любом контроллере.

Ответ 7

Простой способ

Просто измените isset на is_object в system/library/form_validation.php

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

Ответ 8

Этот вопрос очень старый, но, возможно, некоторые новые люди сталкиваются с этой проблемой, и это решение для нее. Могу поспорить, что вы используете модульные расширения (HMVC), и вы создали новую библиотеку MY_Form_validation. Вы сделали id для обратных вызовов, поэтому у вас есть эта строка кода в вашем классе, чтобы использовать обратные вызовы:

$this->form_validation->CI =& $this;

Что ж, решение этой проблемы - всякий раз, когда вы хотите использовать "is_unique", вы должны удалить эту строку кода "$this-> form_validation-> CI = & $ this;" из класса. У меня возникла эта проблема, и я исправляю ее так, теперь она работает нормально.

Если вы действительно хотите использовать обратные вызовы "$this-> form_validation-> CI = & $ this;", то делайте это только с необходимыми "методами"/"функциями", где вы не хотите использовать is_unique.

Ответ 9

Этот код полезен для уникальной проверки для создания и обновления функции...

В контроллере

Добавьте этот код проверки формы в функцию создания и обновления

$this->form_validation->set_rules('order_no', 'Order no', 'required|callback_check_order_no');

Добавьте эту функцию обратного вызова в контроллер

function check_order_no($order_no) {        
        if($this->input->post('id'))
            $id = $this->input->post('id');
        else
            $id = '';
        $result = $this->Data_model->check_unique_order_no($id, $order_no);
        if($result == 0)
            $response = true;
        else {
            $this->form_validation->set_message('check_order_no', 'Order no already exist');
            $response = false;
        }
        return $response;
    }

В модели

function check_unique_order_no($id = '', $order_no) {
        $this->db->where('order_no', $order_no);
        $this->db->where('status', "A");

        if($id) {
            $this->db->where_not_in('id', $id);
        }
        return $this->db->get('delivery_order')->num_rows();
    }

Ответ 10

нам нужно добавить имя таблицы для is_unique

для Exp.

 is_unique[users.email]