Codeigniter表单验证is_unique更新

时间:2017-04-26 06:30:11

标签: forms codeigniter validation

我正在处理与域相关的网站的管理面板,我有不同的场景。 更新数据时,如何检查域名的唯一性。就像我添加数据时一样,工作正常。

  

$这 - > form_validation-> set_rules(' DOMAIN_NAME','域   姓名','必需| is_unique [domains.domain_name]',数组(' is_unique' =>   '此%s已经存在。'));

但是当我要更新记录时,我感到困惑,怎么可能。

如果管理员点击修改域名数据并且他不想更改域名,但是他想要点击更新按钮时更新任何其他字段它显示错误该域名已经存在。

  
    

我的问题是,当管理员更新表单时,如果他想在不更改域名的情况下更新表单,它应该不会显示唯一的错误.....但如果他更改了域名,那么它应该检查唯一性。     我有不同的表单来添加和更新域数据。

  

如何解决此问题。任何人都可以帮忙????

3 个答案:

答案 0 :(得分:0)

当您编辑表单然后将实际值存储在隐藏字段中时,单击以更新字段时,请检查隐藏字段值和文本字段值,如果它们相同则不应用此类条件

if($this->input->post("actual_value")==$this->input->post("updated_textfield_value")){
    $this->form_validation->set_rules('domain_name','Domain Name','required');
}else{
    $this->form_validation->set_rules('domain_name','Domain Name','required|is_unique[domains.domain_name]',array('is_unique' => 'This %s already exists.'));
}

答案 1 :(得分:0)

我自己刚遇到过这个问题。我的解决方案是扩展表单验证库并稍微修改原始的is_unique方法,方法是添加另一个'where'子句来排除self。

在控制器中:

$id = $this->uri->segment(3);

$this->form_validation->set_rules('domain_name', 'Domain Name', 'update_is_unique[domains.domain_name.'.$id.']', 
    array('update_is_unique' => 'This {field} already exists.'));

在libraries / MY_Form_validation.php中     

class MY_Form_validation extends CI_Form_validation {

    public function __construct()
    {
        $this->CI =& get_instance();
    }    

    public function update_is_unique($str, $field)
    {
        sscanf($field, '%[^.].%[^.].%[^.]', $table, $field, $id);
        return $this->db->limit(1)->get_where($table, array($field => $str, 'id !=' => $id))->num_rows() === 0;
    }
}

答案 2 :(得分:0)

此解决方案允许您清除列名称,例如columnID。在application \ libraries \ MY_Form_validation.php中创建自定义验证类

class MY_Form_validation extends CI_Form_validation
{
    public function __construct($rules = array())
    {
        $this->CI =& get_instance();
        parent::__construct($rules);
    }

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

将此添加到system \ language \ english \ form_validation_lang.php

$lang['form_validation_edit_unique']= 'The supplied value is already taken.';

要在控制器中使用

$id = $this->uri->segment(3);
'rules' => 'trim|required|max_length[50]|edit_unique[mytable.mycolumn.columnID.'.$id.']'