is_unique用于codeigniter表单验证

时间:2012-12-03 21:56:43

标签: php codeigniter

我试图弄清楚如何在以下情况下使用Codeigniter表单验证库中的is_unique规则。

我尝试提交编辑用户表单并拥有以下规则:

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

如果表单中的其他值被更改但该值保持不变,该怎么办?表单将会看到此值已经存在,因此如果此值未更改,我将如何保护其不被编辑。

10 个答案:

答案 0 :(得分:34)

以您的代码为例,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);

答案 1 :(得分:7)

我认为还有更好的解决方法,仍然使用CodeIgniters'验证库...... 使用edit_unique,你传递一个额外的参数,这是你正在编辑的行的ID ..见下文..我使用它并且对我来说工作得很好..希望它有所帮助

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

答案 2 :(得分:1)

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

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

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

}

答案 3 :(得分:0)

这是一个简单的方法,对我有用,并使用记录良好的代码(感谢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许可)并将其保存到您的应用程序\ application \ libraries \ MY_Form_validation.php
  2. 从__construct()中删除这两行:

    $这 - > CI->负载>辅助( '复选框'); $这 - > CI->负载>辅助( '电子邮件');

  3. 删除除__construct()和唯一()之外的所有函数。

  4. 在控制器的__construct()方法结束时添加以下行:

    $这 - >负载>库( 'form_validation');

  5. 根据unique()方法的文档,更新验证规则以添加这样的“唯一”规则(例如,如果您已经有必需和修剪规则):

    ... |需要|独特[tablename.fieldname,表名(PrimaryKey的使用的换更新)。] |修剪...

答案 4 :(得分:0)

在应用程序/库文件名MY_Form_validation.php中扩展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验证。

答案 5 :(得分:0)

简单方式

只需将system / libraries / form_validation.php中的is_object设置为is_object

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;
}

答案 6 :(得分:0)

这个问题很老,但是也许有些新人遇到了这个问题,这就是解决方案。 我敢打赌,您正在使用模块化扩展(HMVC),并且您已经创建了一个新库MY_Form_validation。您为回调设置了id,因此在类上使用以下代码行即可使用回调:

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

好吧,解决此问题的方法是,每当您要使用“ is_unique”时,都必须删除此行代码“ $ this-> form_validation-> CI =&$ this;”。从课堂上。我已经遇到了这个问题,并且已经通过这种方式解决了,现在可以正常使用了。

如果您确实要使用回调“ $ this-> form_validation-> CI =&$ this;”,则仅对不需要使用is_unique的必需“方法” /“函数”进行此操作。 / p>

答案 7 :(得分:0)

此代码有助于创建和更新功能的独特验证...

在控制器中

在创建和更新功能中添加此表单验证代码

Courses c1 = new Courses();
c1.setCourseName("Java");
c1.setCourseId(1);
c1.setInstructor(i1);

在控制器中添加此回调函数

$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;
    }

答案 8 :(得分:0)

我正在使用 codeigniter3,当我在更新值时检查用户名时显示错误,is_unique 并非设计用于更新场景 所以使用@Anthony Mutisya 的回答,这里是完整的解决方案

在您的控制器中,在使用数据库验证当前用户的用户名时添加此行

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

您可以从提交的表单中获取 $id

现在,将以下函数添加到 /system/libraries/Form_Validation.php 这个文件。 System 文件夹位于 CodeIgniter3 文件夹的根目录中。

/**
* edit_unique // for check on update value
*
* Check if the input value doesn't already exist
* in the specified database field.
*
* @param    string  $str
* @param    string  $field
* @return   bool
*/
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;
    }
}

在我的情况下它工作得很好

答案 9 :(得分:-1)

我们必须为 is_unique

添加表名

for Exp。

 is_unique[users.email]