2017-09-26 35 views
0

我的控制器如何在php中使用codeigniter从一个函数调用变量到另一个函数?

public function forgot_password(){ 
     $email = $this->input->post('email_recover'); 
     $token = bin2hex(openssl_random_pseudo_bytes(32)); 
     $findemail = $this->user_model->forgot_password($email); 
     if ($findemail) { 

       $config['protocol'] = "smtp"; 
       $config['smtp_host'] = "ssl://smtp.gmail.com"; 
       $config['smtp_port'] = "465"; 
       $config['smtp_user'] = "[email protected]"; 
       $config['smtp_pass'] = "password"; 
       $config['charset'] = "utf-8"; 
       $config['mailtype'] = "html"; 
       $config['newline'] = "\r\n"; 

       $this->email->initialize($config); 

       $this->email->from('[email protected]', 'Admin'); 
       $this->email->to(set_value('email_recover')); 

       $this->email->subject('Reset password'); 

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

       $this->email->message('<h3>Dear user.</h3><br><br><p>We want to help you to reset your password.</p>. <p>Here is the reset link &nbsp;'. base_url() .'login/reset_password/'.$token.'</p>'); 

       if(!$this->email->send()){ 
        $this->session->set_flashdata('error', 'There is some error with your email. Please try again'); 

       } 
       else{ 
        $this->session->set_flashdata('success', 'Please check your email.'); 
       } 
     } else { 
        redirect('login'); 
       } 

    } 

    public function reset_password(){ 
     $this->form_validation->set_rules('password', 'Password', 'required'); 
     $this->form_validation->set_rules('confirmpassword', 'Confirm Password', 'required'); 

     if($this->form_validation->run() === FALSE){ 
      $this->load->view('templates/pheader'); 
      $this->load->view('register/reset_password'); 
      $this->load->view('templates/pfooter'); 
     } else { 
        $this->user_model->reset_password(); 
        //redirect('login/reset_password '); 
       } 

    } 

我的模型

public function reset_password(){ 
     $data = array('password' => $this->input->post('password')); 
     $this->db->where('email',$email); 
     return $this->db->update('login_user', $data); 
} 

在这里帮助我。我想发送恢复电子邮件链接给用户,这是正常工作。现在,当用户填写重置密码页面中的字段时,我无法确定该用户的电子邮件ID。任何人都可以告诉我如何访问以不同形式输入的电子邮件。

+2

您必须将其作为隐藏字段放入第二个窗体中,或以其他方式将其存储(例如,在会话中,暂时)。 HTTP请求是无状态的。数据不会在它们之间持续存在,除非您明确地这样做。 – ADyson

+0

您可以给他发送带有加密电子邮件ID和时间限制tiil链接的链接。当他打开链接与数据库相匹配的凭据。 – GYaN

+0

如何将电子邮件传递到隐藏的输入字段? @ADyson –

回答

0

使用会话可以更新密码。请检查下面的代码,我认为帮助你。

控制器:

public function forgot_password(){ 
     session_start(); 
     $email = $this->input->post('email_recover'); 
     $token = bin2hex(openssl_random_pseudo_bytes(32)); 
     $findemail = $this->user_model->forgot_password($email); 
     if ($findemail) { 

       $_Session['setEmail'] = array('email_recover' => $email,'token' => $token); 

       $config['protocol'] = "smtp"; 
       $config['smtp_host'] = "ssl://smtp.gmail.com"; 
       $config['smtp_port'] = "465"; 
       $config['smtp_user'] = "[email protected]"; 
       $config['smtp_pass'] = "password"; 
       $config['charset'] = "utf-8"; 
       $config['mailtype'] = "html"; 
       $config['newline'] = "\r\n"; 

       $this->email->initialize($config); 

       $this->email->from('[email protected]', 'Admin'); 
       $this->email->to(set_value('email_recover')); 

       $this->email->subject('Reset password'); 

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

       $this->email->message('<h3>Dear user.</h3><br><br><p>We want to help you to reset your password.</p>. <p>Here is the reset link &nbsp;<a href="'. base_url() .'login/reset_password/'.$token.'">click</a></p>'); 

       if(!$this->email->send()){ 
        $this->session->set_flashdata('error', 'There is some error with your email. Please try again'); 

       } 
       else{ 
        $this->session->set_flashdata('success', 'Please check your email.'); 
       } 
     } else { 
        redirect('login'); 
       } 

    } 

    public function reset_password($token=NULL){ 

     if($_Session['setEmail']['token'] == $token){ 
      $email = $_Session['setEmail']['email_recover']; 
     } 

     $this->form_validation->set_rules('password', 'Password', 'required'); 
     $this->form_validation->set_rules('confirmpassword', 'Confirm Password', 'required'); 

     if($this->form_validation->run() === FALSE){ 
      $this->load->view('templates/pheader'); 
      $this->load->view('register/reset_password'); 
      $this->load->view('templates/pfooter'); 
     } else { 
        $this->user_model->reset_password($email); 
        //redirect('login/reset_password '); 
       } 

    } 

模型

public function reset_password($email){ 
     $data = array('password' => $this->input->post('password')); 
     $this->db->where('email',$email); 
     return $this->db->update('login_user', $data); 
     $_Session['setEmail'] = ''; 
} 

在链路和控制器是采用URL检查令牌之后此令牌通。更新密码后重置会话变量。

0

您可以使用会话来存储电子邮件ID。 在控制器的forgot_password()函数,设置会话变量来存储电子邮件ID

$email = $this->input->post('email_recover'); 
$this->session->set_userdata('email', $email); 

你可以使用这个变量任何你想去的地方。修改模型中的reset_password()函数:

public function reset_password(){ 
    $data = array('password' => $this->input->post('password')); 
    $this->db->where('email',$this->session->userdata('email')); 
    return $this->db->update('login_user', $data); 
    $this->session->unset_userdata('email'); 
} 
相关问题