M5 5 fertig

This commit is contained in:
S170H
2023-12-21 16:41:05 +01:00
parent 67e88a8185
commit 713d5059b7
5 changed files with 70 additions and 7 deletions

View File

@@ -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
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....

6
M5/beispiele/M5_5.sql Normal file
View File

@@ -0,0 +1,6 @@
CREATE PROCEDURE incrementAnzahlAnmeldungen(IN benutzerid INT)
BEGIN
UPDATE benutzer
SET anzahlanmeldungen = anzahlanmeldungen + 1
WHERE id = benutzerid;
END;

View File

@@ -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);

View File

@@ -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! [] []

View File

@@ -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! [] []