# 7.2 SQL

SQL ist die meist verwendete Datenbanksprache für relationale Datenbanksysteme. In der letzten genormten Form liegt SQL:2022 vor, bei der SQL erstmals auch das JSON-Format unterstützt. Nicht jede Datenbank erfüllt diese Norm, und neben den Standardbefehlen in SQL hat jeder große Datenbankhersteller einen eigenen Sprachumfang hinzugefügt. Ein Wechsel der Datenbank ist oftmals eine schwierige Angelegenheit, so dass die Wahl vor der Programmierung der PHP-Funktionalitäten erfolgen sollte.

Anmerkung

Wenn Sie noch nie mit Datenbanken oder SQL gearbeitet haben, dann wird ein Blick auf die Wikipedia-Seiten empfohlen: SQL auf Wikipedia

Bevor mit PHP allerdings eine Datenbankabfrage durchgeführt werden kann, muss eine Verbindung zur Datenbank aufgebaut werden. Die Datenbanken sind vor Fremdzugriff mit Usernamen und Passwort geschützt, wobei unterschiedliche Rechte an die einzelnen User vergeben werden können.

Der Sprachumfang von SQL ist sehr mächtig und die Erstellung des Datenbankdesigns sollte Personen überlassen werden, die über genügend Wissen und Erfahrung in dem Gebiet verfügen. Im Rahmen dieser Veranstaltung werden lediglich einige Grundfunktionalitäten behandelt.

Funktion | Beschreibung
--- | ---
create table | Erstellen einer Datenbanktabelle.
insert | Einfügen von Daten in die Tabelle. Bei einer Spalte ohne Eintrag wird ein Default-Wert gesetzt.
select | Liest Daten aus der Tabelle aus.
update | Überschreiben/ändern von Daten der Tabelle.
delete | Löschen von Daten der Tabelle.

Die gute Nachricht ist, dass es gute (webbasierte) Verwaltungstools für Datenbanken gibt, sodass Sie die Befehle nicht direkt in einer Kommandozeile verwenden müssen. Doch zunächst wollen wir noch zwei wichtige Begriffe behandeln: "Transactions" und "Prepared Statements".

### Transactions

Eine Transaktion ist ein schreibender oder lesender Zugriff auf eine Datenbank, bei dem für andere Nutzer:innen für die (sehr kurze) Dauer des Datenzugriffs die Tabellen gesperrt sind, damit die Datenbank konsistent bleibt. Wenn beispielsweise zwei Nutzer "A" und "B" wirklich gleichzeitig einen Datensatz ändern würden, dann könnte es ansonsten vorkommen, dass Teile der Änderung von "A" und Teile der Änderung von "B" in die Datenbank geschrieben werden und dies zu einem inkonsistenten Datensatz führt. In MySQL lassen sich "Transactions" ein- oder ausschalten. Eingeschaltet werden die Datensätze während des Zugriffs gesperrt. Ausgeschaltet ist die Datenbank schneller, aber es besteht die Gefahr inkonsistenter Datensätze.

### Prepared Statements

Ein Prepared Statement führt eine Datenbankabfrage durch und nutzt dabei keine konkreten Parameterwerte, sondern Platzhalter anstelle der Parameter. Die konkreten Parameter werden dann erst im zweiten Schritt eingesetzt. Dieses Vorgehen hat zwei große Vorteile:

1. Sich wiederholende Abfragen werden schneller ausgeführt, da das Statement schon vorliegt und nur die Parameter eingesetzt werden müssen.
2. Angriffe auf die Datenbank (SQL-Injections) können verhindert werden, da die Gültigkeit der Parameter überprüft wird, bevor diese in der Anfrage verarbeitet werden.