我使用Codeigniter开发了一个Web应用程序。它完全适用于localHost,但现在我将它上传到服务器我只有一个问题。当用户插入错误的密码时,除了我的重定向之外,一切都正常工作。它应该重定向回登录页面并显示错误消息(与localhost一起使用),但是我收到以下错误。
我决定不再重定向,只是再次加载我的登录视图,它工作,但我仍然得到非对象错误消息的Trying to get属性,这很奇怪,因为我没有在localhost上运行此错误。
我的控制器:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Login extends CI_Controller {
public function index()
{
$this->load->view('header');
$this->load->view('login_view');
$this->load->view('footer');
}
public function to_login() {
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
$this->form_validation->set_rules('password', 'Password', 'trim|required');
if($this->form_validation->run() == FALSE) {
$data = array(
'errors' => validation_errors()
);
$this->session->set_flashdata($data);
redirect('index.php/Login');
} else {
$email = $this->input->post('email');
$password = $this->input->post('password');
// the following lines are 38 and 39
$user_id = $this->Login_model->login_user($email, $password)->user_id;
$first_name = $this->Login_model->login_user($email, $password)->first_name;
if($user_id) {
$user_data = array(
'user_id' => $user_id,
'first_name' => $first_name,
'logged_in' => true
);
$this->session->set_userdata($user_data);
redirect('http://gc200322197.computerstudi.es/app/index.php/Main');
} else {
$this->session->set_flashdata('login_fail', 'Invalid login. Please check the email and password fields.');
$this->load->view('header');
$this->load->view('login_view');
$this->load->view('footer');
}
}
}
我的模特:
<?php
class Login_model extends CI_Model{
public function login_user($email, $password) {
$this->db->where('email', $email);
$result = $this->db->get('users');
$db_password = $result->row(4)->password;
if(password_verify($password, $db_password)) {
return $result->row(0);
} else {
return false;
}
}
}
我已经阅读了很多关于这个错误的问题,我仍然无法弄清楚出了什么问题,以及为什么它在localhost上运行而不是在线。我真的很感激这方面的一些帮助。
答案 0 :(得分:1)
关注第38行,您的模型返回两种数据类型中的一种,而您的控制器代码不适应它:
$user_id = $this->Login_model->login_user($email, $password)->user_id;
应改为:
$user_id = $this->Login_model->login_user($email, $password); // This could be false or an object
// Check if we've received an object
if($user_id){
$user_id = $user_id->user_id; // Access the object's property
$first_name = $user_id->first_name; // Might as well set the first name as well
}
更好的选择是重命名一些变量:
$user_info = $this->Login_model->login_user($email, $password); // This could be false or an object
// Check if we've received an object
if($user_info){
$user_id = $user_info->user_id; // Access the object's property
$first_name = $user_info->first_name; // Might as well set the first name as well
}
<强>更新强>
对于任何对CodeIgniter模型感到困惑的人,请参阅v3.0.4,见下文:
示例1
$this->load->model('Login_model');
$this->Login_model->some_func(); // Works
$this->login_model->some_func(); // Fails
示例2
$this->load->model('login_model');
$this->Login_model->some_func(); // Fails
$this->login_model->some_func(); // Works
建议您仅使用小写来声明和访问模型,例如#2;它会让你的生活更轻松。
基于OP代码和注释,看起来他们已经使用示例#1加载了模型,因此仅建议使用$this->login_model
会进一步破坏代码。