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

时间:2012-02-02 15:37:51

标签: 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= 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构造函数中的一个函数,它将确保用户在登录之前无法访问任何页面。问题是当我进入admin / login时,它将is_logged_in设置为true ,即使check_login函数应该返回false。它说它找到了一行,即使我的数据库中只有一行它不应该匹配。

我是CI的新手,所以请保持温柔。 :)

3 个答案:

答案 0 :(得分:2)

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

return $query->num_rows() > 0;

答案 1 :(得分:1)

扩大科林的回答:

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;
    }
}

答案 2 :(得分:0)

我没有看到你模型中的重点。

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

您确定,帖子变量出现在模型中吗?

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

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

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

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

这将防止所有这些混淆。