CodeIgniter - 用户名和电子邮件存在性检查不起作用
CodeIgniter - username and email existence check doesn't work
我试图在将数据插入数据库之前检查数据库中是否存在电子邮件或用户名。由于我不明白的原因,尽管使用了 email_exists 和 username_exists 函数,但在插入数据时,数据库会为用户名和电子邮件字段抛出字段不唯一错误。
username_exists 和 email_exists 函数获取与表单提交的用户名或电子邮件匹配的任何用户名或电子邮件。如果存在用户名或电子邮件,则函数 return 为真,否则为假。当两个函数 return 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;
}
}
$user_details[0]
不引用任何内容,因为您有 user_details
数组的 non-numerical 键。我假设你的意思是访问密钥 username
因此你应该做 $user_details['username']
.
像这样:
$username_exists = $this->user_model->username_exists($user_details['username']);
$email_exists = $this->user_model->email_exists($user_details['email']);
老实说,我很惊讶这没有让您注意到错误。
此外,您可以轻松地将 username/email 存在的函数转换为回调,或者简单地使用 form_validation
库的 is_unique
功能。
此外,我很确定您可以将 strip_tags
应用为 form_validation
规则,它会删除 post 变量中的标签。
为了通过简化的方式解决您的问题,您可以使用 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 应该会给你一个 "Aha!!!" 的时刻。
有疑问时 var_dump();
我试图在将数据插入数据库之前检查数据库中是否存在电子邮件或用户名。由于我不明白的原因,尽管使用了 email_exists 和 username_exists 函数,但在插入数据时,数据库会为用户名和电子邮件字段抛出字段不唯一错误。
username_exists 和 email_exists 函数获取与表单提交的用户名或电子邮件匹配的任何用户名或电子邮件。如果存在用户名或电子邮件,则函数 return 为真,否则为假。当两个函数 return 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;
}
}
$user_details[0]
不引用任何内容,因为您有 user_details
数组的 non-numerical 键。我假设你的意思是访问密钥 username
因此你应该做 $user_details['username']
.
像这样:
$username_exists = $this->user_model->username_exists($user_details['username']);
$email_exists = $this->user_model->email_exists($user_details['email']);
老实说,我很惊讶这没有让您注意到错误。
此外,您可以轻松地将 username/email 存在的函数转换为回调,或者简单地使用 form_validation
库的 is_unique
功能。
此外,我很确定您可以将 strip_tags
应用为 form_validation
规则,它会删除 post 变量中的标签。
为了通过简化的方式解决您的问题,您可以使用 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 应该会给你一个 "Aha!!!" 的时刻。
有疑问时 var_dump();