代码之家  ›  专栏  ›  技术社区  ›  Chris

CodeIgniter-用户名和电子邮件存在性检查不起作用

  •  0
  • Chris  · 技术社区  · 7 年前

    在将数据插入数据库之前,我试图检查数据库中是否存在电子邮件或用户名。出于我不理解的原因,尽管使用了email\u exists和username\u exists函数,但在插入数据时,数据库会为username和email字段抛出一个字段非唯一错误。

    username\u exists和email\u exists函数获取与表单提交的用户名或电子邮件匹配的任何用户名或电子邮件。如果存在用户名或电子邮件,则函数返回true;如果存在用户名或电子邮件,则函数返回false。当两个函数都返回false(即数据库中不存在用户名和电子邮件)时,它会将表单数据插入数据库。

    任何帮助都会很好!

    控制器功能

     public function register(){
    
    if($this->session->userdata('loggedIn') == TRUE){
        $this->session->set_flashdata('error_msg', 'please log out to access this page ');
        echo 'Please log out to access this page!...';
        sleep(2);
        redirect('index.php/user/dashboard');
      }
    
      $data['session_data'] = array(
        'userID' => $this->session->userdata('userID'),
        'loggedIn' => $this->session->userdata('loggedID')
      );
    
    $this->load->view('navigation');
    $this->load->view('register', $data);
    
    echo 'registration page - ';
    if($this->input->post('register')){
    
      $this->form_validation->set_rules('username', 'username', 'required');
      $this->form_validation->set_rules('email', 'email', 'required|valid_email');
      $this->form_validation->set_rules('password', 'password', 'required');
    
      $user_details = array(
        'username' => strip_tags($this->input->post('username')),
        'email' => strip_tags($this->input->post('email')),
        'password' => strip_tags($this->input->post('password'))
      );
    
        if($this->form_validation->run() == true){
    
          $username_exists = $this->user_model->username_exists($user_details[0]);
          $email_exists = $this->user_model->email_exists($user_details[1]);
    
            if($username_exists == false && $email_exists == false) {
                $this->user_model->add_user_account($user_details);
                echo 'user added successfully: '. $user_details[0];
                $this->session->set_flashdata('success_msg', 'SUCCESSFULLY ADDED USER, username and email do not already exist!... ');
                sleep(2);
                redirect('index.php/user/login');
            } else {
                echo 'username or email already exists! try again!...';
                $this->session->set_flashdata('error_msg', 'ERROR OCCURRED - username or email exists!...');
                sleep(2);
                redirect('index.php/user/register');
            }
        } else {
            echo 'error occured, try again!...';
            $this->session->set_flashdata('error_msg', 'ERROR OCCURRED- something didn\'t work');
            sleep(2);
            redirect('index.php/user/register');
        }
    
    }
      }
    

    模型函数

      public function add_user_account($user_details){
        $this->db->insert('user_account', $user_details);
      }
    
      public function username_exists($username){
    $this->db->select('username');
    $this->db->from('user_account');
    $this->db->where('username', $username);
    $query = $this->db->get();
    
    if($query->num_rows() > 0){
      return true;
    } else {
      return false;
    }
      }
    
    
    
      public function email_exists($email){
    $this->db->select('email');
    $this->db->from('user_account');
    $this->db->where('email', $email);
    $query = $this->db->get();
    
    if($query->num_rows() > 0){
      return true;
    } else {
      return false;
    }
      }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Alex    7 年前

    $user_details[0] 不引用任何内容,因为您的 user_details 大堆我想你是想取钥匙 username 所以你应该这样做 $user_details['username'] .

    像这样:

    $username_exists = $this->user_model->username_exists($user_details['username']);
    $email_exists = $this->user_model->email_exists($user_details['email']);
    

    老实说,我很惊讶这不会让你注意到错误。


    此外,您可以轻松地将用户名/电子邮件exists函数设置为回调函数,或者只需使用 is_unique 的功能 form_validation 图书馆

    而且我很确定你可以申请 strip_tags 作为一个 form\u验证 规则,它将删除post变量中的标记。

        2
  •  1
  •   TimBrownlaw    7 年前

    为了通过简化的方式解决您的问题,您可以使用is\u unique[表.字段]作为验证规则。

    这样,您就不需要编写任何模型方法来检查您的用户名或电子邮件是否唯一。

    因此,在表单验证规则中,您可以更改用户名和电子邮件规则,以包含is\U唯一规则。

    $this->form_validation->set_rules('username', 'Username', 'required|is_unique[user_account.username]');
    
    $this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[user_account.email]');
    

    注意:第二个字段是表单标签,可以是任何内容。在这种情况下,我将其置于上方。第一个字段区分大小写。

    至于你现有的代码为什么不起作用。。。 尝试使用var\u dump()变得友好;或print\u r();

    $username_exists = $this->user_model->username_exists($user_details[0]);
    $email_exists = $this->user_model->email_exists($user_details[1]);
    
    // Debug these two and see what they are...   
    var_dump($username_exists);
    var_dump($email_exists);
    

    现在,您可以在设置中使用关联数组

      $user_details = array(
        'username' => strip_tags($this->input->post('username')),
        'email' => strip_tags($this->input->post('email')),
        'password' => strip_tags($this->input->post('password'))
      );
    

    然后像这样引用它们

    $username_exists = $this->user_model->username_exists($user_details[0]);
    

    使用上面的var\u转储应该会给你一个“啊哈!!!”片刻

    当有疑问时,var\u dump();