Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| dev:all:examples:sql [30.04.2015 11:26] – [REPLACE] Manuela v.d.Decken | dev: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.4 ausgeführt. Bei älteren Versionen ist meist nur $oDb durch $database, $oDb-> | + | Die ganzen Beispiele in diesem Bereich sind im neuen Stil von WB-2.11.x aufwärts |
| + | |||
| + | **Eine Änderung ist jedoch sehr wichtig: | ||
| + | Ab 2.11.0 kann das aktuelle Datenbankobjekt an jeder beliebigen Stelle mit\\ | ||
| + | < | ||
| + | < | ||
| ===== SQL-Statements richtig aufgebaut ===== | ===== SQL-Statements richtig aufgebaut ===== | ||
| Das ist schon < | Das ist schon < | ||
| 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/ | + | * Statements |
| - | * Statements müssen grundsätzlich im SQL-Strikt-Syntax aufgebaut werden | + | * Statements |
| - | * alle SQL Schlüsselwörter müssen in Großbuchstaben geschrieben werden. | + | * alle SQL Schlüsselwörter |
| - | * alle Feld- und Tabellennamen müssen in **`**Backticks**`** eingeschlossen werden. | + | * alle Feld- und Tabellennamen |
| - | * 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 |
| - | 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 |
| Um den Aufbau von Statements zu demonstrieren, | Um den Aufbau von Statements zu demonstrieren, | ||
| ---- | ---- | ||
| 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-> | + | $oResult = $oDb-> |
| </ | </ | ||
| <code php Beispiel-2.php> | <code php Beispiel-2.php> | ||
| - | $sql = ' | + | $sql |
| - | $sql .= 'WHERE `page_id`=' | + | $sql .= 'WHERE `page_id`=' |
| $sql .= 'ORDER BY `block`, `position`'; | $sql .= 'ORDER BY `block`, `position`'; | ||
| + | $oResult = $oDb-> | ||
| </ | </ | ||
| <code php Beispiel-3.php> | <code php Beispiel-3.php> | ||
| Zeile 28: | Zeile 34: | ||
| . 'FROM `' | . 'FROM `' | ||
| . 'WHERE `page_id`=' | . 'WHERE `page_id`=' | ||
| - | | + | |
| - | . 'AND (`publ_end`=0 OR `publ_end`> | + | |
| . 'ORDER BY `block`, `position`'; | . 'ORDER BY `block`, `position`'; | ||
| + | $oResult = $oDb-> | ||
| </ | </ | ||
| <code php Beispiel-4.php> | <code php Beispiel-4.php> | ||
| $sql = ' | $sql = ' | ||
| . 'WHERE `page_id`=' | . 'WHERE `page_id`=' | ||
| - | | + | |
| - | . 'AND (`publ_end`=0 OR `publ_end`> | + | |
| . 'ORDER BY `block`, `position`'; | . 'ORDER BY `block`, `position`'; | ||
| + | $oResult = $oDb-> | ||
| </ | </ | ||
| Welche Beispiele lassen sich leichter lesen, verstehen und bei Bedarf auch leichter ändern? **1**& | Welche Beispiele lassen sich leichter lesen, verstehen und bei Bedarf auch leichter ändern? **1**& | ||
| + | </ | ||
| ---- | ---- | ||
| Zeile 56: | 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 |
| * 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 // | * Es dürfen nicht Werte aus Superglobalen Arrays, speziell aus // | ||
| Zeile 71: | Zeile 78: | ||
| <code php insert-02.php> | <code php insert-02.php> | ||
| $sql = ' | $sql = ' | ||
| - | . 'SET `group_id`=' | + | . 'SET `group_id`=' |
| | | ||
| | | ||
| Zeile 79: | Zeile 86: | ||
| | | ||
| | | ||
| - | | + | |
| | | ||
| </ | </ | ||
| Zeile 87: | Zeile 94: | ||
| . 'SET `display_name`=\'' | . 'SET `display_name`=\'' | ||
| | | ||
| - | . 'WHERE `user_id`=' | + | . 'WHERE `user_id`=' |
| </ | </ | ||
| ---- | ---- | ||
| Zeile 110: | Zeile 117: | ||
| </ | </ | ||
| Im Statement muss zwingend ein Wert für das Feld mit dem PRIMARY_KEY oder UNIQUE_KEY übergeben werden. | Im Statement muss zwingend ein Wert für das Feld mit dem PRIMARY_KEY oder UNIQUE_KEY übergeben werden. | ||
| - | Auch der Aufbau des Statements weicht vom normalen ' | + | Auch der Aufbau des Statements weicht vom normalen ' |
| <code php snippet.php> | <code php snippet.php> | ||
| $sql = ' | $sql = ' | ||
| - | . ' | + | . ' |
| - | . '(`' | + | . '(\'' |
| - | . '(`' | + | . '(\'' |
| if (!$oDb-> | if (!$oDb-> | ||
| $retval = false; | $retval = false; | ||