2012-03-26 11 views
5

Sto utilizzando Active Record su CodeIgniter. Sono confuso su quale approccio dovrei prendere. Attualmente, il nostro sistema di accesso consente all'utente di utilizzare nome utente/email per l'accesso e la password. Ma il mio attuale record attivo sembra consentire all'utente di accedere se sceglie di usare l'email + nessuna password.record di codice attivo record dove, o dove?

In questo momento questo è il mio query:

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

ingressi del campione:

  • Nome utente: prova | Password: pass | Risultato: Successo
  • Nome utente: prova | Password: vuoto | Risultato: Impossibile
  • Nome utente: [email protected] | Password: pass | Risultato: Successo
  • Nome utente: [email protected] | Password: vuoto | Risultato: Successo

Il quarto ingresso di prova deve essere Impossibile nel risultato, ma sembra che si registra l'utente anche se la password è vuota.

risposta

17

Il problema è probabilmente che è necessario aggiungere parentesi quando si mischiano AND e OR in una clausola WHERE. Prova questo:

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

Grande! Grazie per questa rapida risposta. –

+13

non impedisce lo scopo della registrazione attiva e apre l'app per l'iniezione SQL? –

4

@RidIculous ha ragione. Questo è un modo corretto per farlo:

$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 preferisco (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

Lo sto sfuggendo sopra la query – Tumtum

+0

D'oh! :-(Spiacente! –

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

Sebbene questo snippet di codice possa risolvere il problema, non spiega perché o come risponda alla domanda. Per favore [includi una spiegazione per il tuo codice] (// meta.stackexchange.com/q/114762/ 269535), in quanto ciò aiuta davvero a migliorare la qualità del tuo post. Ricorda che in futuro dovrai rispondere alla domanda per i lettori e che queste persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. ** Segnalatori/revisori: ** [ Per le risposte solo codice come questa, downvote, non cancellare!] (// meta.stackoverflow.com/a/260413/2747593) –

Problemi correlati