Codeigniter 3 注册应用程序:让用户知道电子邮件已经存在

Codeigniter 3 registration application: let user know email already exists via a flash message

我已经使用 Codeigniter 3 创建了一个注册和登录应用程序。

注册表单验证确保用户 table 中的每个 电子邮件 都是 唯一的 ,如下图所示:

而不是电子邮件字段下方的"The Email field must contain a unique value",我想要一条快速消息让用户知道提供的电子邮件已经存在并且he/she应该登录 而不是 注册 :

我在 if 语句 中使用 $email_exists 函数,但该函数本身不存在 .

我想在 $email_exists 函数中使用 CI 的 is_unique。我该怎么做?

这是实现所需功能的好方法吗?

我的 signup() 函数如下所示:

public function signup()
 {
    $this->form_validation->set_rules('first_name', 'First name', 'required');
    $this->form_validation->set_rules('last_name', 'Last name', 'required');
    $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email|is_unique[users.email]');
    $this->form_validation->set_rules('password', 'Password', 'required|matches[cpassword]');
    $this->form_validation->set_rules('cpassword', 'Confirm password', 'required');
    $this->form_validation->set_error_delimiters('<p class="error">', '</p>');

    if ($this->form_validation->run()) {
        $first_name = $this->input->post('first_name');
        $last_name = $this->input->post('last_name'); 
        $email =  $this->input->post('email');
        $password = $this->input->post('password');
        $date_created = date('Y-m-d H:i:s');
        $date_updated = date('Y-m-d H:i:s');
        $verification_key = md5($email);
        $active = 0;
        $this->load->model('Usermodel');
        // Create account
        if ($this->Usermodel->user_register($first_name, $last_name, $email, $password, $date_created, $date_updated, $verification_key, $active)) {
            $this->session->set_flashdata("signup_sucess", "Your account was created. Your have to activate it before you can signin. We have send you an activation email at $email.");
        } else {
            $this->session->set_flashdata("signup_failure", "We ware unable to create your account");
        }
        redirect('signup'); 
    } else {
        $this->load->view('signup');
        if ($email_exists) {
            $this->session->set_flashdata("email_exists", "The email address you provided already exists. Please signup.");
        }
    }
}

代替 $this->load->view('signup'); 使用 redirect('controller/method') 并在重定向前设置您的即显消息 $this->session->set_flashdata("signup_failure", "Email alredy exist");

替换您的以下 else 条件

else {
        $this->load->view('signup');
    }

else {
        $this->session->set_flashdata("signup_failure", "Email address <?php echo $this->input->post('email'); ?> alredy exist in our database");
        redirect('signup');
    }

如果你坚持使用验证函数来做,你可以很容易地像这样调用它:

$this->form_validation->is_unique($email, 'users.email')

根据源文件文档,is_unique 函数期望第一个参数是要匹配的字符串,第二个参数是 tablefield

完整代码:

public function signup()
    {
        $this->form_validation->set_rules('first_name', 'First name', 'required');
        $this->form_validation->set_rules('last_name', 'Last name', 'required');
        $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email|is_unique[users.email]');
        $this->form_validation->set_rules('password', 'Password', 'required|matches[cpassword]');
        $this->form_validation->set_rules('cpassword', 'Confirm password', 'required');
        $this->form_validation->set_error_delimiters('<p class="error">', '</p>');

        $email = $this->input->post('email');

        if ($this->form_validation->run()) {
            $first_name = $this->input->post('first_name');
            $last_name = $this->input->post('last_name');
            $password = $this->input->post('password');
            $date_created = date('Y-m-d H:i:s');
            $date_updated = date('Y-m-d H:i:s');
            $verification_key = md5($email);
            $active = 0;
            $this->load->model('Usermodel');
            // Create account
            if ($this->Usermodel->user_register($first_name, $last_name, $email, $password, $date_created, $date_updated, $verification_key, $active)) {
                $this->session->set_flashdata("signup_sucess", "Your account was created. Your have to activate it before you can signin. We have send you an activation email at $email.");
            } else {
                $this->session->set_flashdata("signup_failure", "We ware unable to create your account");
            }
            redirect('signup');
        } else {
            if (!$this->form_validation->is_unique($email, 'users.email')) {
                $this->session->set_flashdata("email_exists", "The email address you provided already exists. Please signin.");
                redirect('signin');
            }
            $this->load->view('signup');
        }
    }
