2016-08-24 6 views
1

Ich arbeite an einem Webcode, der Codeigniter und den eingebauten QueryBuilder verwendet, um auf eine Datenbank zuzugreifen.Datenbankabfrage mit falscher Zeile

ich versuchen, Daten aus der Datenbank für den aktuellen Benutzer für getUser

$userModel = $this->loadModel('ModelUser'); 
$name = $this->session->userdata('user'); 
$user = $userModel->getUser($name); 

Dies ist der Code zu laden:

function getUser($username) 
{ 
    $this->db->where('username',$username); 
    $query = $this->db->get('tblusers',1); 
    $res = $query->result(); 
    if ($query->num_rows() > 0) 
    { 
     log_message('debug','Got user. ID = '.$res[0]->id); 
     foreach($res[0] as $key => $val) 
     { 
      $this->$key = $val; 
     } 
     return $this; 
    } 
    else { 
     log_message('info','failed to find user '.$username); 
     return NULL; 
    } 
} 

Dies funktioniert gut, es sei denn, ich lasse die Sitzung abläuft, in denen Fall bekomme ich die Details eines anderen Benutzers.

Dies sind die Ergebnisse der Tests getUser:

$userModel->getUser("Admin"); //Got user. ID = Admin_ID 
$userModel->getUser("john"); //Got user. ID = John_ID 
$userModel->getUser("");  //Failed to find user 
$userModel->getUser(null); //Failed to find user 

Als ich als Admin log dann die Session-Timeout lassen, meldet sich der Top-Schnipsel die Meldung:

Got user. ID = John_ID

Ich würde erwarten, entweder Got user. ID = Admin_ID oder

+0

Sie können diese Funktion aufrufen, wenn die Sitzung anders eingestellt ist, rufen Sie diese Funktion nicht auf, Sie können die Nachricht ** Sitzung ist abgelaufen ** einstellen. –

+0

Ich verstehe, wie man das Problem verhindert, aber ich verstehe die Ursache nicht –

Antwort

0

Wenn $this->session->userdata('field') findet keinen Eintrag, es gibt 0 anstelle der "" oder null, die ich getestet wurde, zurück.

Logging $this->db->last_query() zeigte dies, da die resultierende Abfrage war:

SELECT * FROM tblusers WHERE username = 0 LIMIT 1; 

MySQL automatisch Strings in Integer konvertieren, wo die Schnur mit einer ganzen Zahl beginnt. Eine Zeichenfolge ohne Ganzzahl wird wie in this answer beschrieben in 0 umgewandelt. Die Abfrage gab den ersten Eintrag zurück, auf den sie stieß, anstatt nach Zeilen zu suchen, da jede Zeichenfolge, die nicht mit 1-9 begann, der WHERE-Klausel entsprechen würde.

Ich fügte getUser eine Klausel hinzu, um NULL wenn $username == '' zurückzugeben. Ich habe versucht, === 0, aber das ergab den gleichen Fehler, so gibt es einige Art Zwang, dass ich bin nicht 100% sicher, aber dies deckt das Problem schöner als die Behandlung der Fall jedes Mal heißt.