2012-03-26 3 views
5

CodeIgniter에서 활성 레코드를 사용하고 있습니다. 나는 어떤 접근을해야하는지 혼란 스럽다. 현재 우리의 로그인 시스템은 사용자가 패스워드와 함께 로그인을 위해 username/email을 사용하도록합니다. 하지만 현재 사용중인 기록은 전자 메일 + 암호를 사용하지 않으면 사용자가 로그인 할 수있게합니다.codeigniter 활성 레코드 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; 

샘플 입력 :

는 지금이 내 쿼리입니다

  • 아이디 : 시험 | 비밀번호 : 패스 | 결과 : 성공
  • 아이디 : 시험 | 비밀번호 : empty | 결과 : 실패
  • 아이디 : [email protected] | 비밀번호 : 패스 | 결과 : 성공
  • 아이디 : [email protected] | 비밀번호 : empty | 결과 : 성공

네 번째 테스트 입력은 결과에 실패해야하지만 암호가 비어있는 경우에도 사용자가 로그온 할 것으로 보인다.

답변

17

문제는 아마도 AND와 OR을 WHERE 절에 섞을 때 대괄호를 추가해야 할 필요가있을 것입니다. 시도해보십시오.

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

대 : 이것은 올바른 그것을 할 수있는 방법입니다! 이 빠른 답장을 보내 주셔서 감사합니다. –

+13

이 활성 레코드의 목적을 패배시키고 SQL 주입을위한 응용 프로그램을 열지 않을까요? –

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

+0

D' oh! :-(죄송합니다! –

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), 그게 정말 당신의 게시물의 품질을 향상시키는 데 도움이됩니다. 당신이 미래에 독자를위한 질문에 답변하고 그 사람들은 당신의 코드 제안에 대한 이유를 알지 못할 수도 있음을 기억하십시오. ** Flaggers/reviewers : ** [ 이 코드 다운 응답과 같은 코드 전용 응답의 경우 삭제하지 마십시오!] (// meta.stackoverflow.com/a/260413/2747593) –

관련 문제