2016-06-03 7 views
1

Ich frage mich nur, was ist die sicherste Möglichkeit, meine Datenbank abzufragen, wenn Code-Zünder verwenden. Derzeit mein Modell Abfragen wie folgt aussehen:Sicherste Möglichkeit, mit Code mit Codeintitor zu interagieren

function getDetails($filename){ 
    $this->db->select('*'); 
    $this->db->from("mydatabase"); 
    $this->db->where("filename",$filename); 
    $query = $this->db->get(); 

    if($query->num_rows()>0){ 
     return $query->result(); 
    } 
    else{ 
     return $query->result(); 
    } 
} 

oder alternativ:

function getUsername($username){ 
    $this->db->where('username', $username); 
    $query = $this->db->get('users'); 
    foreach ($query->result() as $row) 
    { 
     return $row->username; 
    } 

} 

Aber ist das die sicherste Art und Weise? Wenn nicht, weiß jemand einen sichereren Weg? Vielen Dank im Voraus.

+0

Die Verwendung der aktiven Record-Klassen ist der beste Weg, den Sie bereits machen. Ich bin mir nicht sicher, warum Sie das If/Else in Ihrer ersten Methode machen, weil sie beide das Gleiche zu tun scheinen. Auch im zweiten können Sie '-> limit (1)' then '$ query-> row()' machen, so dass Sie nur eine Zeile erhalten. Aber abgesehen von diesen kleinen Problemen sieht es gut aus. – mic

Antwort

3

Hängt davon ab, was Sie mit "sicher" und "sicher" meinen. Wenn "sicher" angenommen wird, werden die Variablen überprüft, ob sie gültig sind (dh definiert und gesetzt), dann ist sicher und getUsername() nicht so sehr.

