Inhaltsverzeichnis

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!

Verschiedene Beispiele für mehr oder weniger komplexe SQL-Abfragen

Achtung: Die folgenden Beispiele sind nicht zur copy&paste Programmierung gedacht, sondern nur beispielhafte Denkanregungen, die aufzeigen sollen wie ein Problem gelöst werden kann!

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->fetchArray(MYSQLI_ASSOC)) {
 
        // all ok, do something with the data
 
    }
}

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

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 zugehörenden Users

(zur Vereinfachung werden nur die SQL-Statements dargestellt.)
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. Dazu müssen nur die beiden Tabellen über die Felder 'modified_by' und 'user_id' durch einen JOIN miteinander verknüpft werden.
Es lohnt sich auf jeden Fall, sich in SQL einzulesen um die Grundlagen zu begreifen.

Snippet.sql
SELECT `wb_users`.`display_name`, `wb_pages`.* 
FROM `wb_pages` LEFT JOIN `wb_users`
    ON `wb_pages`.`modified_by`=`wb_users`.`user_id`
WHERE `wb_pages`.`page_id`=1

FIXME … wird mit Auftauchen weiterer Beispiele kontinuierlich fortgesetzt!