忘记密码功能在 CodeIgniter 中不起作用
Posted
技术标签:
【中文标题】忘记密码功能在 CodeIgniter 中不起作用【英文标题】:Forgot password function not working in CodeIgniter 【发布时间】:2017-11-16 18:25:09 【问题描述】:美好的一天!我正在尝试在 CodeIgniter 框架中创建忘记密码功能,但是当我尝试发送电子邮件时出现 2 个错误。
一些数据库信息(我正在使用 phpMyAdmin):
Db name: kadokado
Db table name: users
Db email column: email
Db password column: wachtwoord
我的控制器文件(Auth.php):
<?php
class Auth extends CI_Controller
public function forgot()
$this->form_validation->set_rules('email', 'Email', 'required|valid_email');
if($this->form_validation->run() == FALSE)
$this->load->view('templates/header');
$this->load->view('forgot');
$this->load->view('templates/footer');
else
$email = $this->input->post('email');
$clean = $this->security->xss_clean($email);
$userInfo = $this->user_model->getUserInfoByEmail($clean);
if(!$userInfo)
$this->session->set_flashdata('flash_message', 'We hebben dit email adres niet kunnen vinden');
redirect(site_url().'auth/login');
if($userInfo->status != $this->status[1]) //if status is not approved
$this->session->set_flashdata('flash_message', 'Your account is not in approved status');
redirect(site_url().'auth/login');
//build token
$token = $this->user_model->insertToken($userInfo->id);
$qstring = $this->base64url_encode($token);
$url = site_url() . 'auth/reset_password/token/' . $qstring;
$link = '<a href="' . $url . '">' . $url . '</a>';
$message = '';
$message .= '<strong>A password reset has been requested for this email account</strong><br>';
$message .= '<strong>Please click:</strong> ' . $link;
echo $message; //send this through mail
exit;
public function reset_password()
$token = $this->base64url_decode($this->uri->segment(4));
$cleanToken = $this->security->xss_clean($token);
$user_info = $this->user_model->isTokenValid($cleanToken); //either false or array();
if(!$user_info)
$this->session->set_flashdata('flash_message', 'Token is invalid or expired');
redirect(site_url().'auth/login');
$data = array(
'voornaam'=> $user_info->voornaam,
'email'=>$user_info->email,
'token'=>base64_encode($token)
);
$this->form_validation->set_rules('wachtwoord', 'Wachtwoord', 'required|min_length[5]');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required|matches[wachtwoord]');
if ($this->form_validation->run() == FALSE)
$this->load->view('templates/header');
$this->load->view('reset_password', $data);
$this->load->view('templates/footer');
else
$this->load->library('wachtwoord');
$post = $this->input->post(NULL, TRUE);
$cleanPost = $this->security->xss_clean($post);
$hashed = $this->password->create_hash($cleanPost['wachtwoord']);
$cleanPost['wachtwoord'] = $hashed;
$cleanPost['user_id'] = $user_info->id;
unset($cleanPost['passconf']);
if(!$this->user_model->updatePassword($cleanPost))
$this->session->set_flashdata('flash_message', 'Er is iets foutgegaan');
else
$this->session->set_flashdata('flash_message', 'Uw wachtwoord is geupdate, u kunt nu inloggen');
redirect(site_url().'auth/login');
我的模型文件(User_Model.php):
<?php
class user_model extends CI_model
public function getUserInfoByEmail($email)
$q = $this->db->get_where('users', array('email' => $email), 1);
if($this->db->affected_rows() > 0)
$row = $q->row();
return $row;
else
error_log('no user found getUserInfo('.$email.')');
return false;
public function getUserInfo($user_id)
$q = $this->db->get_where('users', array('user_id' => $user_id), 1);
if($this->db->affected_rows() > 0)
$row = $q->row();
return $row;
else
error_log('no user found getUserInfo('.$user_id.')');
return false;
public function insertToken($user_id)
$token = substr(sha1(rand()), 0, 30);
$date = date('Y-m-d');
$string = array(
'token'=> $token,
'user_id'=>$user_id,
'created'=>$date
);
$query = $this->db->insert_string('tokens',$string);
$this->db->query($query);
return $token . $user_id;
public function isTokenValid($token)
$tkn = substr($token,0,30);
$uid = substr($token,30);
$q = $this->db->get_where('tokens', array(
'tokens.token' => $tkn,
'tokens.user_id' => $uid), 1);
if($this->db->affected_rows() > 0)
$row = $q->row();
$created = $row->created;
$createdTS = strtotime($created);
$today = date('Y-m-d');
$todayTS = strtotime($today);
if($createdTS != $todayTS)
return false;
$user_info = $this->getUserInfo($row->user_id);
return $user_info;
else
return false;
?>
我的视图文件(reset_password.php):
<div class="col-lg-4 col-lg-offset-4">
<h2>Reset your password</h2>
<h5>Hello <span><?php echo $firstName; ?></span>, Voer uw wachtwoord 2x in aub</h5>
<?php
$fattr = array('class' => 'form-signin');
echo form_open(site_url().'auth/reset_password/token/'.$token, $fattr); ?>
<div class="form-group">
<?php echo form_password(array('name'=>'wachtwoord', 'id'=> 'wachtwoord', 'placeholder'=>'Wachtwoord', 'class'=>'form-control', 'value' => set_value('wachtwoord'))); ?>
<?php echo form_error('password') ?>
</div>
<div class="form-group">
<?php echo form_password(array('name'=>'passconf', 'id'=> 'passconf', 'placeholder'=>'Confirm Password', 'class'=>'form-control', 'value'=> set_value('passconf'))); ?>
<?php echo form_error('passconf') ?>
</div>
<?php echo form_hidden('user_id', $user_id);?>
<?php echo form_submit(array('value'=>'Reset Password', 'class'=>'btn btn-lg btn-primary btn-block')); ?>
<?php echo form_close(); ?>
</div>
这些是我得到的错误:
A PHP Error was encountered
Severity: Notice
Message: Undefined property: Auth::$user_model
Filename: controllers/Auth.php
Line Number: 123
Backtrace:
File: /home/ubuntu/workspace/application/controllers/Auth.php
Line: 123
Function: _error_handler
File: /home/ubuntu/workspace/index.php
Line: 315
Function: require_once
第二个错误:
A PHP Error was encountered
Severity: Error
Message: Call to a member function getUserInfoByEmail() on a non-object
Filename: controllers/Auth.php
Line Number: 123
Backtrace:
我完全不知道我做错了什么,我希望有人能帮助我。 谢谢!
【问题讨论】:
你加载模型了吗?比如 $this->load->model('model_name'); 【参考方案1】:在身份验证控制器中加载用户模型。您可以在构造函数或函数中加载它。
class Auth extends CI_Controller
function __construct()
parent::__construct();
$this->load->model('user_model'); // load user model
public function forgot()
// your code
在函数中
class Auth extends CI_Controller
public function forgot()
$this->load->model('user_model'); // load user model
// your code
未测试
【讨论】:
嘿,我像你一样在 auth 控制器中加载了模型:function __construct() parent::__construct(); $this->load->model('User_Model'); // 加载用户模型 但我仍然遇到同样的错误。在加载像 User_Model 或只是 user_model 这样的模型时是否需要使用大写字母?我的文件名 = User_Model 用户模型的类名是什么? 什么意思? 抱歉打错字了。用户模型的类名是什么?使用类名在控制器中加载模型。 其:类 User_Model【参考方案2】:您需要确保从控制器加载 user_model 类。像这样:
class Auth extends CI_Controller
function __construct()
$this->load->model('user_model');
并确保模型类中的拼写/大写正确。
class User_Model extends CI_Model
// rest of code
【讨论】:
嘿,我只是把它放在我的身份验证控制器文件中:function __construct() parent::__construct(); $this->load->model('User_Model'); //加载用户模型我在模型文件中改变了这个,就像你说的那样:class User_Model extends CI_Model 但我仍然得到同样的错误。而且我不认为这是因为模型加载。因为当我更改身份验证控制器上的模型名称并尝试加载我的页面时,我得到了另一个错误。 由于某种原因,似乎无法从您的 Auth 类中找到 User_Model。 User_Model 是否在类中大写以及从控制器调用它的位置?它是偶然在子目录中吗?也许这个链接会是一个很好的资源:@987654321@. 是的。它在模型类和控制器中都大写。我遇到了与开始时相同的错误。此外,当我在控制器中调用模型名称时,我在尝试加载视图页面(reset_password.php)时收到此错误:遇到未捕获的异常。消息:无法找到您指定的模型:User_model 文件名:/home/ubuntu/workspace/system/core/Loader.php 行号:344 回溯:文件:/home/ubuntu/workspace/application/controllers/Auth.php行:115 功能:型号 当文件名、类名或位置不正确,或者加载模型时出现问题时,会出现您看到的“无法找到模型”错误。你能从 Auth 控制器加载任何其他模型吗?【参考方案3】:再次@frodo。
第一个错误:在你的控制器代码中,你需要先初始化模型而不是只有你可以使用模型属性。
public function forgot()
// Changes required
$this->load->model('user_model');
$userInfo = $this->user_model->getUserInfoByEmail($clean);
第二个错误:
if($userInfo->status != $this->status[1])
$this->session->set_flashdata('flash_message', 'Your account is not in approved status');
redirect(site_url().'auth/login');
如何获得$this->status[1]
变量的值。您可以简单地使用if($userInfo->status != true)
。
请更改此代码,如果您有任何错误,请告诉我。
【讨论】:
以上是关于忘记密码功能在 CodeIgniter 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章