Die erste wird mit der Zeile if($query->num_rows()>0){ gesichert, in der Sie bestätigen, dass die Abfrage einige Zeilen zurückgegeben hat. Ein Vorschlag, betrachten Sie diese Struktur stattdessen.

if($query->num_rows()>0){ 
    return $query->result(); 
} 
else 
{ 
    return NULL; 
    //return $query->result(); would return an empty array which might be OK 
    //if you account for that possibility in the calling function. 
    //But if that's the case why the `if` statement? 
    //Skip the conditional and just return $query->result() 
} 

Oder statt eine if diese Bedingung eleganter einen ternären Operator geschrieben werden kann.

return $query->num_rows()>0 ? $query->result() : NULL; 

Ich möchte NULL aus Modellen zurückgeben, wenn die Abfrage keine Ergebnisse erzeugt. Der Rückgabewert wird in der aufrufenden Funktion geprüft wie so

$result = $this->model_name->getDetails($filename); 
if(empty(result)) 
{ 
    //handle the lack of data 
} 
else 
{ 
    //do stuff with $result 
} 

Die PHP-Funktion empty() schön ist weil es die ganze berücksichtigen leer folgenden sein: NULL, FALSE, ein leeres Array, eine leere Zeichenfolge („“), 0 (0 als ganze Zahl), 0.0 (0 als Float), "0" (0 als String). Die meisten Basen sind dann abgedeckt.

getUsername($username) ist weniger sicher, da möglicherweise keine Zeilen von der Abfrage zurückgegeben werden. Dies könnte zu einer nicht gesetzten Variablen in der Funktion führen, die die Rückgabe von dieser Funktion zuweist. Ohne Zeile wird die foreach nicht ausgeführt und getUsername($username) wird void zurückgeben. Das ist nicht unbedingt ein Problem, wenn Sie isset() auf die Variable verwenden, die durch den Aufruf an getUsername($username) zugewiesen wird.

Soweit "sicher" betroffen ist, sind Sie in guter Verfassung, weil die Verwendung where() zB $this->db->where('username', $username); automatisch den Eingabewert entkommt. Benutzereingaben sind immer ein Hauptanliegen und möglicher Angriff.

+0

Danke für diese Antwort. Normalerweise gebe ich 'FALSE' zurück, wenn keine Ergebnisse vorliegen. Gibt es Vorteile, NULL stattdessen zurückzugeben? – cartalot

+0

Der Vorteil kommt, wenn Sie 'isset()' verwenden, um die Ergebnisse zu überprüfen. Wenn ein '$ x = FALSE;' dann gibt 'isset ($ x) '' TRUE' zurück. Aber wenn '$ x = NULL;' dann gibt 'isset ($ x) '' 'FALSE' zurück. Wenn Sie 'empty()' verwenden, dann werden sowohl $ x = NULL als auch '$ x = FALSE' 'TRUE' zurückgeben. ABER im Falle einer Datenbankrückgabe ist es durchaus möglich, ein leeres Element in diesem zu erhalten und anzuordnen, z.B. '$ x = array (array());' welches 'leer ($ x)' wird als FALSE gemeldet. Technisch gesehen keine leere Var, aber wenig brauchbar. – DFriend

+0

Vielen Dank für die Antwort. – cartalot

1

Dfriend hat einige gute Punkte. Ich werde einfach weitermachen, weil das ein so grundlegendes Muster ist, um es wirklich zu vertiefen.

Sie schrieb:

if($query->num_rows()>0){ 
     return $query->result(); 
    } 
    else{ 
     return $query->result(); // editors note: no no no 
    } 

Ich bin als Dfriend nicht so höflich sein werden - dies nicht tun. Es ist verwirrend zu sehen und ist nicht korrekt. Hier ist eine Möglichkeit:

if($query->num_rows()>0){ 

     return $query; 
    } 
    else{ 
     return FALSE; 
    } 

Eine Überlegung ist, dass, wenn Sie ein Ergebnis mit mehreren Reihen zurückkehren - dann nur $ query aus dem Modell zurück. Dann haben Sie Optionen für spätere Methoden und Ihre Sicht.

In der Steuerung möchten Sie immer überprüfen, ob Sie etwas aus der Datenbank zurückbekommen haben. Selbst wenn Sie Datensätze haben und Ihr PHP-Server funktioniert, kann die Datenbankverbindung ausfallen. Dfriends Weg ist sehr gut, das ist etwas anders. Grundsätzlich prüfen wir zuerst die Nicht-Bedingung. Wenn keine Ergebnisse gefunden wurden, gehen wir zu einer Methode für diese Bedingung. Das hält Ihre Methoden fokussiert und leicht verständlich.

// if the query result was false, then show a different view 
    if(! $query = $this->model->getDetails($searchTerm) 
    { 
     $this->showNoResultsFor($searchTerm); 
    } 
    // if you return just $query you have all these options available 
    // in your controller and/or view 
    else 
    { 
    // get one row 
     $query->row() ;  

     // get number of records returned 
     $query->num_rows(); 

     // the records as object 
     $query->result() ; 

     // pass query to your view 
     $data['query'] = $query ; 

     // pass the number of found results to view 
     $data['found'] = $query->num_rows(); 

     // pass just the records to view 
     $data['results'] = $query->result() ; 

    } 

Zum Beispiel die Anzahl der Datensätze in Ihrer View-Datei angezeigt - ist sehr üblich. Oder müssen einen Datensatz von einer Gruppe von ihnen greifen. Deshalb schlage ich vor, $ query zurückzugeben. Schließlich jetzt haben Sie realisiert, dass dies umständlich

foreach ($query->result() as $row) 
    { 
     return $row->username; // editors note: no no and no 
    } 

Wenn Sie nach etwas suchen, das Sie wissen, wie ein Tabellensatz-ID eindeutig sein muss - und es kann nur ein Ergebnis sein - dann für ein Ergebnis überprüfen und gib die Reihe zurück.

if($query->num_rows() == 1){ 
    return $query->row(); 
} 
else{ return false; } 
+0

Ein zusätzlicher Kommentar zu 'foreach ($ query-> result() als $ row)'. Wieder nein, nein und nein. Nennen Sie keine Funktion als erstes Argument 'foreach'. Anstatt zu $ ​​result = $ query-> result(); foreach ($ Ergebnis als $ Zeile) {... ' – DFriend

+0

Gute Punkte alle @carlalot. – DFriend

+0

Danke für die Antwort @DFriend! Ich werde all das berücksichtigen .. danke für die Hilfe – user