Есть несколько проблем. Во-первых, ваша модель не возвращает ничего, что может использовать контроллер. Вот мои мысли о том, как модель должна быть сделана.
public function ceklogin($user_name, $password)
{
$user = $this->db
->select('admin_id, username, level')
->get_where('admin', array('username'=>$username, 'password'=>md5($password)))
->row_array();
if( ! empty($user))
{
$user['loggedin'] = true; //add 'loggedin' to $user array
$this->session->set_userdata($user);
return TRUE;
}
$_SESSION['loggedin'] = false;
return FALSE;
}
Обратите внимание, что у функции есть два аргумента - $user name
и $password
. Они должны быть предоставлены контроллером. Обратите внимание, что ceklogin()
возвращает TRUE или FALSE в зависимости от того, найдена ли строка в базе данных.
Я не менял хеширование пароля - НО ТЫ ДОЛЖЕН . Используйте функции, о которых @RiggsFolly рассказал вам в комментариях. Вы должны также изучить дезинфекцию и проверку входных данных Никогда не доверяйте вводу пользователя!
Обратите внимание, что вызов базы данных возвращает row_array()
результаты. Это будет точная структура данных, которую вы хотели для данных сеанса Это означает, что вам не нужно создавать массив для set_userdata()
, потому что база данных создала его для вас.
Вот исправленная функция index()
.
public function index()
{
//if user has log-in, redirect to somewhere
if($this->session->userdata('loggedin'))
{
redirect('home');
}
// get the inputs so they can be passed to the model
$user_name = $this->input->post('username');
$password = $this->input->post('password');
// if we have inputs, check for valid username & password
if($user_name && $password)
{
if($this->M_login->ceklogin($user_name, $password))
{
// model returned true
redirect('home'); //if 'home' is where valid users go
}
}
// If not all inputs (null/empty $_POST)
// or the wrong inputs (ie. model returned false)
$this->session->set_flashdata("msg_login", "Wrong credentials.");
redirect('home/login');
}
Я удалил многие (все) операторы else
. Они не были нужны, потому что все блоки if
заканчиваются вызовом redirect()
, и эта функция вызывает exit
; Это означает, что вызов redirect()
никогда не возвращается туда, откуда он был вызван.
Вы должны использовать CodeIgniter Библиотека проверки вместо грубой конструкции
if($user_name && $password)
Но это лучше, чем ничего.