提问人:softboxkid 提问时间:11/30/2011 最后编辑:George Brightonsoftboxkid 更新时间:11/9/2018 访问量:60803
CodeIgniter - 对非对象的成员函数 select() 调用
CodeIgniter - Call to a member function select() on a non-object
问:
我对 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。请帮帮我!
答:
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 不再被视为最佳实践
评论