====== 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!//