codeigniter活动记录在哪里,or_where?

时间:2012-03-26 10:36:39

标签: codeigniter activerecord codeigniter-2

我在CodeIgniter上使用Active Record。我很困惑我应该采取哪种方法。目前,我们的登录系统允许用户使用用户名/电子邮件进行登录以及密码。但我目前的活跃记录似乎是让用户登录,如果他选择使用电子邮件+没有密码。

现在这是我的问题:

$this->db->select('id,level,email,username');
$this->db->where('email',$user);
$this->db->or_where('username',$user);
$this->db->where('password',$pass);
$query = $this->db->get('users');

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

示例输入:

  • 用户名:测试 |密码:传递 |结果: 成功
  • 用户名:测试 |密码:为空 |结果: 失败
  • 用户名: test@domain.com |密码:传递 |结果: 成功
  • 用户名: test@domain.com |密码:为空 |结果: 成功

结果中第四个测试输入必须 失败 ,但即使密码为空,它似乎也会记录用户。

3 个答案:

答案 0 :(得分:18)

问题可能是在WHERE子句中混合AND和OR时需要添加括号。试试这个:

$this->db->select('id,level,email,username');
$this->db->where("(email = '$user' OR username = '$user') 
                   AND password = '$pass'");
$query = $this->db->get('users');

答案 1 :(得分:4)

@RidIculous是对的。这是一种正确的方法:

$user = $this->db->escape($user);
$this->db->select('id,level,email,username');
$this->db->where("(email = $user OR username = $user)");
$this->db->where('password', $pass);
$query = $this->db->get('users');

或者我喜欢的格式(PHP 5 +)

$user = $this->db->escape($user);
$query = $this->db
    ->select('id,level,email,username')
    ->where("(email = $user OR username = $user)")
    ->where('password', $pass)
    ->get('users');

答案 2 :(得分:0)

$conditions = '(`username`="'.$username.'" OR `email`="'.$email.' OR `mobile`="'.$mobile.'"') AND `password`="'.$password.'"';          
$query = $this->db->get_where('table_name', $conditions);
$result = $query->result();