Codeigniter试图获取非对象的属性

时间:2016-05-24 18:15:54

标签: php codeigniter

我使用Codeigniter开发了一个Web应用程序。它完全适用于localHost,但现在我将它上传到服务器我只有一个问题。当用户插入错误的密码时,除了我的重定向之外,一切都正常工作。它应该重定向回登录页面并显示错误消息(与localhost一起使用),但是我收到以下错误。

image showing errors

我决定不再重定向,只是再次加载我的登录视图,它工作,但我仍然得到非对象错误消息的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上运行而不是在线。我真的很感激这方面的一些帮助。

1 个答案:

答案 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会进一步破坏代码。