如何在 CodeIgniter 中检查多个值是不是唯一

Posted

技术标签:

【中文标题】如何在 CodeIgniter 中检查多个值是不是唯一【英文标题】:How to check multiple values to be unique in CodeIgniter如何在 CodeIgniter 中检查多个值是否唯一 【发布时间】:2022-01-21 16:48:53 【问题描述】:

我有一个用于注册用户的 html 表单。我想在 codeIgniter 中应用一个条件,即如果有人编写了数据库中已经存在的 2 个输入字段(名字和姓氏),则不允许插入数据。 喜欢我会写

$this->form_validation->set_rules('firstname', 'First Name', 'required|is_unique[student.firstname]');
$this->form_validation->set_rules('lastname', 'Last Name', 'required|is_unique[student.lastname]');

如何同时申请?就像两者都应该是唯一的,但一个已经存在。我想要“组合独特价值”之类的东西

示例:

名字:阿里

姓:莫尤丁

如果有人在两个字段中再次写相同的内容,那么我不想在数据库中插入数据,但如果有人写如下内容:

名字:阿里

姓:伊姆兰

那么我应该接受用户。

【问题讨论】:

检查这个:***.com/a/14577385/1682881 【参考方案1】:

您可以在验证中使用回调来做到这一点

$this->form_validation->set_rules('firstname', 'First Name', 'required|callback_check_user');// call callback function

$this->form_validation->set_rules('lastname', 'Last Name', 'required');

检查名字和姓氏的组合

function check_user() 
    $first_name = $this->input->post('firstname');// get first name
    $last_name = $this->input->post('lastname');// get last name
    $this->db->select('user_id');
    $this->db->from('student');
    $this->db->where('firstname', $first_name);
    $this->db->where('lastname', $last_name);
    $query = $this->db->get();
    $num = $query->num_rows();
    if ($num > 0) 
        return FALSE;
     else 
        return TRUE;
    

【讨论】:

设置错误信息,看这个例子:codeigniter.com/user_guide/libraries/…【参考方案2】:

一个简单的解决方案是添加自定义验证方法。

如果您还没有,请在您的 application/libraries 目录中创建一个名为 MY_Form_validation.php(区分大小写)的文件,其中包含以下内容:

class MY_Form_validation extends CI_Form_validation


    public function __construct($rules = array())
    
        parent::__construct($rules);
    

然后在那个文件中你可以有类似的东西:

    public function unique_user_name()
    

        $firstname = $this->CI->input->post('firstname');
        $lastname = $this->CI->input->post('lastname');

        $check = $this->CI->db->get_where('users', array('firstname' => $firstname, 'lastname' => $lastname), 1);

        if ($check->num_rows() > 0) 

            $this->set_message('unique_user_name', 'This name already exists in our database');

            return FALSE;
        

        return TRUE;
    

最后你的规则会是这样的:

$this->form_validation->set_rules('firstname', 'First Name', 'trim|required');
$this->form_validation->set_rules('lastname', 'Last Name', 'trim|required|unique_user_name');

希望这会有所帮助!

【讨论】:

【参考方案3】:

也许你对我的自定义 is_unique 函数感兴趣。 在这里。

您可以通过两种方式使用它:

1. is_unique[table_name.field_to_check.id_field_name.id_field_value] //<-- unique 1 field only


2. is_unique[table_name.field_to_check.id_field_name != 'id_field_value' and anotherIdName='theValue'] //<-- custom where 

只需将此代码保存在一个文件中,将其命名为 MY_Form_Validation.php,并将其放在库目录下。然后你可以把那些 is_unique

//is_unique[table_name.field_to_check.id_field_name.id_field_value] <-- unique 1 field only
//is_unique[table_name.field_to_check.id_field_name != 'id_field_value' and anotherIdName='theValue'] <-- custom where 
class MY_Form_validation extends CI_Form_validation 
    public function is_unique($str, $field)
    
        $hasil = true;

        try 
            //hanya validasi jika ada isinya. jika tidak ada isinya, tidak usah divalidasi.
            //karena kalau memang tidak boleh kosong, bisa kasih validasi required
            if ($str) 
                $x = substr_count($field, '.');
                if(strpos($field, "=") > 0) 
                    list($table, $field, $where) = explode('.', $field);
//                    list($table, $field, $id_field, $id_val, $where) = explode('.', $field);

                    $is_unique = 0;

                    if ($where) 
                        $logos = "select * from $table where $field =? and $where ";
                     else 
                        $logos = "select * from $table where $field =?  ";
                    

                    $data = array($str);
                    $qq = $this->CI->db->query($logos, $data);

                    if (is_log_query()) 
                        $logos = $this->CI->db->last_query();
                        log_to_file($logos);
                    

                    $row = $qq->row();
                    if ($row) 
                        if ($row->id) 
//                            if ($row->$id_field == $id_val) 
//                                $is_unique = 1; //berarti jika edit miliknya sendiri
//                             else 
//                                //berarti id milik record lain
//                            
                         else 
                            //berarti sudah ada di xuser_confirmed
                        
                     else 
                        $is_unique = 1; //belum ada sama sekali
                    

                    $hasil = (bool)$is_unique;

                
                else 
                    if ($x >= 3) 
                        list($table, $field, $id_field, $id_val) = explode('.', $field);

                        $is_unique = 0;

                        if ($id_field && $id_val) 
                            $logos = "select * from $table where $field =? and $id_field != '$id_val' ";
                         else 
                            $logos = "select * from $table where $field =?  ";
                        

                        $data = array($str);
                        $qq = $this->CI->db->query($logos, $data);

                        if (is_log_query()) 
                            $logos = $this->CI->db->last_query();
                            log_to_file($logos);
                        

                        $row = $qq->row();
                        if ($row) 
                            if ($row->id) 
                                if ($row->$id_field == $id_val) 
                                    $is_unique = 1; //berarti jika edit miliknya sendiri
                                 else 
                                    //berarti id milik record lain
                                
                             else 
                                //berarti sudah ada di xuser_confirmed
                            
                         else 
                            $is_unique = 1; //belum ada sama sekali
                        

                        $hasil = (bool)$is_unique;


                     
                    else if ($x == 1) 
                        list($table, $field) = explode('.', $field);
                        $query = $this->CI->db->limit(1)->get_where($table, array($field => $str));
                        $hasil = $query->num_rows() === 0;
                    
                
            

        catch (Exception $e) 
            die($e->getTraceAsString());
        
        return $hasil;
    

【讨论】:

以上是关于如何在 CodeIgniter 中检查多个值是不是唯一的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter:检查用户是不是登录多个页面

如何在 Codeigniter 中检查是不是设置了会话?

如何使用 CodeIgniter 在数据库中插入多个值?

如何检查在mysql中存储多个值的变量中是不是存在特定值?

Codeigniter-检查用户是不是存在于月份

如何检查请求是不是通过 CodeIgniter 中的 AJAX 发出?