Я разработал простую систему входа, которая работает нормально, но не работает, и мне нужно знать, почему.
ВОПРОС: Как показать, что вызывает неудачу?
Вот функция базы данных:
function login($email,$password) { $this->db->where("email",$email); $this->db->where("password",$password); $query=$this->db->get("users"); if($query->num_rows()>0) { foreach($query->result() as $rows) { //add all data to session $newdata = array( 'user_id' => $rows->id, 'user_name' => $rows->username, 'user_email' => $rows->email, 'logged_in' => TRUE, ); } $this->session->set_userdata($newdata); return true; } return false; }
И вот логика:
public function login() { $this->load->library('form_validation'); // field name, error message, validation rules $this->form_validation->set_rules('email', 'Your Email', 'trim|required|valid_email'); $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[4]|max_length[32]'); if($this->form_validation->run() == FALSE) { $this->signin(); } else { $email=$this->input->post('email'); $password=md5($this->input->post('pass')); $result=$this->user_model->login($email,$password); if($result) { $this->dash(); } else { $data['title']= 'Login Error'; $this->load->view('nav/header', $data); $this->load->view('login', $data); $this->load->view('nav/footer', $data); } } }
дляpublic function login() { $this->load->library('form_validation'); // field name, error message, validation rules $this->form_validation->set_rules('email', 'Your Email', 'trim|required|valid_email'); $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[4]|max_length[32]'); if($this->form_validation->run() == FALSE) { $this->signin(); } else { $email=$this->input->post('email'); $password=md5($this->input->post('pass')); $result=$this->user_model->login($email,$password); if($result) { $this->dash(); } else { $data['title']= 'Login Error'; $this->load->view('nav/header', $data); $this->load->view('login', $data); $this->load->view('nav/footer', $data); } } }
вpublic function login() { $this->load->library('form_validation'); // field name, error message, validation rules $this->form_validation->set_rules('email', 'Your Email', 'trim|required|valid_email'); $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[4]|max_length[32]'); if($this->form_validation->run() == FALSE) { $this->signin(); } else { $email=$this->input->post('email'); $password=md5($this->input->post('pass')); $result=$this->user_model->login($email,$password); if($result) { $this->dash(); } else { $data['title']= 'Login Error'; $this->load->view('nav/header', $data); $this->load->view('login', $data); $this->load->view('nav/footer', $data); } } }
Я знаю, что ошибка происходит, когда я перенаправляюсь обратно на страницу входа в систему, если она терпит неудачу, и измените текст заголовка, чтобы показать мне (только в режиме тестирования сейчас). Но как я могу узнать, что происходит не так?
Это функция базы данных проверки:
function login($email,$password) { $this->db->where("email",$email); $this->db->where("password",$password); $query=$this->db->get("users"); if($query->num_rows()>0) { foreach($query->result() as $rows) { //add all data to session $newdata = array( 'user_id' => $rows->id, 'user_name' => $rows->username, 'user_email' => $rows->email, 'logged_in' => TRUE, ); } $this->session->set_userdata($newdata); return true; } return false; }
Я предполагаю, что весь ваш php-код в порядке, тогда вам нужно установить настраиваемую форму-валидацию-сообщение для каждого входа, чтобы узнать, какой вход поступил не так, и повторите его:
<?php echo validation_errors(); ?>
напишите ниже код в файле вида
<section id="notification" > <?php if(validation_errors() !== '' ) { echo "<div class='alert-msg error'>"; echo validation_errors(); echo "</div>"; } $error = $this->session->flashdata('error'); $success = $this->session->flashdata('success'); if($error) { echo "<div class='alert-msg error'>"; echo $this->session->flashdata('error'); echo "</div>"; } if($success) { echo "<div class='alert-msg success'>"; echo $this->session->flashdata('success'); echo "</div>"; } ?> </section>
и условно установить сообщение об ошибке / ошибке в данных вспышки в контроллере (см. ниже)
if($result) { $this->dash(); $this->session->set_flashdata('success', 'Login successfully.'); } else { $this->session->set_flashdata('error', 'Login failed'); }
Подробнее Flashdata в CI
Для вашего измененного ответа:
использование ниже логики в вашей модели
$qry = $this->db->get_where('users', array('username' => $this->_username )); if ($qry->num_rows() == 1) { $user = $qry->row_array(); $submitted_pass = md5($this->_password); $db_pass = $user['password']; if ($submitted_pass === $db_pass) { return $user; } else { // wrong username/password $this->session->set_flashdata('error', $this->errorList[10]); return FALSE; } } else { // no such username exist $this->session->set_flashdata('error', $this->errorList[15]); return FALSE; }