Php CodeIgniter 4型号回调在插入前不哈希密码

Php CodeIgniter 4型号回调在插入前不哈希密码,php,codeigniter,model-view-controller,codeigniter-4,Php,Codeigniter,Model View Controller,Codeigniter 4,我对CI4完全陌生,但对PHP确实有一些经验。在插入新用户行时,我很难让模型类回调函数正常工作 这是控制器: <?php use App\Models\UserModel; class Users extends BaseController { public $users_model; public function __construct() { $this->users_model = new UserModel(); } public function register

我对CI4完全陌生,但对PHP确实有一些经验。在插入新用户行时,我很难让模型类回调函数正常工作

这是控制器:

<?php use App\Models\UserModel;

class Users extends BaseController
{
public $users_model;

public function __construct() {
$this->users_model = new UserModel();
}

public function register() {
$data = [
'page_title' => 'Register An Account',
'validation' => NULL //must have this set to null until/if any validation rules are broken
];

if ($this->request->getMethod() == 'post') {

//validation rules
$rules = [
'username' => [
'rules' => 'required|min_length[4]|max_length[20]|validateUsername[username]',
'errors' => [
'required' => 'A username is required',
'min_length' => 'Username must be at least {param} characters long',
'max_length' => 'Username cannot be more than {param} characters long',
'validateUsername' => 'Username can only contain letters and numbers',
],
] ,
'email' =>  [
'rules' => 'required|valid_email|is_unique[users.email]',
'errors' => [
'required' => 'An Email is required',
'valid_email' => 'Enter a valid email',
'is_unique' => 'That email has already been registerd',
],
],
'password' => [
'rules' => 'required|min_length[6]|max_length[16]|validatePassword[password]',
'errors' => [
'required' => 'A password is required',
'min_length' => 'Password must contain at least {param} characters',
'max_length' => 'Password cannot be more than {param} characters in length',
'validatePassword' => 'Password must have at least 1 numeric value',
],
],
'confirm_password' => [
'rules' => 'required|matches[password]',
'errors' => [
'required' => 'Must confirm password',
'matches' => 'Passwords do not match'
],
]

];

if ($this->validate($rules)) {
//all fields passed validation so need to save to the db
$user_data = [
'username' => $this->request->getVar('username', FILTER_SANITIZE_STRING),
'email' => $this->request->getVar('email', FILTER_SANITIZE_EMAIL),
'password' => $this->request->getVar('password')
];
if ($this->users_model->createUser($user_data)) {
echo 'user stored in the db.';
} else {
echo 'user not stored in the db.';
}

} else {
//there are some validation errors
$data['validation'] = $this->validator;
}
}//post request check ends here

return view('users/register', $data);
}// register method ends here.

public function login() {
$data = [
'page_title' => 'Login'
];
return view('users/login', $data);
}

public function logout() {
//not implemented yet
}
}
始终回显“用户未存储在数据库中”消息,并且用户存储在数据库中。 在模型中:

if($this->db->affectedRows() == 1) {
return TRUE;
} else {
return FALSE;
}
我已经回显了
$this->db->affectedRows()

成功插入时为1(尽管密码没有散列),因此我认为这会导致方法返回true,因此在控制器中,我会看到if条件的真实部分“user stored in the db”

谁能告诉我在这一切中我错在哪里? 我已经成功地在控制器本身的
$this->request->getVar('password')
数据上使用了
password\u hash()。但是我想利用内置的模型回调并处理插入和更新的哈希

我也在CodeIgniter论坛上分享/发布了这个问题


感谢您的帮助。

Codeigniter4文档对此并不十分清楚,但只要您希望触发模型回调,就需要直接使用模型函数,而不是生成器函数

例如,在模型内部,使用
$this->builder->insert()
不会触发模型的beforeensert或afterInsert函数,但使用
$this->insert()
将实现此功能

因此,在您的情况下,您应该将createUser函数替换为

公共函数createUser(数组$data){
$this->db->transStart();
$this->insert($data);
$this->db->transComplete();
如果($this->db->affectedRows()==1){
返回TRUE;
}否则{
返回FALSE;
}
}

Codeigniter4文档对此并不十分清楚,但只要您希望触发模型回调,就需要直接使用模型函数,而不是生成器函数

例如,在模型内部,使用
$this->builder->insert()
不会触发模型的beforeensert或afterInsert函数,但使用
$this->insert()
将实现此功能

因此,在您的情况下,您应该将createUser函数替换为

公共函数createUser(数组$data){
$this->db->transStart();
$this->insert($data);
$this->db->transComplete();
如果($this->db->affectedRows()==1){
返回TRUE;
}否则{
返回FALSE;
}
}

为什么要使用transStart和transComplete?@Akhilesh。我希望插入在事务中。这样不行吗?用这个来处理错误-@Akhilesh。谢谢,我会尝试这个链接,看看我能想出什么。不确定事务是否有任何错误(但我会检查),因为插入成功,它只是没有散列密码。我认为如果语句失败并且事务出错,就不会发生提交。再次感谢您提供的链接。您可以在插入之前在
方法中设置
$data
,并显示它的输出吗?如果
条件不正确,它可能无法工作。为什么要使用transStart和transComplete?@Akhilesh。我希望插入在事务中。这样不行吗?用这个来处理错误-@Akhilesh。谢谢,我会尝试这个链接,看看我能想出什么。不确定事务是否有任何错误(但我会检查),因为插入成功,它只是没有散列密码。我认为如果语句失败并且事务出错,就不会发生提交。再次感谢您提供的链接。您可以在插入之前在
方法中设置
$data
,并显示它的输出吗?另外,如果
条件为
添加大括号,则如果格式不正确,则可能无法正常工作。
if ($this->users_model->createUser($user_data)) {
echo 'user stored in the db.';
} else {
echo 'user not stored in the db.';
}
if($this->db->affectedRows() == 1) {
return TRUE;
} else {
return FALSE;
}