2012-03-26 15 views
5

Estoy usando Active Record en CodeIgniter. Estoy confundido sobre qué enfoque debo tomar. Actualmente, nuestro sistema de inicio de sesión permite que el usuario use el nombre de usuario/correo electrónico para el inicio de sesión junto con la contraseña. Pero mi registro activo actual parece permitir que el usuario inicie sesión si elige usar el correo electrónico + sin contraseña.codeigniter active record where, or_where?

En este momento este es mi consulta:

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

entradas de ejemplo:

  • Nombre de usuario: prueba | Contraseña: pase | Resultado: éxito
  • Nombre de usuario: prueba | Contraseña: vacío | Resultado: No se ha podido
  • Nombre de usuario: [email protected] | Contraseña: pase | Resultado: éxito
  • Nombre de usuario: [email protected] | Contraseña: vacío | Resultado: éxito

La cuarta entrada de prueba debe ser Error en consecuencia, pero parece que se registra el usuario, incluso si la contraseña está vacía.

Respuesta

17

El problema es probablemente que necesita agregar corchetes al mezclar AND y OR en una cláusula WHERE. Pruebe esto:

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

Gran! Gracias por esta rápida respuesta. –

+13

¿esto no derrota el propósito del registro activo y abre la aplicación para inyección SQL? –

4

@RidIculous tiene razón. Esta es una forma correcta de hacerlo:

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

O un formato prefiero (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

Me estoy escapando por encima de la consulta – Tumtum

+0

D'oh! :-(Lo siento, –

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

Si bien este fragmento de código puede resolver el problema, no explica por qué o cómo responde la pregunta. Por favor [incluya una explicación para su código] (// meta.stackexchange.com/q/114762/ 269535), ya que eso realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para lectores en el futuro, y es posible que esas personas no sepan los motivos de la sugerencia de código. ** Marcadores/revisores: ** [ ¡Para respuestas de solo código como esta, downvote, no eliminar!] (// meta.stackoverflow.com/a/260413/2747593) –

Cuestiones relacionadas