public function signup()
{
    $this->form_validation->set_rules('first_name', 'First name', 'required');
    $this->form_validation->set_rules('last_name', 'Last name', 'required');
    $this->form_validation->set_rules('email', 'Email', );
    $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email|is_unique[users.email]',
            array('required' => 'Email is Required.'), 
            array('is_unique' => 'Email Already exist.')
    );
    $this->form_validation->set_rules('password', 'Password', 'required|matches[cpassword]');
    $this->form_validation->set_rules('cpassword', 'Confirm password', 'required');
    $this->form_validation->set_error_delimiters('<p class="error">', '</p>');


    if ($this->form_validation->run() != FALSE)
    {
        $email = $this->input->post('email');
        $first_name = $this->input->post('first_name');
        $last_name = $this->input->post('last_name');
        $password = $this->input->post('password');
        $date_created = date('Y-m-d H:i:s');
        $date_updated = date('Y-m-d H:i:s');
        $verification_key = md5($email);
        $active = 0;
        $this->load->model('Usermodel');
        // Create account
        if ($this->Usermodel->user_register($first_name, $last_name, $email, $password, $date_created, $date_updated ,$verification_key , $active)) 
        {
            // Create a view for Check Email in View.
            $this->load->view('Check_Email_view');
        } 
        else 
        {
            $signup_failure="Something Went Wrong Please Sign Up again.";
            $this->load->view('signup',$signup_failure, true);
            // in view Use Isset($signup_failure)
        }
    } 
    else 
    {
        $this->load->view('signup');
    }
}

这就是我要找的:如果注册详细信息提供并且有效,请注册新用户,除非提供的电子邮件地址he/she已经存在于数据库中,在这种情况下,而不是显示验证错误(记住:所有数据,包括电子邮件 有效),敦促用户登录并重定向到登录页面

注册用户 John Doe,该用户已注册:

您被重定向到登录页面并"invited"登录。

这是代码:

Usermodel.php 文件中:

public function email_exists($email)
{   
    $query = $this->db->get_where('users', ['email' => $email]);
    return $query->num_rows() > 0;
}

Signup.php 文件中:

public function signup()
{
  $this->form_validation->set_rules('first_name', 'First name', 'required');
  $this->form_validation->set_rules('last_name', 'Last name', 'required');
  $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email');
  $this->form_validation->set_rules('password', 'Password', 'required');
  $this->form_validation->set_rules('cpassword', 'Confirm password', 'required|matches[password]');
  $this->form_validation->set_error_delimiters('<p class="error">', '</p>');
        if ($this->form_validation->run()) {
            $first_name = $this->input->post('first_name');
            $last_name = $this->input->post('last_name'); 
            $email =  $this->input->post('email');
            $password = $this->input->post('password');
            $date_created = date('Y-m-d H:i:s');
            $date_updated = date('Y-m-d H:i:s');
            $verification_key = md5($email);
            $active = 0;
            // Load user model
            $this->load->model('Usermodel');

            // If email does not already exist in the database 
            // signup new user
            if (!$this->Usermodel->email_exists($email)) {
                if ($this->Usermodel->user_register($first_name, $last_name, $email, $password, $date_created, $date_updated, $verification_key, $active)) {
                    $this->session->set_flashdata("signup_sucess", "Your account was created. Your have to activate it before you can signin. We have send you an activation email at $email.");
                } else {
                    // unless sigup does not fail for whatever reason
                    $this->session->set_flashdata("signup_failure", "We ware unable to create your account");
                }
                redirect('signup'); 
            } else {
                // If email is already in the database
                // urge user to sign in (redirect to signup page too)
                $this->session->set_flashdata("email_exists", "The email address $email already exists in the database. Please signin.");
                redirect('signin'); 
            }
        } else {
            $this->load->view('signup');
        }
}

非常感谢所有的帮助!