Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
dev:all:examples:sql [21.11.2014 07:59] – [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 104: | Zeile 111: | ||
-- | -- | ||
CREATE TABLE IF NOT EXISTS `{TABLE_PREFIX}settings` ( | CREATE TABLE IF NOT EXISTS `{TABLE_PREFIX}settings` ( | ||
- | `name` varchar(255){TABLE_COLLATION} NOT NULL, | + | `name` varchar(255){FIELD_COLLATION} NOT NULL, |
- | `value` text{TABLE_COLLATION} NOT NULL, | + | `value` text{FIELD_COLLATION} NOT NULL, |
PRIMARY KEY (`name`) | PRIMARY KEY (`name`) | ||
){TABLE_ENGINE}; | ){TABLE_ENGINE}; | ||
</ | </ | ||
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 = ' | ||
- | . ' | + | . ' |
- | . '(`key_2`, \'' | + | . '(\'' |
- | . '(`key_3`, \'' | + | . '(\'' |
if (!$oDb-> | if (!$oDb-> | ||
$retval = false; | $retval = false; |