. */ // 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; } ?>