Php CodeIgniter-用户名和电子邮件存在性检查不';行不通
在将数据插入数据库之前,我试图检查数据库中是否存在电子邮件或用户名。出于我不理解的原因,尽管使用了email_exists和username_exists函数,但在插入数据时,数据库会为username和email字段抛出一个field not unique错误 username_exists和email_exists函数获取与表单提交的用户名或电子邮件匹配的任何用户名或电子邮件。如果存在用户名或电子邮件,则函数返回true;如果相反,则返回false。当两个函数都返回false(即数据库中不存在用户名和电子邮件)时,它会将表单数据插入数据库 任何帮助都会很好 控制器功能Php CodeIgniter-用户名和电子邮件存在性检查不';行不通,php,codeigniter,registration,Php,Codeigniter,Registration,在将数据插入数据库之前,我试图检查数据库中是否存在电子邮件或用户名。出于我不理解的原因,尽管使用了email_exists和username_exists函数,但在插入数据时,数据库会为username和email字段抛出一个field not unique错误 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;
}
}
$user\u details[0]
不引用任何内容,因为您有用于user\u details
数组的非数字键。我假设您想访问密钥username
,因此您应该执行$user\u details['username']
像这样:
$username_exists = $this->user_model->username_exists($user_details['username']);
$email_exists = $this->user_model->email_exists($user_details['email']);
老实说,我很惊讶这不会让你注意到错误
此外,您还可以轻松地将用户名/电子邮件存在函数设置为回调函数,或者只需使用
表单验证
库的功能
另外,我非常确定,您可以将
strip\u标记
应用为表单验证
规则,它将删除post变量中的标记。$user\u details[0]
不引用任何内容,因为您为user\u details
数组提供了非数字键。我假设您想访问密钥username
,因此您应该执行$user\u details['username']
像这样:
$username_exists = $this->user_model->username_exists($user_details['username']);
$email_exists = $this->user_model->email_exists($user_details['email']);
老实说,我很惊讶这不会让你注意到错误
此外,您还可以轻松地将用户名/电子邮件存在函数设置为回调函数,或者只需使用
表单验证
库的功能
另外,我非常确定,您可以将
strip\u标记
应用为表单验证
规则,它将删除post变量中的标记。为了简化您的问题,您可以使用is\u unique[table.field]作为验证规则
这样,您就不需要编写任何模型方法来检查您的用户名或电子邮件是否唯一
因此,在表单验证规则中,您可以更改用户名和电子邮件规则,以包含is_唯一规则
$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()变得友好;或打印_r()
i、 e
现在可以看到,您正在设置中使用关联数组
$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() 为了通过简化的方式解决您的问题,您可以使用is_unique[table.field]作为验证规则 这样,您就不需要编写任何模型方法来检查您的用户名或电子邮件是否唯一 因此,在表单验证规则中,您可以更改用户名和电子邮件规则,以包含is_唯一规则
$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()变得友好;或打印_r()
i、 e
现在可以看到,您正在设置中使用关联数组
$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() 我正在到达那里Alex:)我正在到达那里Alex:)为什么你要使用echo“some message”然后使用sleep()然后用一条显示相同消息的flash消息执行重定向。如果它是用于调试的,那么在执行重定向之前最好先退出(“这是我的消息”)。只是一个想法!另一方面,由于您使用的是codeigniter,您可能会在回答问题时使用他们的html_escape()而不是strip标记?为什么要使用echo“some message”然后使用sleep(),然后使用一条显示相同消息的flash消息执行重定向。如果它是用于调试的,那么在执行重定向之前最好先退出(“这是我的消息”)。只是一个想法!另一方面,由于您使用的是codeigniter,您可以在回答问题时使用他们的html_escape()而不是strip标记?