Benutzer-Werkzeuge

Webseiten-Werkzeuge


dev:all:examples

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
dev:all:examples [17.09.2014 23:27] – [DELETE] Manuela v.d.Deckendev:all:examples [26.06.2018 07:15] (aktuell) – [...rund um die Datenbank] Manuela v.d.Decken
Zeile 1: Zeile 1:
 ====== So funktioniert das... ====== ====== So funktioniert das... ======
  
-[[dev:all:examples|{{:idea.png?nolink&64 |Standards}}]] +[[dev:all:examples|{{:idea.png?nolink&128 |Standards}}]] 
-Eine Sammlung von Codebeispielen... bli bla blubber.. hier kommt noch Text+Eine Sammlung von Codebeispielen, die gleichzeitig auch wieder Regeln definieren, wie im Zusammenhang mit WebsiteBaker programmiert/gecoded werden soll.
  
  
Zeile 10: Zeile 10:
  
 ---- ----
- +===== ...gut zu wissen ===== 
-===== Rund um die Datenbank ===== +  * **[[dev:all:examples:gtk-charset|Von Zeichensätzen und Dateien]]** 
-Die ganzen Beispiele in diesem Bereich sind im neuen Stil von WB-2.8.4 ausgeführtBei älteren Versionen ist meist nur $oDb durch $database und $oDb->TablePrefix durch TABLE_PREFIX zu ersetzen. +===== ...rund um die Datenbank ===== 
-==== SQL-Statements richtig aufgebaut ==== +  * **[[dev:all:examples:dbconnect|Vom Verbindungsaufbau bis zu den verfügbaren Methoden]]** 
-Das ist schon <del>fast</del> ein ganzes Kapitel für sich. +  * **[[dev:all:examples:sql|Grundlagen der SQL-Statements]]** 
-Also am besten erst ein mal die grundlegensten Regeln: +  * **[[dev:all:examples:sql-1|Der richtige Einsatz von SQL-Abfragen]]**
-  * Statements dürfen nicht in der Argumentenklammer einer Funktion/Methode erstellt werden. +
-  Statements müssen grundsätzlich im SQL-Strikt-Syntax aufgebaut werden +
-    alle mySql Schlüsselwörter müssen in Großbuchstaben geschrieben werden. +
-    * alle Feld- und Tabellennamen müssen in **`** Backticks eingeschlossen werden. +
-  * Statements dürfen nicht mit **”**text**”**, sondern ausschließlich mit **'**text**'** begrenzt werden. Wird innerhalb des Strings ein Apostroph **'** benötigt, so ist der mit einem Backslash **\** zu maskieren. +
-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. +
----- +
- +
-=== SELECT ==+
-Alle vier Beispiele geben ein Result-Objekt mit allen Datensätzen der zum aktuellen Zeitpunkt sichtbaren Sections zurück +
-<code php Beispiel-1.php>  +
-$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"); +
-</code> +
-<code php Beispiel-2.php>  +
-$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); +
-</code>  +
-<code php Beispiel-3.php>  +
-$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);      +
-</code>  +
-<code php Beispiel-4.php>  +
-$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);      +
-</code>Zur Auflockerung eine kleine Quiz-Frage:\\ +
-Welche Beispiele lassen sich leichter lesen, verstehen und bei Bedarf auch leichter ändern? **1**&**2**  oder **3**&**4** ?? +
----- +
- +
-=== DELETE === +
-Bei dieser Abfrage kann man eigentlich nichts falsch machen...  ausser der Angabe falscher Lösch-Kriterien. ;-)\\ +
-Aber auch hier giltErst das Statement in einer Variablen aufbauen und diese dann an die Query-Methode übergeben. +
-<code php DELETE-1.php> +
-$sql = 'DELETE FROM `'.$oDb->TablePrefix.'users`' +
-     . 'WHERE `user_id`='.$iUserId; +
-$oDb->doQuery($sql); +
-</code>Datensätze sollten in der Regel nur über ihre Datensatz-ID gelöscht werden. +
----- +
- +
-=== INSERT / UPDATE === +
-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. +
-  * Es muss sichergestellt sein, dass nur der richtige Datentyp übergeben wird. +
-  * Es muss sichergestellt sein, dass jeder übergebene Wert zuvor überprüft wurde und gültig ist. +
-  * Es dürfen nicht Werte aus Superglobalen Arrays, speziell aus //$_POST/$_GET/$_REQUEST///usw. direkt übergeben werden. +
-  * Stringvariable müssen vor der Übergabe '//escaped//' werden. Dazu ist ausschließlich die Methode //escapeString()// des Datenbankobjektes zu verwenden, da nur diese Methode genau so maskiert, wie es die aktuell benutzte Datenbank benötigt. Irgendwelche andere Methoden wie //addslashes()// oder selbstgebaute Funktionen etc. sind **nicht** zulässig. +
-  * Enthält eine Tabelle ein //Autoincrement//-Feld, so darf dieses bei einem INSERT **nicht** gesetzt und bei einem UPDATE **nicht** verändert werden. Bei einer unter STRIKT laufenden Datenbank würde dies einen schweren Fehler auslösen und das Programm abbrechen. Ebenso wird ein Abbruch ausgelöst, wenn einem Feld ohne Default-Wert bei einem INSERT kein Wert zugewiesen wird. +
-:!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: +
-<code php insert-01.php> +
-// 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')"; +
-</code> +
-Das selbe Statement jetzt nach den zuvor beschriebenen Regeln: +
-<code php insert-02.php> +
-$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).'\''; +
-</code> +
-Ein UPDATE sieht im Prinzip genau so aus: +
-<code php SET-1.php> +
-$sql = 'UPDATE `'.$oDb->TablePrefix.'users` ' +
-     . 'SET `display_name`=\''.$oDb->escapeString($sNewDisplayName).'\',+
-         '`active`=+
-     . 'WHERE `user_id`='.$iUserId; +
-</code>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.+
  
dev/all/examples.1410996441.txt.gz · Zuletzt geändert: 03.06.2015 15:50 (Externe Bearbeitung)