编码函数的codeigniter中的is_unique

web*_*pic 5 php sql codeigniter

我有要求,我可以在新的添加功能中进行唯一值的验证

$this->form_validation->set_rules('email','Email','required|valid_email||is_unique[users.Email]');
Run Code Online (Sandbox Code Playgroud)

它的工作,但在编辑功能,它不工作..我有写回调函数来检查唯一的电子邮件.这是我在编辑功能中编写的代码

$this->form_validation->set_rules('email','Email','required|valid_email|callback_check_email');

function check_username($email)
    { 
        $return_value = $this->user_model->check_email($email);
        if ($return_value)
        {
            $this->form_validation->set_message('email_check', 'Sorry, This username is already used by another user please select another one');
            return FALSE;
        }
        else
        {
        return TRUE;
        }
    }
Run Code Online (Sandbox Code Playgroud)

和user_model

function check_mail($email)
    { 
        $sql = "SELECT users.Email
                FROM users
                WHERE 
                $email = users.Email
                ";

        $result = $this->db->query($sql)->result_array();
        return $result;

    }
Run Code Online (Sandbox Code Playgroud)

我无法验证唯一的电子邮件

Aru*_*run 9

在控制器中尝试此代码(编辑视图)

    $original_value = $this->db->query("SELECT EMAIL FROM users WHERE id = ".$id)->row()->EMAIL ;
    if($this->input->post('username') != $original_value) {
       $is_unique =  '|is_unique[users.EMAIL]';
    } else {
       $is_unique =  '';
    }
$this->form_validation->set_rules('username', 'User Name', 'required|min_length[3]|max_length[30]|trim|xss_clean'.$is_unique);
Run Code Online (Sandbox Code Playgroud)


小智 5

简单的解决方案,灵感来自 CodeIgniter 的 is_unique 代码。

警告:仅当数据库中行的标识符是典型的“id”时才有效。虽然,这个代码可以很容易地适应。

将 is_unique 更改为 edit_unique,并连接您正在编辑的行的 id,如下所示:

$this->form_validation->set_rules('email','Email','required|valid_email|edit_unique[users.Email.'.$id.']');
Run Code Online (Sandbox Code Playgroud)

然后转到 application/libraries 文件夹并使用以下代码创建 MY_Form_validation.php:

<?php

class MY_Form_validation extends CI_Form_validation{

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

}
Run Code Online (Sandbox Code Playgroud)

然后编辑这个文件:application/system/language/english/form_validation_lang.php

并在文件末尾添加此代码:

$lang['form_validation_edit_unique']= 'The {field} field must contain a unique value.';
Run Code Online (Sandbox Code Playgroud)

:D