Benutzer-Werkzeuge

Webseiten-Werkzeuge


dev:all:examples:sql

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:sql [21.06.2015 11:58] – [REPLACE] Manuela v.d.Deckendev:all:examples:sql [27.10.2017 10:16] (aktuell) – [SELECT] Manuela v.d.Decken
Zeile 1: Zeile 1:
 ====== So funktioniert das mit SQL... ====== ====== So funktioniert das mit SQL... ======
-Die ganzen Beispiele in diesem Bereich sind im neuen Stil von WB-2.8.ausgeführt. Bei älteren Versionen ist meist nur $oDb durch $database, $oDb->TablePrefix durch TABLE_PREFIX und ->doQuery() durch ->query() zu ersetzen.+Die ganzen Beispiele in diesem Bereich sind im neuen Stil von WB-2.11.x aufwärts ausgeführt. Bei älteren Versionen ist meist nur $oDb durch $database, <php>$oDb->TablePrefix</php> durch TABLE_PREFIX und <php>$oDb->doQuery()</php> durch <php>$oDb->query()</php> zu ersetzen
 + 
 +**Eine Änderung ist jedoch sehr wichtig:**\\ 
 +Ab 2.11.0 kann das aktuelle Datenbankobjekt an jeder beliebigen Stelle mit\\  
 +<php>$oDb = Database::getInstance();</php> abgerufen werden.\\ 
 +<php>global $database;</php> oder <php>$GLOBALS['database']</php> ist deprecated (unerwünscht) und wird in einer der Folgeversionen nicht mehr zur Verfügung stehen.
 ===== SQL-Statements richtig aufgebaut ===== ===== SQL-Statements richtig aufgebaut =====
 Das ist schon <del>fast</del> ein ganzes Kapitel für sich. Das ist schon <del>fast</del> ein ganzes Kapitel für sich.
 Also am besten erst ein mal die grundlegensten Regeln: Also am besten erst ein mal die grundlegensten Regeln:
-  * Statements dürfen nicht in der Argumentenklammer einer Funktion/Methode erstellt werden. +  * Statements **dürfen nicht** in der Argumentenklammer einer Funktion/Methode erstellt werden. 
-  * Statements müssen grundsätzlich im SQL-Strikt-Syntax aufgebaut werden +  * Statements **müssen** grundsätzlich im SQL-Strikt-Syntax aufgebaut werden 
-    * alle SQL Schlüsselwörter müssen in Großbuchstaben geschrieben werden. +    * alle SQL Schlüsselwörter **müssen** in Großbuchstaben geschrieben werden. 
-    * alle Feld- und Tabellennamen müssen in **`**Backticks**`** eingeschlossen 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 dieser mit einem Backslash **\'** zu maskieren. +  * Statements **dürfen nicht** mit **”**Anführungszeichen**”**, sondern ausschließlich mit **'**Apostroph**'** begrenzt werden. Wird innerhalb des Strings ein Apostroph **'** benötigt, so ist dieser 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 *) in der Regel deutlich schneller liefern kann, als eine lange Auswahlliste von einzelnen Feldern.+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 *) in der Regel deutlich schneller liefern kann, als eine lange Auswahlliste von einzelnen Feldern.
 Um den Aufbau von Statements zu demonstrieren, folgen einige Beispiele der wichtigsten Abfragetypen. Um den Aufbau von Statements zu demonstrieren, folgen einige Beispiele der wichtigsten Abfragetypen.
 ---- ----
Zeile 16: Zeile 21:
 Alle vier Beispiele geben jeweils ein Result-Objekt mit allen Datensätzen der zum aktuellen Zeitpunkt sichtbaren Sections einer Seite zurück. Alle vier Beispiele geben jeweils ein Result-Objekt mit allen Datensätzen der zum aktuellen Zeitpunkt sichtbaren Sections einer Seite zurück.
 <code php Beispiel-1.php>  <code php Beispiel-1.php> 
