提交表单时password_hash未更新


password_hash not updating when submit form

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

我似乎无法更新password_hash,这很奇怪。我可以用它创建新用户,但不能更新那里的密码。

所有其他帖子都运行良好,更新良好

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

<?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);
    }
}

仔细查看edit_user函数。您收到$data,但会立即覆盖它。请注意,您没有为新创建的数组设置password密钥。然后检查if ($data['password']),但这永远不会是true,因此永远不会进行更新。

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

我花了一段时间才弄清楚,我需要在模型中的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);
}