Php Codeigniter-查询返回1行,即使没有要匹配的数据

Php Codeigniter-查询返回1行,即使没有要匹配的数据,php,codeigniter,Php,Codeigniter,这是我的控制器 public function login() { $this->load->model('admin_model'); $access = $this->admin_model->check_login(); $data['content'] = 'content/home'; $data['title'] = 'Admin Panel Login'; if($access) { $data=

这是我的控制器

public function login() {
    $this->load->model('admin_model');

    $access = $this->admin_model->check_login();
    $data['content'] = 'content/home';
    $data['title'] = 'Admin Panel Login';

    if($access) {
        $data= array(
            'email' => $this->input->post('email'),
            'is_logged_in' => true
        );
        $this->session->set_userdata($data);
        redirect('admin/index/dashboard');
    } else {
        $this->index($page = 'home', $msg = 'failure');
}
这是我的模型

public function check_login() {
    $this->db->where('email', $this->input->post('email'));
    $this->db->where('password', $this->input->post('password'));
    $query = $this->db->get('customers');

    return (bool) $query->num_rows;
}
所以我一直在做的是我的管理员构造函数中的一个函数,它将确保用户在登录之前不能访问任何页面。问题是,当我转到admin/login时,它将is_logged_in设置为true,即使check_login函数应该返回false。这意味着它正在查找一行,即使我的数据库中现在只有一行不应该匹配

我是新来CI的,所以请温柔点。:)

num_rows()
是一种方法(而不是属性),应该像这样使用:

return $query->num_rows() > 0;
num_rows()
是一种方法(而不是属性),应该像这样使用:

return $query->num_rows() > 0;

对科林答案的扩展:

public function check_login() {
    $this->db->where('email', $this->input->post('email'));
    $this->db->where('password', $this->input->post('password'));
    $query = $this->db->get('customers');

    if ($query->num_rows()>0) {
      return TRUE;
    } else {
      return FALSE;
    }
}

对科林答案的扩展:

public function check_login() {
    $this->db->where('email', $this->input->post('email'));
    $this->db->where('password', $this->input->post('password'));
    $query = $this->db->get('customers');

    if ($query->num_rows()>0) {
      return TRUE;
    } else {
      return FALSE;
    }
}

我看不出你的模型有什么意义

模型不能(或者即使可以,也不应该)从视图中获取变量。它应该通过控制器来实现

您确定模型中出现了post变量吗

更好的解决方案。捕获控制器中的post变量

在模型中,使用参数创建函数

然后在控制器中,像这样检索它

$data['bla'] = $this->admin_model->method_name($this->input->post('blabla'));

这将防止所有这些混乱

我看不出你的模型有什么意义

模型不能(或者即使可以,也不应该)从视图中获取变量。它应该通过控制器来实现

您确定模型中出现了post变量吗

更好的解决方案。捕获控制器中的post变量

在模型中,使用参数创建函数

然后在控制器中,像这样检索它

$data['bla'] = $this->admin_model->method_name($this->input->post('blabla'));

这将防止所有这些混乱

即使在调整了我的代码之后,它也不起作用。它所做的查询是:从(
customers
)中选择*,其中
email
=0和
password
=0,它将check\u login()返回为true。(默认情况下发布的是0和0)可能是我组织的不正确?您可以直接对您的数据库(在CI之外)运行该查询并查看返回的内容吗?当然可以。以下是输出:“显示第0-0行(总共1行,查询耗时0.0004秒)”。我似乎不明白为什么$access返回为true。请重新阅读您刚才发布的内容:)即
1 total
部分。听起来您的查询确实返回了一条记录。phpMyAdmin将显示
MySQL返回的空结果集(即零行)。
当没有返回行时。我肯定你的查询只返回一行。考虑到返回的行是零的,即返回的第一条记录是行0。即使在调整了我的代码之后,它也不起作用。它所做的查询是:从(
customers
)中选择*,其中
email
=0和
password
=0,它将check\u login()返回为true。(默认情况下发布的是0和0)可能是我组织的不正确?您可以直接对您的数据库(在CI之外)运行该查询并查看返回的内容吗?当然可以。以下是输出:“显示第0-0行(总共1行,查询耗时0.0004秒)”。我似乎不明白为什么$access返回为true。请重新阅读您刚才发布的内容:)即
1 total
部分。听起来您的查询确实返回了一条记录。phpMyAdmin将显示
MySQL返回的空结果集(即零行)。
当没有返回行时。我肯定你的查询只返回一行。考虑返回的行是零的,即返回的第一条记录是行0。是的,我也尝试过。问题不在于我对条件语句的编码不正确,而是它返回了1行,即使它不应该返回。当我直接转到admin/login时,它的行为就像我提交了数据(应该是0和0),因此它返回true,而不应该是true。是的,我也尝试过这个。问题不在于我对条件语句的编码不正确,而是它返回了1行,即使它不应该返回。当我直接转到admin/login时,它的行为就像我提交了数据(应该是0和0),因此它返回true,而不应该是true。是的,我以前就这样安排过。两个都一样,但我会再调整一下。是的,我以前就这样安排过。两个工作原理相同,但我会再次调整。