CodeIgniter在非对象上调用成员函数get_where()

时间:2013-03-25 00:28:15

标签: php codeigniter

我是codeigniter的新手,我正在试图弄清楚如何使用模型,我之前使用过MVP框架,但它有点不同。我有用户控制器,初始化模型(我认为我做对了),然后模型有一个函数,通过电子邮件获取一行。

控制器看起来像:

class Users extends CI_Controller{
    public function login(){
        $this->load->model('users_model');

        $this->users_model->login('slavigne@uark.edu', 'abcdefg');

        $this->load->view('templates/header');
        $this->load->view('users/login');
        $this->load->view('templates/footer');
    }
}

,模型如下:

class users_model extends CI_Model{
    public function users_model(){
            parent::__construct();
    }

    public function login($email, $password){
        $query = $this->db->get_where('users', array('email' => $email));
        return $query->result();
    }
}

我遇到的问题是:

Call to a member function get_where() on a non-object

我理解这意味着db不是一个对象,而是我为模型看到的所有代码,说这应该有效。任何帮助或建议都会很棒!对codeigniter的新手错误的任何建议都会很好!

1 个答案:

答案 0 :(得分:2)

您似乎错过了$this->load->database();

class users_model extends CI_Model{
    public function users_model(){
            parent::__construct();
    }

    public function login($email, $password){
        $this->load->database();
        $query = $this->db->get_where('users', array('email' => $email));
        return $query->result();
    }
}

您还可以在application/config/autoload.php文件中自动加载数据库库。

$autoload['libraries'] = array('database');

如果这样做,您不需要每次都手动加载它,但这也意味着它会在没有进行数据库调用的页面上加载。可能更关心优化器以节省带宽。

此外,如果您使用多个数据库连接,则仍应使用$this->load->database(); tho。有关详细信息,请参阅此链接:http://ellislab.com/codeigniter/user-guide/database/connecting.html

$DB1 = $this->load->database('group_one', TRUE);
$DB2 = $this->load->database('group_two', TRUE);

而不是使用..

$this->db->query();
$this->db->result();

..您将使用:

$DB1->query();
$DB1->result();
$DB2->query();
$DB2->result();

您仍然可以将负载添加到__construct(),因此每个控制器只需要一行。