【问题标题】:CodeIgniter - username and email existence check doesn't workCodeIgniter - 用户名和电子邮件存在检查不起作用
【发布时间】:2018-07-31 12:33:08
【问题描述】:

在将数据插入数据库之前,我正在尝试检查数据库中是否存在电子邮件或用户名。由于我不明白的原因,尽管使用了 email_exists 和 username_exists 函数,但在插入数据时,数据库会为用户名和电子邮件字段抛出字段非唯一错误。

username_exists 和 email_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;
}
  }

【问题讨论】:

  • 你为什么要使用 echo "some message" 然后 sleep() 然后使用显示相同消息的 flash 消息执行重定向。如果它是用于调试的,最好在重定向之前输入一个退出(“这是我的消息”),因为你正在处理它。只是一个想法!
  • 顺便说一句,由于您使用的是 codeigniter,您可能会使用他们的 html_escape() 而不是条形标签
  • 您的问题得到解答了吗?

标签: php codeigniter registration


【解决方案1】:

$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']);

说实话,我很惊讶这并没有给你通知错误。


此外,您可以轻松地将您的用户名/电子邮件存在函数转换为回调,或者简单地使用 form_validation 库的 is_unique 功能。

我也很确定您可以将strip_tags 应用为form_validation 规则,它会删除帖子变量中的标签。

【讨论】:

  • 我到了 Alex :)
【解决方案2】:

为了通过简化的方式解决您的问题,您可以使用 is_unique[table.field] 作为验证规则。

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

因此,在您的表单验证规则中,您可以更改您的用户名和电子邮件规则以包含 is_unique 规则。

$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_dump() 变得友好;或 print_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_dump 应该会给你一个“啊哈!!!”时刻。

当有疑问时 var_dump();

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多