====== 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
[color=red]falsch[/color]
$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:\\
* 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 fetchArray() 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 [color=green]richtige[/color] Codefragment:
$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.
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!//