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 22:15] – [INSERT / UPDATE] 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> +
-So hingegen muss ein Statement nach den zuvor beschriebenen Regeln aussehen: +
-<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, der Umstand, dass auf die Reihenfolge der Felder keine Rücksicht genommen werden muss. Es genügt, dass alle benötigten vorhanden sind.+
  
dev/all/examples.1410992118.txt.gz · Zuletzt geändert: 03.06.2015 15:49 (Externe Bearbeitung)