Dies ist eine alte Version des Dokuments!
Eine Sammlung von Codebeispielen… bli bla blubber.. hier kommt noch Text
Auch hier gilt großteils die in RFC-2119 festgelegte Ausdrucksweise der Coding-Standards.
Die ganzen Beispiele in diesem Bereich sind im neuen Stil von WB-2.8.4 ausgeführt. Bei älteren Versionen ist meist nur $oDb durch $database und $oDb→TablePrefix durch TABLE_PREFIX zu ersetzen.
Das ist schon fast ein ganzes Kapitel für sich.
Also am besten erst ein mal die grundlegensten Regeln:
SQL-Statements sollten auch optisch so aufgebaut werden, dass sie problemlos und schnell gelesen und erfasst werden können. Die zeilenweise Aufteilung nach Action-Schlüsselwörtern ist an der Stelle sehr sinnvoll. Ist eine Zeile zu lang (Codingstandards) dann mit Einrückung auf mehrere Zeilen verteilen. Bei der Feldauswahl im SELECT-Bereich ist zu beachten, dass der Server komplette Datensätze (SELECT *) deutlich schneller liefern kann, als eine Auswahlliste von einzelnen Feldern. Um den Aufbau von Statements zu demonstrieren, folgen einige Beispiele der wichtigsten Abfragetypen.
Alle vier Beispiele geben ein Result-Objekt mit allen Datensätzen der zum aktuellen Zeitpunkt sichtbaren Sections zurück
$iTimestamp = time(); // make sure to use the identical time everywhere $oResult = $oDb->doQuery("SELECT section_id, page_id, position, module, block, publ_start, publ_end FROM ".TABLE_PREFIX."sections where page_id= $iPageId and (publ_start = 0 OR publ_start <= $iTimestamp ) and (publ_end = 0 OR publ_end >= $iTimestamp ) order by block, position");
$iTimestamp = time(); // make sure to use the identical time everywhere $sql = 'SELECT `section_id`, `page_id`, `position`, `module`, `block`, `publ_start`, `publ_end` FROM `'.$oDb->TablePrefix.'sections` '; $sql .= 'WHERE `page_id`='.$iPageId.' AND (`publ_start`=0 OR `publ_start`<='.$iTimestamp.') AND (`publ_end`=0 OR `publ_end`>='.$iTimestamp.') '; $sql .= 'ORDER BY `block`, `position`'; $oResult = $oDb->doQuery($sql);
$iTimestamp = time(); // make sure to use the identical time everywhere $sql = 'SELECT `section_id`, `page_id`, `position`, `module`, ' . '`block`, `publ_start`, `publ_end` ' . 'FROM `'.$oDb->TablePrefix.'sections` ' . 'WHERE `page_id`='.$iPageId.' ' . 'AND (`publ_start`=0 OR `publ_start`<='.$iTimestamp.') ' . 'AND (`publ_end`=0 OR `publ_end`>='.$iTimestamp.') ' . 'ORDER BY `block`, `position`'; $oResult = $oDb->doQuery($sql);
$iTimestamp = time(); // make sure to use the identical time everywhere $sql = 'SELECT * FROM `'.$oDb->TablePrefix.'sections` ' . 'WHERE `page_id`='.$iPageId.' ' . 'AND (`publ_start`=0 OR `publ_start`<='.$iTimestamp.') ' . 'AND (`publ_end`=0 OR `publ_end`>='.$iTimestamp.') ' . 'ORDER BY `block`, `position`'; $oResult = $oDb->doQuery($sql);
Zur Auflockerung eine kleine Quiz-Frage:
Welche Beispiele lassen sich leichter lesen, verstehen und bei Bedarf auch leichter ändern? 1&2 oder 3&4 ??
Bei dieser Abfrage kann man eigentlich nichts falsch machen… ausser der Angabe falscher Lösch-Kriterien.
Aber auch hier gilt: Erst das Statement in einer Variablen aufbauen und diese dann an die Query-Methode übergeben.
$sql = 'DELETE FROM `'.$oDb->TablePrefix.'users`' . 'WHERE `user_id`='.$iUserId; $oDb->doQuery($sql);
Datensätze sollten in der Regel nur über ihre Datensatz-ID gelöscht werden.
In diesem Bereich wird es langsam interessant. Es gibt mehrere verschiedene Arten die Statements für INSERTs und UPDATEs aufzubauen. Speziell im Bereich der Werteübergabe.
Bei allen Arten von INSERTs gilt jedoch die SQL-Strikt Regel, dass allen Feldern eines Datensatzes Werte zugewiesen werden müssen. Ausgenommen hiervon sind nur die Felder, die in der Tabelle bereits mit einem Default-Wert vordefiniert sind.
Immer wenn Daten in die Datenbank geschrieben werden sollen, sind bestimmte Sicherheitsregeln zu beachten.
Im Umfeld von WebsiteBaker ist für INSERT und UPDATE Statements ausschließlich die 'SET'-Methode zur Werteübergabe zulässig!
Erst ein Beispiel wie ein Statement (obwohl syntaktisch richtig) nicht aussehen darf:
// das ist übrigens ein Original-Statement aus WB-2.8.3-SP1 'add user' $sql = "INSERT INTO ".TABLE_PREFIX."users (group_id,groups_id,active,username,password,display_name,home_folder,email,timezone, language) VALUES ('$group_id', '$groups_id', '$active', '$username','$md5_password','$display_name','$home_folder','$email','-72000', '$default_language')";
So hingegen muss ein Statement nach den zuvor beschriebenen Regeln aussehen:
$sql = 'INSERT INTO `'.$oDb->TablePrefix.'users` ' . 'SET `group_id`='.$group_id.', ' . '`groups_id`='.$groups_id.'`, ' . '`active`='.($active ? 1 : 0).', ' . '`username`=\''.$oDb->escapeString($username).'\', ' . '`password`=\''.$oDb->escapeString($md5_password).'\', ' . '`display_name`=\''.$oDb->escapeString($display_name).'\', ' . '`home_folder`=\''.$oDb->escapeString($home_folder).'\', ' . '`email`=\''.$oDb->escapeString($email).'\', ' . '`timezone`='.(int)-72000.', ' . '`language`=\''.$oDb->escapeString($default_language).'\'';
Ein UPDATE sieht im Prinzip genau so aus:
$sql = 'UPDATE `'.$oDb->TablePrefix.'users` ' . 'SET `display_name`=\''.$oDb->escapeString($sNewDisplayName).'\', ' . '`active`=1 ' . 'WHERE `user_id`='.$iUserId;
Ein großer Vorteil der SET-Methode ist neben der Übersichtlichkeit und der leichten Änderbarkeit, der Umstand, dass auf die Reihenfolge der Felder keine Rücksicht genommen werden muss. Es genügt einfach, dass alle benötigten Felder vorhanden sind. Diese Vorteile wiegen stärker als die dafür zusätzlich benötigte Zahl an Zeilen.