【问题标题】:password_hash not updating when submit form提交表单时密码哈希未更新
【发布时间】:2015-04-06 12:14:18
【问题描述】:

当我提交我的表单时,如果密码字段被提交,它应该更新密码,否则如果为空不更新密码。

我似乎无法让密码哈希更新很奇怪。我可以用它创建新用户,但不能更新密码。

所有其他帖子都可以正常更新。

不确定为什么密码不更新?我该如何解决问题,谢谢。

<?php

class Model_user extends CI_Model {

    public function edit_user($user_id, $data) {

        $data = array(
            'username' =>  $data['username'],
            'user_group_id' =>  $data['user_group_id'],
            'firstname' => $data['firstname'],
            'lastname' => $data['lastname'],
            'email' => $data['email'],
            'image' => $data['image'],
            'status' => $data['status']
        );

        $this->db->set($data);
        $this->db->where('user_id', $user_id);
        $this->db->update($this->db->dbprefix . 'user');

        if ($data['password']) {

            $options = [
                'cost' => 11,
                'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
            ];

            $data = array(
                'password' => password_hash($_POST['password'], $options)
            ); 

            $this->db->set($data);
            $this->db->where('user_id', $user_id);
            $this->db->update($this->db->dbprefix . 'user');
        }

    }
}

控制器

<?php

class Users extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('admin/user/model_user');
    }

    public function index() {
        $this->get_form();
    }

    public function update() {
        $this->form_validation->set_rules('username', 'Username', 'required');

        if ($this->form_validation->run($this) == FALSE) {
            $this->get_form();
        } else {
            $this->model_user->edit_user($this->uri->segment(4), $_POST);
            redirect('admin/user');
        }
    }

    public function get_form() {

        $data['title'] = "Users";

        $data['breadcrumbs'] = array();

        $data['breadcrumbs'][] = array(
            'text' => 'Home',
            'href' => site_url('admin/dashboard')
        );

        $data['breadcrumbs'][] = array(
            'text' => "Users",
            'href' => site_url('admin/user')
        );

        $user_info = $this->model_user->get_user($this->uri->segment(4));

        if (isset($_POST['username'])) {
            $data['username'] = $_POST['username'];
        } elseif (!empty($user_info)) {
            $data['username'] = $user_info['username'];
        } else {
            $data['username'] = '';
        }

        if (isset($_POST['user_group_id'])) {
            $data['user_group_id'] = $_POST['user_group_id'];
        } elseif (!empty($user_info)) {
            $data['user_group_id'] = $user_info['user_group_id'];
        } else {
            $data['user_group_id'] = '';
        }

        $this->load->model('admin/user_group/user_group_model');

        $data['user_groups'] = $this->user_group_model->get_user_groups();

        if (isset($_POST['password'])) {
            $data['password'] = $_POST['password'];
        } else {
            $data['password'] = '';
        }

        if (isset($_POST['confirm'])) {
            $data['confirm'] = $_POST['confirm'];
        } else {
            $data['confirm'] = '';
        }

        if (isset($_POST['firstname'])) {
            $data['firstname'] = $_POST['firstname'];
        } elseif (!empty($user_info)) {
            $data['firstname'] = $user_info['firstname'];
        } else {
            $data['firstname'] = '';
        }

        if (isset($_POST['lastname'])) {
            $data['lastname'] = $_POST['lastname'];
        } elseif (!empty($user_info)) {
            $data['lastname'] = $user_info['lastname'];
        } else {
            $data['lastname'] = '';
        }

        if (isset($_POST['email'])) {
            $data['email'] = $_POST['email'];
        } elseif (!empty($user_info)) {
            $data['email'] = $user_info['email'];
        } else {
            $data['email'] = '';
        }

        if (isset($_POST['image'])) {
            $data['image'] = $_POST['image'];
        } elseif (!empty($user_info)) {
            $data['image'] = $user_info['image'];
        } else {
            $data['image'] = '';
        }

        $this->load->model('admin/tool/model_tool_image');

        if (isset($_POST['image']) && is_file(FCPATH . 'image/catalog/' . $_POST['image'])) {
            $data['thumb'] = $this->model_tool_image->resize($_POST['image'], 100, 100);
        } elseif (!empty($user_info) && $user_info['image'] && is_file(FCPATH . 'image/catalog/' . $user_info['image'])) {
            $data['thumb'] = $this->model_tool_image->resize($user_info['image'], 100, 100);
        } else {
            $data['thumb'] = $this->model_tool_image->resize('no_image.png', 100, 100);
        }

        $data['placeholder'] = $this->model_tool_image->resize('no_image.png', 100, 100);

        if (isset($_POST['status'])) {
            $data['status'] = $_POST['status'];
        } elseif (!empty($user_info)) {
            $data['status'] = $user_info['status'];
        } else {
            $data['status'] = 0;
        }

        $this->load->view('template/user/user_form_view', $data);
    }

}

【问题讨论】:

  • 请不要自己生成盐。完全删除该行,因为 password_hash 会为您执行此操作。

标签: php codeigniter


【解决方案1】:

仔细查看edit_user 函数。您收到$data,但您立即将其覆盖。请注意,您没有为新创建的数组设置 password 键。然后你检查if ($data['password']),但那永远不会是true,因此永远不会完成更新。

【讨论】:

    【解决方案2】:

    您的password_hash($_POST['password'], $options) 有问题。 你传递了$_POST['password'] 而不是$data['password']

    【讨论】:

      【解决方案3】:

      我花了一段时间才弄清楚我需要在我的模型中的 if 语句之外创建另一个变量,如下所示,然后能够在新密码存在时进行更新。

      现在一切正常。

      $input_password = $this->input->post('password');
      
      if ($input_password) {
      $password = password_hash($input_password, PASSWORD_BCRYPT);
      
      $data_password = array(
      'password' => $password
      ); 
      
      $this->db->where('user_id', $user_id);
      $this->db->update($this->db->dbprefix . 'user', $data_password);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 2012-08-21
        • 1970-01-01
        • 2018-10-29
        • 2021-01-13
        • 1970-01-01
        相关资源
        最近更新 更多