9.6 KiB
Aufgabe 1
1. Tabelle Benutzer anlegen
CREATE TABLE benutzer (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(200) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
passwort VARCHAR(200) NOT NULL,
admin TINYINT(1) NOT NULL DEFAULT 0,
anzahlfehler INT NOT NULL DEFAULT 0,
anzahlanmeldungen INT NOT NULL DEFAULT 0,
letzteanmeldung DATETIME DEFAULT NULL,
letzterfehler DATETIME DEFAULT NULL
);
3. Admin anlegen
INSERT INTO benutzer (name, email, passwort, admin)
VALUES ('admin', 'admin@emensa.example', '2e2b6533a81bc15430cf65de46dc097eeb5ba70c', 1);
-- '2e2b6533a81bc15430cf65de46dc097eeb5ba70c' = 'passwort'
9. Transaktion
mysqli_begin_transaction und mysqli_commit sind Funktionen, die im Zusammenhang mit Transaktionen in MySQL verwendet werden. Eine Transaktion ist eine Sequenz von Datenbankoperationen, die als eine einzige logische Einheit ausgeführt wird. Transaktionen gewährleisten, dass entweder alle Operationen erfolgreich durchgeführt werden oder keine von ihnen, wenn ein Fehler auftritt. Dieses Konzept wird als ACID-Eigenschaften bekannt: Atomarität, Konsistenz, Isolation und Dauerhaftigkeit.
mysqli_begin_transaction: Diese Funktion startet eine neue Transaktion. Ab diesem Punkt können mehrere SQL-Operationen ausgeführt werden, die entweder alle gleichzeitig bestätigt (commited) oder abgebrochen (rolled back) werden. Das heißt, keine der Operationen ist für andere Verbindungen sichtbar, bis sie bestätigt werden.mysqli_commit: Diese Funktion wird verwendet, um alle Änderungen, die während der Transaktion gemacht wurden, zu bestätigen und dauerhaft in der Datenbank zu speichern. Nach dem Aufruf dieser Funktion werden alle Änderungen für andere Benutzer und Prozesse sichtbar.
Im Kontext des gegebenen PHP-Codes wird eine Transaktion verwendet, um die Sicherheit und Integrität der Datenbank zu erhöhen, wenn die Informationen eines Benutzers aktualisiert werden. Hier ist ein Überblick über die Abläufe in der Funktion anmelden:
- Eine Verbindung zur Datenbank wird hergestellt (
connectdb). - Es wird ein SQL-Select-Statement ausgeführt, um den Benutzer mit der spezifizierten E-Mail zu finden.
- Wenn kein Passwort für den Benutzer gesetzt ist, wird die Funktion frühzeitig mit einem Rückgabewert von 0 beendet.
- Wenn das Passwort des Benutzers übereinstimmt, werden die folgenden Schritte innerhalb einer Transaktion durchgeführt:
- Die Transaktion wird mit
mysqli_begin_transactionbegonnen. - Ein Update-Statement wird vorbereitet und ausgeführt, um die
letzteanmeldungauf die aktuelle Zeit undanzahlfehlerauf 0 zu setzen. - Ein weiteres Update-Statement wird vorbereitet und ausgeführt, um die
anzahlanmeldungenum eins zu erhöhen. - Die Transaktion wird mit
mysqli_commitabgeschlossen. - Sitzungsvariablen werden gesetzt, und die Funktion gibt 1 zurück, was eine erfolgreiche Anmeldung bedeutet.
- Die Transaktion wird mit
- Wenn das Passwort nicht übereinstimmt, wird ebenfalls eine Transaktion durchgeführt:
- Die Transaktion wird mit
mysqli_begin_transactionbegonnen. - Ein Update-Statement wird vorbereitet und ausgeführt, um
anzahlfehlerum eins zu erhöhen undletzterfehlerauf die aktuelle Zeit zu setzen. - Die Transaktion wird mit
mysqli_commitabgeschlossen. - Die Funktion gibt 0 zurück, was eine fehlgeschlagene Anmeldung bedeutet.
- Die Transaktion wird mit
Durch die Verwendung von Transaktionen wird sichergestellt, dass, wenn z.B. ein Fehler bei einer der Update-Operationen auftritt oder die Verbindung zur Datenbank verloren geht, keine teilweise aktualisierten Daten zurückbleiben, was zu Inkonsistenzen führen könnte. Stattdessen würde die gesamte Transaktion automatisch zurückgerollt oder abgebrochen werden (rollback), sodass die Datenbank in einem konsistenten Zustand bleibt.
Aufgabe 2
ALTER TABLE gericht ADD bildname varchar(200);
UPDATE gericht SET bildname = '01_bratkartoffel.jpg' WHERE id=1;
UPDATE gericht SET bildname = '03_bratkartoffel.jpg' WHERE id=3;
UPDATE gericht SET bildname = '04_tofu.jpg' WHERE id=4;
UPDATE gericht SET bildname = '09_suppe.jpg' WHERE id=9;
UPDATE gericht SET bildname = '06_lasagne.jpg' WHERE id=6;
UPDATE gericht SET bildname = '10_forelle.jpg' WHERE id=10;
UPDATE gericht SET bildname = '11_soup.jpg' WHERE id=11;
UPDATE gericht SET bildname = '12_kassler.jpg' WHERE id=12;
UPDATE gericht SET bildname = '13_reibekuchen.jpg' WHERE id=13;
UPDATE gericht SET bildname = '15_pilze.jpg' WHERE id=15;
UPDATE gericht SET bildname = '17_broetchen.jpg' WHERE id=17;
UPDATE gericht SET bildname = '19_mousse.jpg' WHERE id=19;
UPDATE gericht SET bildname = '20_suppe.jpg' WHERE id=20;
Aufgabe 3
- Composer installieren
- Download der Composer-Installer-EXE: Gehen Sie zur offiziellen Composer-Website getcomposer.org und klicken Sie auf den Button "Download" oder direkt auf "Composer-Setup.exe", um den Installer für Windows herunterzuladen.
- Ausführen des Installers: Führen Sie die heruntergeladene "Composer-Setup.exe"-Datei aus. Es wird ein Installationsassistent gestartet.
- Installationsoptionen: Folgen Sie den Anweisungen im Installationsassistenten. Der Assistent wird Sie nach dem Pfad zur PHP-Executable fragen. Wenn Sie PHP bereits installiert haben und die Umgebungsvariable
PATHgesetzt ist, kann der Assistent PHP automatisch finden. Falls nicht, müssen Sie den Pfad zur PHP-Executable (php.exe) manuell angeben. - Abschluss der Installation: Führen Sie den Installationsprozess durch. Am Ende können Sie die Option aktivieren, um die Befehlszeileneingabe zu ändern und den Pfad zu Composer in die Windows-Umgebungsvariable
PATHaufzunehmen. Damit wird Composer global zugänglich gemacht. - Überprüfung der Installation: Öffnen Sie nach Abschluss der Installation die Kommandozeile (CMD) oder PowerShell und geben Sie
composerein, um zu überprüfen, ob Composer erfolgreich installiert wurde. Wenn alles korrekt installiert wurde, sollten Informationen und verfügbare Befehle von Composer angezeigt werden.
- Abhängigkeiten laden
- Verzeichnis
./emensawechseln -
composer require monolog/monologausführen
- Verzeichnis
Aufgabe 4
-- a)
CREATE OR REPLACE
VIEW view_suppengerichte
AS select * from gericht
WHERE name LIKE '%suppe%';
-- b)
CREATE OR REPLACE
VIEW view_anmeldungen
AS select name,anzahlanmeldungen
from benutzer
ORDER BY anzahlanmeldungen DESC;
-- c)
CREATE OR REPLACE VIEW view_kategoriegerichte_vegetarisch
AS select gericht.name as gericht_name,
vegetarisch,
kategorie.name as katergorie_name
from gericht, kategorie
WHERE vegetarisch = 1 ;
Aufgabe 5
Was ist eine SQL-Prozedur
Eine SQL-Prozedur ist eine Sammlung von SQL-Anweisungen, die unter einem Namen gespeichert werden und bei Bedarf aufgerufen werden können. Die Struktur einer SQL-Prozedur umfasst in der Regel zusammengesetzte Anweisungen, die durch die Schlüsselwörter BEGIN und END begrenzt sind[1]. Gespeicherte Prozeduren ermöglichen es, komplexe Abläufe von Anweisungen vom Datenbank-Client auszuführen und sind somit ein eigenständiger Befehl, der eine Abfolge gespeicherter Befehle darstellt[2].
Diese Prozedur kann dann mithilfe des Befehls EXECUTE aufgerufen werden.
Gespeicherte Prozeduren bieten Vorteile wie die Wiederverwendbarkeit von Code, die Verbesserung der Leistung und die Reduzierung von Netzwerkverkehr, da die gespeicherten Prozeduren einmal erstellt und dann mehrmals aufgerufen werden können[2].
Quellen:
- https://www.ibm.com/docs/de/db2/11.1?topic=procedures-structure-sql
- https://de.wikipedia.org/wiki/Gespeicherte_Prozedur
- https://www.ibm.com/docs/de/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0008329.html
- https://learn.microsoft.com/de-de/sql/relational-databases/stored-procedures/create-a-stored-procedure?view=sql-server-ver16
- https://learn.microsoft.com/de-de/sql/relational-databases/stored-procedures/execute-a-stored-procedure?view=sql-server-ver16
Lösung
a)
CREATE PROCEDURE incrementAnzahlAnmeldungen (IN benutzerid INT)
BEGIN
UPDATE benutzer
SET anzahlanmeldungen = anzahlanmeldungen + 1
WHERE id = benutzerid;
END;
Die Prozedur die in M5_5.sql hinterlegt ist, muss einmal manuell ausgeführt werden.
c)
Die Anwendung die am naheliegensten sind, wären das Incrementieren der anzahlfehler analog zu Teilaufgabe (a).
Darüber hinaus könnten alle Queries als Stored Procedures von der
Emensa-Werbeseite aufgerufen werden und dies hätte mehrere Vorteile.
Zum einen hätte es einen Security-Vorteil, wenn alle Queries der Werbeseiten als
Proceduren gespeichert werden würedn. Dadruch wäre es nähmlich möglich alle
erwarteten Queries abzuspeichern und der Werbeseite nur die Berechtigung zum
Verwenden von Stored-Procedures zu geben. Dadurch kann nur noch in definierten
Schnittstellen mit der Dankenbank interagiert werden.
Darüber hinaus hat es wohl auch einen Vorteil gegenüber SQL-Injections.
Ein letzter Vorteil wäre, dass im PHP-Code einfach kurz die Prozedur aufgerufen
werdne kann statt lange Query-Strings zu haben.
Somit würde ich wahrscheinlich - alleine für die Lesbarkeit - diese Query in
eine Stored Procedure auslagern.
Ein weiterer Vorteil wäre, dass Stored-Procedures vor-opitimiert sind.
Darüber hinaus kann durch das Speichern der Queries in der Datenbank
Businesslogik "bewahren" unabhängig von git.
... Verkapselung....