-$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");+$oResult = $oDb->doQuery("SELECT section_id, page_id, position, module, block, publ_start, publ_end FROM ".TABLE_PREFIX."sections where page_id= $iPageId and ('.time().' BETWEEN `publ_start` AND `publ_end) order by block, position");
 </code> </code>
 <code php Beispiel-2.php>  <code php Beispiel-2.php> 
 $sql  = 'SELECT `section_id`, `page_id`, `position`, `module`, `block`, `publ_start`, `publ_end` FROM `'.$oDb->TablePrefix.'sections` '; $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 .= 'WHERE `page_id`='.$iPageId.' AND ('.time().' BETWEEN `publ_startAND `publ_end) ';
 $sql .= 'ORDER BY `block`, `position`'; $sql .= 'ORDER BY `block`, `position`';
 $oResult = $oDb->doQuery($sql); $oResult = $oDb->doQuery($sql);
Zeile 29: Zeile 34:
      . 'FROM `'.$oDb->TablePrefix.'sections` '      . 'FROM `'.$oDb->TablePrefix.'sections` '
      . 'WHERE `page_id`='.$iPageId.' '      . 'WHERE `page_id`='.$iPageId.' '
-            'AND (`publ_start`=0 OR `publ_start`<='.$iTimestamp.'+            'AND ('.time().' BETWEEN `publ_startAND `publ_end) '
-            'AND (`publ_end`=0 OR `publ_end`>='.$iTimestamp.') '+
      . 'ORDER BY `block`, `position`';      . 'ORDER BY `block`, `position`';
 $oResult = $oDb->doQuery($sql);      $oResult = $oDb->doQuery($sql);     
Zeile 37: Zeile 41:
 $sql = 'SELECT * FROM `'.$oDb->TablePrefix.'sections` ' $sql = 'SELECT * FROM `'.$oDb->TablePrefix.'sections` '
      . 'WHERE `page_id`='.$iPageId.' '      . 'WHERE `page_id`='.$iPageId.' '
-            'AND (`publ_start`=0 OR `publ_start`<='.$iTimestamp.'+            'AND ('.time().' BETWEEN `publ_startAND `publ_end) '
-            'AND (`publ_end`=0 OR `publ_end`>='.$iTimestamp.') '+
      . 'ORDER BY `block`, `position`';      . 'ORDER BY `block`, `position`';
 $oResult = $oDb->doQuery($sql);      $oResult = $oDb->doQuery($sql);     
 </code>Zur Auflockerung eine kleine Quiz-Frage:\\ </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** ?? Welche Beispiele lassen sich leichter lesen, verstehen und bei Bedarf auch leichter ändern? **1**&**2**  oder **3**&**4** ??
 +</code>
 ---- ----
  
Zeile 59: Zeile 63:
 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. 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. 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 nur der jeweils richtige Datentyp übergeben wird.
   * Es muss sichergestellt sein, dass jeder übergebene Wert zuvor überprüft wurde und gültig ist.   * 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.   * Es dürfen nicht Werte aus Superglobalen Arrays, speziell aus //$_POST/$_GET/$_REQUEST///usw. direkt übergeben werden.
Zeile 74: Zeile 78:
 <code php insert-02.php> <code php insert-02.php>
 $sql = 'INSERT INTO `'.$oDb->TablePrefix.'users` ' $sql = 'INSERT INTO `'.$oDb->TablePrefix.'users` '
-     . 'SET `group_id`='.$group_id.', '+     . 'SET `group_id`='.(int)$group_id.', '
          '`groups_id`=\''.$oDb->escapeString($groups_id).'\'`, '          '`groups_id`=\''.$oDb->escapeString($groups_id).'\'`, '
          '`active`='.($active ? 1 : 0).', '          '`active`='.($active ? 1 : 0).', '
Zeile 82: Zeile 86:
          '`home_folder`=\''.$oDb->escapeString($home_folder).'\', '          '`home_folder`=\''.$oDb->escapeString($home_folder).'\', '
          '`email`=\''.$oDb->escapeString($email).'\', '          '`email`=\''.$oDb->escapeString($email).'\', '
-         '`timezone`='.(int)-72000.', '+         '`timezone`='.-72000.', '
          '`language`=\''.$oDb->escapeString($default_language).'\'';          '`language`=\''.$oDb->escapeString($default_language).'\'';
 </code> </code>
Zeile 90: Zeile 94:
      . 'SET `display_name`=\''.$oDb->escapeString($sNewDisplayName).'\', '      . 'SET `display_name`=\''.$oDb->escapeString($sNewDisplayName).'\', '
          '`active`=1 '          '`active`=1 '
-     . 'WHERE `user_id`='.$iUserId;+     . 'WHERE `user_id`='.(int)$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 weit stärker als die dafür zusätzlich benötigte Zahl an Zeilen. </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 weit stärker als die dafür zusätzlich benötigte Zahl an Zeilen.
 ---- ----
dev/all/examples/sql.1434887932.txt.gz · Zuletzt geändert: 21.06.2015 11:58 von Manuela v.d.Decken