Я проверил все вопросы этого типа, но ни один из них не работает для меня. Надеюсь, мне здесь помогут. У меня есть контроллер с именем index и модель с именем Index_model. Я написал функции входа и регистрации пользователя в контроллере индекса и выполнил связанные с данными запросы в модели, все работает нормально, кроме функции обратного вызова codeigniter.
Когда я пытаюсь проверить достоверность данных для входа в систему, используя обратный вызов, каждый раз, когда он возвращает false, и когда я удаляю обратный вызов, он работает нормально. Я не понимаю, где я делаю неправильно. Пожалуйста, найдите код ниже для моего контроллера и модели. Заранее спасибо.
контроллер:
class Index extends CI_Controller{
public function __construct(){
parent:: __construct();
$this->load->helper('url');
$this->load->model('index_model');
}
public function signin(){
$this->load->helper('form');
$data['title'] = "Sign In";
$data['headline'] = "Sign In";
$data['introduction'] = "Sign In to manage your business, clients and more!";
$data['include'] = "user/signin";
$this->load->view('template/template', $data);
}
public function login(){
$this->load->helper('url');
$this->load->helper('form');
$this->load->library('form_validation');
$this->form_validation->set_rules('username', 'Username', 'required|callback_validate_login');
$this->form_validation->set_rules('password', 'Password', 'required|md5');
if($this->form_validation->run() == TRUE){
$data['msg'] = "User Login Successfully!!";
$this->load->view('user/home', $data);
}else{
$this->signin();
}
}
public function validate_login(){
$this->load->library('form_validation');
$result = $this->index_model->validate_user();
if($result == TRUE){
return TRUE;
}else{
$this->form_validation->set_message('validate_login', 'Incorrect username / password.');
return FALSE;
}
}
}
Модель:
class Index_model extends CI_Model{
public function __construct(){
$this->load->database();
}
/******User Login*************/
public function validate_user(){
$username = $this->input->post('username');
$password = $this->input->post('password');
$this->db->where('username', $username);
$this->db->where('password', $password);
$query = $this->db->get('user');
if($query->num_rows() == 1){
return TRUE;
}else{
return FALSE;
}
}
}
Пожалуйста, просмотрите Мой код, это очень поможет.
Вы должны получить параметр, который вы передаете функции, используя функцию обратного вызова, которая в данном случае является именем пользователя. поэтому измените свой код на это:
public function validate_login($username){ # get the parameter
$this->load->library('form_validation'); # you do not need this line here
$result = $this->index_model->validate_user($username); #chek the parameter
if($result == TRUE){
return TRUE;
}else{
$this->form_validation->set_message('validate_login', 'Incorrect username / password.');
return FALSE;
}
}
ты должен использовать
$this->db->where('password', md5($password));
/* you should use md5($password) instead of just $password since you are using md5 as hashing technique */
ты использовал
$this->form_validation->set_rules('password', 'Password', 'required|md5');
пароль преобразуется в md5
после запуска проверки, а не в процессе обратного вызова
$this->form_validation->run() //i.e. after this
Замечания : md5 совсем не безопасен в наши дни. остерегайтесь атак радужного стола.
лучше поменяй технику хеширования. Есть много вопросов, касающихся хеширования пароля & безопасность в СО.
Просто сделайте несколько изменений в своем коде
$this->form_validation->set_rules('password', 'Password', 'required|md5');
удалите md5 отсюда и добавьте функцию md5, где ваш пароль соответствует полю таблицы базы данных
В функции validate_user
$this->db->where('password', md5($password));