Benutzer-Werkzeuge

Webseiten-Werkzeuge


dev:all:examples:sql-1

Dies ist eine alte Version des Dokuments!


Der richtige Einsatz von SQL-Abfragen

Dieses Kapitel soll häufige Fehler/Unsauberkeiten im Umgang mit Datenbanken in früheren Versionen von WB aufzeigen und auch gleich entsprechende Lösungen anbieten. Die beanstandeten Codefragmente sind nicht erfunden, sondern original aus WB und Modulen entnommen!

Abruf eines einzelnen Users

Es wird einfach anhand der `user_id` ein einzelner Datensatz in der Tabelle `users` gesucht

falsch

$query = $database->query("SELECT * FROM '.TABLE_PREFIX.'users WHERE user_id = $user_id LIMIT 1");
if ($query->numRows() > 0) {
    while ($user = $query->fetchRow()) {
 
        // all ok, do something with the data
 
    }
}

Dieser Code enthält gleich mehrere Problemstellen und überflüssigen Code:

  • Die Methode query() ist nicht abgesichert. Bei einem Fehler im Statement oder der Datenbank bricht das Script mit der sehr aussagekräftigen Meldung „Error in class database line xxx“ komplett ab.
  • LIMIT 1 - dieses Statement ist überflüssig, da eine user_id als Primärschlüssel grundsätzlich nur einmal vorhanden sein kann.
  • Das SQL-Statement entspricht nicht den SQL-Strikt Regeln und ist zusätzlich noch innerhalb der Argumentenklammer von →query() definiert.
  • WHILE - diese Schleife ist überflüssig, da ja maximal nur ein Datensatz geliefert wird.
  • Die Abfrage auf numRows() ist überflüssig, weil das nachfolgende fetchRow() den ersten Datensatz des Result-Objektes oder null, falls kein Datensatz gefunden wurde, zurückgibt.

Nach den neuen Standards von WB korrigiert, ergibt sich dadurch folgendes richtige Codefragment:

Snippet.php
$sql = 'SELECT * FROM `'.$oDb->TablePrefix.'users` '
     . 'WHERE `user_id`='.$user_id;
if (($oResult = $oDb->doQuery($sql))) {
    if (($aUser = $oResult->fetchArray())) {
        // all ok, do something with the data now
    } else {
        // no user record found
    }
} else {
    // error on executing query
}

Eine Seite abrufen und dazu den Namen des zuhehörenden Users

Hierzu werden Daten aus zwei Tabellen benötigt: die Daten aus 'wb_pages' sowie der Benutzername aus der Tabelle 'wb_users'. Diese Aufgabe ist ohne jeden zusätzlichen PHP-Code rein mit SQL elegant lösbar.

Snippet.php
SELECT `u`.`display_name` `user_name`, `p`.* 
FROM `wb_pages` `p`
LEFT JOIN `wb_users` `u` 
    ON `p`.`modified_by`=`u`.`user_id`
WHERE `p`.`page_id`=1

… wird mit Auftauchen weiterer Beispiele kontinuierlich fortgesetzt!

dev/all/examples/sql-1.1430690418.txt.gz · Zuletzt geändert: 03.06.2015 15:55 (Externe Bearbeitung)