【问题标题】:Why do attempts to update a user's password in this Codeigniter 3 application fail?为什么尝试在此 Codeigniter 3 应用程序中更新用户密码会失败?
【发布时间】:2023-03-10 16:35:01
【问题描述】:

我正在 Codeigniter 3.1.8 和 Bootstrap 4 中开发基本的 blog application

我在这个应用程序中添加了一个注册和登录系统。我目前正在研究密码重置系统。

我不明白为什么更新用户密码失败如下:

Newpassword 控制器中我有:

class Newpassword extends CI_Controller {
    private $token = NULL;

    public function index($token = NULL) {
        //echo $token; die();
        $data = $this->Static_model->get_static_data();
        $data['pages'] = $this->Pages_model->get_pages();
        $data['tagline'] = 'New password';
        $data['categories'] = $this->Categories_model->get_categories();
        $this->token = $token;
    
         // Form validation rules
         $this->form_validation->set_rules('password', 'Password', 'required|min_length[6]');
         $this->form_validation->set_rules('cpassword', 'Confirm password', 'required|matches[password]');
         $this->form_validation->set_error_delimiters('<p class="error-message">', '</p>');
    
        if(!$this->form_validation->run()) {
            $this->load->view('partials/header', $data);
            $this->load->view('auth/newpassword');
            $this->load->view('partials/footer');
        } else {
            $this->add();
        }
    }

    public function add() {
        $data = $this->Static_model->get_static_data();
        $data['pages'] = $this->Pages_model->get_pages();
        $data['tagline'] = 'New password';
        $data['categories'] = $this->Categories_model->get_categories();
    
        // Encrypt new password
        $enc_password = password_hash($this->input->post('password'), PASSWORD_DEFAULT);
    
        // Update password column
        $token = $this->token;
    
        if ($this->Usermodel->set_new_password($token, $enc_password)) {
            redirect('login'); 
            $this->session->set_flashdata("new_password_success", "Your new password was set. You can login");
        } else {
            $this->session->set_flashdata("new_password_fail", "We have failed updating your password");
            redirect('/newpassword'); 
        }
      }
    }

Usermodel 模型中我有:

public function set_new_password($token, $enc_password) {
    $this->db
        ->where(['token' => $token])
        // set new password and reset token to NULL
        ->update('authors', array('password' => $enc_password, 'token' => NULL));
}

形式:

<?php echo form_open(base_url('newpassword/add')); ?>
  <div class="form-group <?php if(form_error('password')) echo 'has-error';?>">
    <input type="password" name="password" id="password" class="form-control" placeholder="Password">
    <?php if(form_error('password')) echo form_error('password'); ?> 
  </div>
  <div class="form-group <?php if(form_error('cpassword')) echo 'has-error';?>">
    <input type="password" name="cpassword" id="cpassword" class="form-control" placeholder="Confirm password">
    <?php if(form_error('cpassword')) echo form_error('cpassword'); ?> 
  </div>
  <div class="form-group mb-2">
    <input type="submit" value="Set password" class="btn btn-block btn-md btn-success">
  </div>            
<?php echo form_close(); ?>

如果我从控制器中取消注释 //echo $token; die();,则会使用预期值打印令牌。然而,密码没有更新(并且正确显示了更新失败)。

我做错了什么?

【问题讨论】:

标签: php codeigniter codeigniter-3


【解决方案1】:

当你点击设置密码按钮重定向到newpassword/addtoken这里不存在,因为它只是上一步使用:

  1. 密码重置请求
  2. 单击电子邮件中的链接(令牌存在)
  3. 填写表格并点击“设置密码”(将表格数据发送到newpassword/add) - 此处不存在令牌但您想使用它:$token = $this-&gt;token; 但现在是“令牌" 是:添加

抱歉,您必须重构密码重置代码逻辑。我认为这比重写整个过程更难解决

更新:

$data['token'] = $token;添加到Newpassword控制器index方法中

views/auth/newpassword.php 中的表单操作网址修改为: &lt;?php echo form_open(base_url('newpassword/add/'.$token)); ?&gt;

重要!!!

return 添加到模型中的 ell 函数中: return $this-&gt;db-&gt; .... 并把redirect('&lt;url&gt;')之后设置会话闪存数据!

我测试了它,我认为解决了这个问题。

【讨论】:

  • 那么你的代码中有一些不同的东西不在 github repo 中。我在 1.5 小时前从那里把它拉下来,只修改了这里发布的那些
  • 你可以看到它到底是怎么出来的HERE。谢谢!
【解决方案2】:

这是密码更新的最终工作代码(以防其他人需要):

新密码 控制器中:

class Newpassword extends CI_Controller
{
    public function index($token = NULL)
    {
        $data               = $this->Static_model->get_static_data();
        $data['pages']      = $this->Pages_model->get_pages();
        $data['tagline']    = 'New password';
        $data['categories'] = $this->Categories_model->get_categories();
        $data['token']      = $token;
        
        // Form validation rules
        $this->form_validation->set_rules('password', 'Password', 'required|min_length[6]');
        $this->form_validation->set_rules('cpassword', 'Confirm password', 'required|matches[password]');
        $this->form_validation->set_error_delimiters('<p class="error-message">', '</p>');
        
        if (!$this->form_validation->run()) {
            $this->load->view('partials/header', $data);
            $this->load->view('auth/newpassword');
            $this->load->view('partials/footer');
        } else {
            // Encrypt new password
            $enc_password = password_hash($this->input->post('password'), PASSWORD_DEFAULT);
            
            if ($this->Usermodel->set_new_password($token, $enc_password)) {
                $this->session->set_flashdata("new_password_success", "Your new password was set. You can login");
                redirect('login');
            } else {
                $this->session->set_flashdata("new_password_fail", "We have failed updating your password");
                redirect('/newpassword/' . $token);
            }
        }
    }
}

在模型中:

public function set_new_password($token, $enc_password) {
    return $this->db
        ->where('token', $token)
        // set new password and reset token to NULL
        ->update('authors', array('password' => $enc_password, 'token' => NULL));
}

表格(视图):

<?php echo form_open(base_url('newpassword/'. $token)); ?>
  <div class="form-group <?php if(form_error('password')) echo 'has-error';?>">
    <input type="password" name="password" id="password" class="form-control" placeholder="Password">
    <?php if(form_error('password')) echo form_error('password'); ?> 
  </div>
  <div class="form-group <?php if(form_error('cpassword')) echo 'has-error';?>">
    <input type="password" name="cpassword" id="cpassword" class="form-control" placeholder="Confirm password">
    <?php if(form_error('cpassword')) echo form_error('cpassword'); ?> 
  </div>
  <div class="form-group mb-2">
    <input type="submit" value="Set password" class="btn btn-block btn-md btn-success">
  </div>            
<?php echo form_close(); ?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2022-01-25
    • 1970-01-01
    • 2014-04-10
    • 2015-03-05
    • 2020-07-27
    • 2015-10-01
    相关资源
    最近更新 更多