From 713d5059b7498abaa5ba6784fbf4048a0f45e15c Mon Sep 17 00:00:00 2001 From: S170H <64917343+S170H@users.noreply.github.com> Date: Thu, 21 Dec 2023 16:41:05 +0100 Subject: [PATCH] M5 5 fertig --- M5/Dossier/M5.md | 53 +++++++++++++++++++++-- M5/beispiele/M5_5.sql | 6 +++ M5/emensa/models/benutzer.php | 15 +++++-- M5/emensa/storage/logs/anmeldung.txt | 1 + M5/emensa/storage/logs/werbeseite_log.txt | 2 + 5 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 M5/beispiele/M5_5.sql diff --git a/M5/Dossier/M5.md b/M5/Dossier/M5.md index f856a53..06a26f6 100644 --- a/M5/Dossier/M5.md +++ b/M5/Dossier/M5.md @@ -16,7 +16,8 @@ CREATE TABLE benutzer ( ## 3. Admin anlegen ```sql INSERT INTO benutzer (name, email, passwort, admin) -VALUES ('admin', 'admin@emensa.example', 2e2b6533a81bc15430cf65de46dc097eeb5ba70c', 1); +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. @@ -49,5 +50,51 @@ Durch die Verwendung von Transaktionen wird sichergestellt, dass, wenn z.B. ein 4. **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 `PATH` aufzunehmen. Damit wird Composer global zugänglich gemacht. 5. **Überprüfung der Installation:** Öffnen Sie nach Abschluss der Installation die Kommandozeile (CMD) oder PowerShell und geben Sie `composer` ein, um zu überprüfen, ob Composer erfolgreich installiert wurde. Wenn alles korrekt installiert wurde, sollten Informationen und verfügbare Befehle von Composer angezeigt werden. 2. Abhängigkeiten laden - 1. Verzeichnis ``./emensa`` wechseln - 2. ``composer require monolog/monolog`` ausführen \ No newline at end of file + 1. Verzeichnis `./emensa` wechseln + 2.  `composer require monolog/monolog`  ausführen + +# 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: +1. https://www.ibm.com/docs/de/db2/11.1?topic=procedures-structure-sql +2. https://de.wikipedia.org/wiki/Gespeicherte_Prozedur +3. https://www.ibm.com/docs/de/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0008329.html +4. https://learn.microsoft.com/de-de/sql/relational-databases/stored-procedures/create-a-stored-procedure?view=sql-server-ver16 +5. https://learn.microsoft.com/de-de/sql/relational-databases/stored-procedures/execute-a-stored-procedure?view=sql-server-ver16 + +## Lösung +### a) +``` sql +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.... diff --git a/M5/beispiele/M5_5.sql b/M5/beispiele/M5_5.sql new file mode 100644 index 0000000..b834273 --- /dev/null +++ b/M5/beispiele/M5_5.sql @@ -0,0 +1,6 @@ +CREATE PROCEDURE incrementAnzahlAnmeldungen(IN benutzerid INT) +BEGIN + UPDATE benutzer + SET anzahlanmeldungen = anzahlanmeldungen + 1 + WHERE id = benutzerid; +END; \ No newline at end of file diff --git a/M5/emensa/models/benutzer.php b/M5/emensa/models/benutzer.php index 302566a..263b19d 100644 --- a/M5/emensa/models/benutzer.php +++ b/M5/emensa/models/benutzer.php @@ -7,7 +7,8 @@ function anmelden(string $email, string $passwort) { $link = connectdb(); - $sql = "SELECT * FROM benutzer WHERE (`email` = '$email')"; + $sql = "SELECT * FROM benutzer + WHERE (`email` = '$email')"; $result = $link->query($sql); $row = $result->fetch_assoc(); @@ -17,10 +18,14 @@ function anmelden(string $email, string $passwort) session_start(); mysqli_begin_transaction($link); - $sql = "UPDATE benutzer SET letzteanmeldung = current_time, anzahlfehler = 0 WHERE email = '$email'"; + $sql = "UPDATE benutzer + SET letzteanmeldung = current_time, anzahlfehler = 0 + WHERE email = '$email'"; $link->query($sql); - $sql = "UPDATE benutzer SET anzahlanmeldungen = anzahlanmeldungen + 1 WHERE id = " . $row['id']; + + // $sql = "UPDATE benutzer SET anzahlanmeldungen = anzahlanmeldungen + 1 WHERE id = " . $row['id']; + $sql = "CALL incrementAnzahlAnmeldungen(" . ($row['id']) . ")"; $link->query($sql); mysqli_commit($link); @@ -34,7 +39,9 @@ function anmelden(string $email, string $passwort) mysqli_begin_transaction($link); - $sql = "UPDATE benutzer SET anzahlfehler = anzahlfehler+1, letzterfehler = current_time WHERE email = '$email'"; + $sql = "UPDATE benutzer + SET anzahlfehler = anzahlfehler+1, letzterfehler = current_time + WHERE email = '$email'"; $link->query($sql); mysqli_commit($link); diff --git a/M5/emensa/storage/logs/anmeldung.txt b/M5/emensa/storage/logs/anmeldung.txt index ab4d1d3..96cbd98 100644 --- a/M5/emensa/storage/logs/anmeldung.txt +++ b/M5/emensa/storage/logs/anmeldung.txt @@ -1,3 +1,4 @@ [2023-12-20T16:18:29.055116+00:00] anmeldung.WARNING: Anmeldung fehlgeschlagen! [] [] [2023-12-20T16:18:56.231427+00:00] anmeldung.INFO: Anmeldung erfolgreich! [] [] [2023-12-20T16:19:05.370972+00:00] anmeldung.INFO: Abmeldung erfolgreich! [] [] +[2023-12-21T14:29:55.917076+00:00] anmeldung.INFO: Anmeldung erfolgreich! [] [] diff --git a/M5/emensa/storage/logs/werbeseite_log.txt b/M5/emensa/storage/logs/werbeseite_log.txt index 78bc0a5..c078c19 100644 --- a/M5/emensa/storage/logs/werbeseite_log.txt +++ b/M5/emensa/storage/logs/werbeseite_log.txt @@ -1,3 +1,5 @@ [2023-12-20T16:17:52.471118+00:00] werbeseite_log.INFO: werbeseite aufgerufen! [] [] [2023-12-20T16:18:56.302288+00:00] werbeseite_log.INFO: werbeseite aufgerufen! [] [] [2023-12-20T16:19:05.430442+00:00] werbeseite_log.INFO: werbeseite aufgerufen! [] [] +[2023-12-21T14:22:30.892716+00:00] werbeseite_log.INFO: werbeseite aufgerufen! [] [] +[2023-12-21T14:29:56.044899+00:00] werbeseite_log.INFO: werbeseite aufgerufen! [] []