在将数据插入数据库之前,我正在尝试检查数据库中是否存在电子邮件或用户名。出于某种原因我不明白,尽管使用了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;
}
}
答案 0 :(得分: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
规则,它会删除帖子变量中的标记。
答案 1 :(得分:1)
通过简化方法解决您的问题,您可以使用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]');
注意:第二个字段是表单标签,可以是任何内容。在这种情况下,我将其大写。第1个字段区分大小写。
至于为什么你现有的代码不能正常工作...... 尝试使用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();