2012-03-26 75 views
5

我在CodeIgniter上使用Active Record。我很困惑我應該採取哪種方法。目前,我們的登錄系統讓用戶使用用戶名/電子郵件作爲登錄名和密碼。但是,我目前的活躍記錄,似乎讓用戶登錄,如果他選擇使用電子郵件+沒有密碼。codeigniter active record where,or_where?

現在這是我的查詢:

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

採樣輸入:

  • 用戶名:測試 |密碼:pass |結果:成功
  • 用戶名:測試 |密碼: |結果:失敗
  • 用戶名:[email protected] |密碼:pass |結果:成功
  • 用戶名:[email protected] |密碼: |結果:成功

第四測試輸入必須在結果失敗,但似乎它記錄即使密碼爲空的用戶。

回答

17

這個問題可能是您需要在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'); 
+0

太好了!感謝您的快速回復。 – 2012-03-26 10:59:30

+13

這不會破壞活動記錄的目的,並打開SQL注入的應用程序? – 2013-11-14 21:58:45

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'); 
+0

我正在逃避查詢 – Tumtum 2015-06-02 15:58:04

+0

D'oh! :-(對不起! – 2015-06-02 18:32:45

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

儘管這段代碼可能會解決這個問題,但它並不能解釋爲什麼或如何回答這個問題。請[爲你的代碼添加解釋](// meta.stackexchange.com/q/114762/ 269535),因爲這確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。**旗幟/評論者:** [對於代碼只有這樣的答案,downvote,不要刪除!](// meta.stackoverflow.com/a/260413/2747593) – 2016-12-01 00:23:52