CodeIgniter - 对非对象的成员函数 select() 调用

CodeIgniter - Call to a member function select() on a non-object

提问人:softboxkid 提问时间:11/30/2011 最后编辑:George Brightonsoftboxkid 更新时间:11/9/2018 访问量:60803

问:

我对 CodeIgniter 很陌生。这是我的代码:

class User_model extends CI_Model {

    function validate_user() {

        $this->db->select('*');
        $this->db->from('user');
        $this->db->where('username', $this->input->post('username'));
        $this->db->where('password', md5($this->input->post('password')));
        $validate_user = $this->db->get();

        if($validate_user->num_rows == 1) {
            return TRUE;
        }
    }
}

我在模型文件中收到此错误:

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

目前我正在使用 CodeIgniter 版本 2.1.0。请帮帮我!

PHP的 代码点燃器

评论

0赞 tereško 2/13/2013
Codeigniter 的可能副本 - 我希望为我的一个控制器和一个模型使用/连接到不同的数据库
3赞 ChuckKelly 7/27/2013
这是一个非常有用的线程,在搜索此特定错误时,它会在搜索结果中显示得很高。请不要再这么快哭泣了。

答:

0赞 Bogdan 11/30/2011 #1

num_rows是一个函数,因此您需要添加()

if($validate_user->num_rows() == 1) {
        return TRUE;
}

另外,您是否在构造函数中调用父类构造函数

class User_model extends CI_Model {

    function __construct()
    {
        parent::__construct();
    }
}

评论

0赞 Bogdan 11/30/2011
哦,似乎db对象没有初始化。是否在构造函数中调用父类构造函数?
0赞 softboxkid 11/30/2011
不。我没有在我的代码上调用任何构造函数。即使我放置了 __construct() 函数,错误仍然存在,说“致命错误:在第 14 行的 C:\AppServ\www\ci\application\models\user_model.php 中的非对象上调用成员函数 where() ”
1赞 softboxkid 11/30/2011
问题解决了!我只是autoload.php文件中添加了“数据库”一词。$autoload['库'] = array('数据库');
0赞 mwallisch 11/30/2011
为了清楚起见,除非您覆盖子类中的 __construct() 函数,否则将始终调用父构造函数。在这种情况下,您需要显式调用父级的构造函数,其中包含 parent::__construct();
44赞 Vasil Dakov 12/1/2011 #2

我认为您必须加载“数据库”库。第一种方法是将“数据库”包含在您的 application/config/autoload.php

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

或在类构造函数中:

class User_model extends CI_Model { 

     public function __construct() 
     {
           parent::__construct(); 
           $this->load->database();
     }
}

您可以在此处获取更多信息: https://www.codeigniter.com/user_guide/database/connecting.html

4赞 Andre Dublin 12/1/2011 #3

看起来你没有坚持 MVC 模式。您应该从 view -> controller -> 模型传递数据。

至于向数据库发送信息,我很确定 CI 会处理 xss 和过滤器输入,但您永远无法确定。

此外,请确保在 config/autoload.php 文件中加载模型或在控制器 __construct() 函数中启动模型

<?php
    class User extends CI_Controller
    {
        public __construct()
        {
            parent::__construct();
            $this->load->model('User_model');
        }
    }

$autoload['model'] = array('User_model');

例如,在我的登录视图中,我会让 CI 创建所需的字段。

<?php 
    echo form_open('admin');
    echo form_label('Username:', 'username');
    echo form_input('username', 'name');
    echo form_label('Password:', 'password');
    echo form_password('password');
    echo form_submit('submit', 'Login', 'id="loginBtn"'); ?>
    echo form_close(); 
?>

现在在控制器中

<?php
class User extends CI_Controller
{

    public function index()
    {

        $this->load->model('User_model');
        $result = $this
                    ->user_model
                    ->index(
                        $this->input->post('username'),
                        $this->input->post('password'));
    }

}
?>

还有模型

<?php

class User_model extends CI_Model
{


    function index($username, $password)
    {
        $q = $this
                ->db
                ->where('username', $username)
                ->where('password', md5($password))
                ->limit(1)
                ->get('user');

        if ($q->num_rows() > 0) {
            return $q->row();
        }
    }
}

评论

0赞 Andre Dublin 1/18/2012
为了更新我的答案,您可能应该使用 sha256 和 salt + 密码哈希,因为 md5 不再被视为最佳实践