From bc7b48f1d8321dc01d448cdeda025acf19e58e71 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Sun, 7 Sep 2025 16:24:04 +0200 Subject: initial commit --- lade_daten.php | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 lade_daten.php (limited to 'lade_daten.php') diff --git a/lade_daten.php b/lade_daten.php new file mode 100644 index 0000000..67134be --- /dev/null +++ b/lade_daten.php @@ -0,0 +1,101 @@ +. + */ + +// Die Funktion lade_daten liefert die Klassen und ihren Punktestand, sowie alle +// aufgetretenen Ereignisse in einem array zurück. +function lade_daten($config, $schuljahr, $jahrgang): array { + // Zusätzliche Parameter neben der Datenbankbeschreibung für den PDO Konstruktor. + $pdo_parameter = array(); + + // Behandle unterschiedliche Arten von Datenbanken + if ($config['dbtype'] == 'sqlite') { + $db_beschreibung = sprintf("sqlite:%s", $config['dbname']); + } else { + $db_beschreibung = sprintf('%s:host=%s;dbname=%s', $config['dbtype'], $config['dbhost'], $config['dbname']); + // MySql bspw. benötigt einen Nutzernamen und ein Passwort für die Verbindung + array_push($pdo_parameter, $config['dbuser']); + array_push($pdo_parameter, $config['dbpassword']); + } + + // Versuche die Verbindung zur Datenbank aufzubauen. Benötigte Parameter + // müssen in der richtigen Reihenfolge in dem $pdo_parameter array enthalten sein. + try { + $verbindung = new PDO($db_beschreibung, ...$pdo_parameter); + } catch(PDOException $e) { + // Die Verbindung ist fehlgeschlagen + error_log($e->getMessage()); + return "null; alert('Es konnte keine Verbindung zur Datenbank hergestellt werden, bitte gib deiner Lehrkraft Bescheid. Fehler: " . $e->getMessage() . "')"; + } + + // Die Verbindung war erfolgreich + + // PHP Klasse, die alle Daten einer Schulklasse enthält. + class Klasse { + public string $bezeichner; + public int $punkte; + public string $farbe; + + public function __construct(string $bezeichner, ?string $farbe) { + $this->bezeichner = $bezeichner; + $this->punkte = 0; + if (is_null($farbe)) { + // Die Standardfarbe ist ein leichtes Blau + $this->farbe = 'rgb(54, 162, 235)'; + } else { + $this->farbe = $farbe; + } + } + } + + // Bereite unsere Klassenabfrage vor. + // Dies verhindert SQL-Injection Angriffe, da die Parameter Schuljahr und + // Jahrgang über die URL kontrollierbar sind. + $klassen_abfrage = $verbindung->prepare('SELECT * FROM Klasse WHERE Schuljahr = ? AND Jahrgang = ?'); + $klassen_abfrage->bindValue(1, $schuljahr, PDO::PARAM_STR); + $klassen_abfrage->bindValue(2, $jahrgang, PDO::PARAM_INT); + $klassen_abfrage->execute(); + + // Die Klassen im passenden Jahrgang und Schuljahr + $klassen = array(); + foreach ($klassen_abfrage->fetchAll() as $zeile) { + $bezeichner = sprintf('%d%s', $zeile['Jahrgang'], $zeile['Bezeichner']); + $klasse = new Klasse($bezeichner, $zeile['Farbe']); + // Indiziere die Klassen mit dem jeweiligen Bezeichner + $klassen[$bezeichner] = $klasse; + } + + // Bereite die Ereignisabfrage vor. Sicherheitshinweis siehe: Klassenabfrage. + $ereignis_abfrage = $verbindung->prepare('SELECT * FROM Ereignis WHERE Schuljahr = ? AND Jahrgang = ?'); + $ereignis_abfrage->bindValue(1, $schuljahr, PDO::PARAM_STR); + $ereignis_abfrage->bindValue(2, $jahrgang, PDO::PARAM_INT); + $ereignis_abfrage->execute(); + + // Alle Ereignisse der ausgewählten Klassen + $ereignisse = $ereignis_abfrage->fetchAll(); + + // Schließe die Datenbank Verbindung + $verbindung = null; + + foreach ($ereignisse as $ereignis) { + $bezeichner = sprintf('%d%s', $ereignis['Jahrgang'], $ereignis['Bezeichner']); + // Aktualisiere den Punktestand nach dem Ereignis. + $klassen[$bezeichner]->punkte += $ereignis['Delta']; + } + + $daten = array(); + $daten['klassen'] = array_values($klassen); + $daten['ereignisse'] = $ereignisse; + return $daten; +} +?> -- cgit v1.2.3