【问题标题】:codeigniter active record where, or_where?codeigniter 活动记录 where,or_where?
【发布时间】:2012-04-09 20:46:21
【问题描述】:

我在 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 |密码:pass |结果:成功
  • 用户名:test |密码: |结果:失败
  • 用户名:test@domain.com |密码:pass |结果:成功
  • 用户名:test@domain.com |密码: |结果:成功

第四次测试输入的结果一定是Failed,但好像密码为空也会记录用户。

【问题讨论】:

    标签: codeigniter activerecord codeigniter-2


    【解决方案1】:

    问题可能是在 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');
    

    【讨论】:

    • 太棒了!感谢您的快速回复。
    • 这不是违背了主动记录的目的,打开应用进行SQL注入吗?
    【解决方案2】:

    @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');
    

    【讨论】:

    • 我在查询上方转义它
    【解决方案3】:
    $conditions = '(`username`="'.$username.'" OR `email`="'.$email.' OR `mobile`="'.$mobile.'"') AND `password`="'.$password.'"';          
    $query = $this->db->get_where('table_name', $conditions);
    $result = $query->result();
    

    【讨论】:

    猜你喜欢
    • 2015-05-15
    • 2023-03-08
    • 2013-05-06
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 2014-02-22
    • 2014-10-19
    相关资源
    最近更新 更多