studyklar
IProg · Klausur 1 · Aufgabe 6

PHP-Klasse TerminDB: Termine suchen und anlegen

Eine Klasse soll Termine aus der Datenbank lesen und neue Termine speichern. Gegeben ist ein Rahmen mit Lücken. Rechts steht der Code so weit, wie der aktuelle Schritt ihn gefüllt hat. Mit Weiter geht es Lücke für Lücke voran.

Die Aufgabe

Aufgabe 6: PHP DB-Klasse (12 Punkte)

Im Folgenden finden Sie eine rudimentäre PHP-Modell-Klasse basierend auf mysqli. Sie beruht auf der Terminkalender-Aufgabe 4 und soll die Verwaltung von Terminen ermöglichen. Zum Speichern der Daten wird die folgende Tabelle genutzt:

CREATE TABLE Termine (  tid    INTEGER NOT NULL,  -- Termin-ID  datum  DATE NOT NULL,     -- Datum  txt    VARCHAR(50),       -- Kommentar  rid    INTEGER NOT NULL REFERENCES RUBRIKEN(rid))

a) Die zu erstellende Klasse soll in MVC-Anwendungen sinnvoll eingesetzt werden können. Ergänzen Sie den Rahmencode sinnvoll. Wichtige fehlende Stellen sind mit XXX markiert.

class TerminDB {  public $tid;  public $datum;  public $txt;  public $rid;   // Alle Termine der Rubrik $rid ab dem Datum $datum  public static function getTerminFromRubrikDatum($db, $rid, $datum) {    # XXX SQL Statement    $sql =     $stmt = $db->prepare($sql);    # XXX Parameter binden     $stmt->execute();    # XXX Ergebnis lesen     $stmt->close();    return $erg;  }   public function insert($db) {    # XXX SQL Statement    $sql =     # XXX Daten einfügen     $erg = $stmt->execute();    # XXX Statement schließen     return $erg;  }   # XXX Ggf. weitere erforderliche Methoden: }

b) Nutzen Sie Ihre in Teil a) erstellte Klasse nun. Ergänzen Sie den folgenden Programmcode (ohne Fehlerbehandlung). Es soll zunächst ein Termin angelegt werden. Anschließend werden die Termine einer Rubrik ab einem Datum gesucht:

$db = new mysqli('localhost', 'myUser', 'myPw', 'myDB'); # XXX Anlegen eines neuen Termins: tid=7 am 15.07.2026,#     Text "Klausur IProg", in der Rubrik mit rid=3  # XXX Lesen aller Termine der Rubrik 3 ab dem 01.07.2026$ergebnis = 

Die Aufgabe ist aus dem Gedächtnisprotokoll nachgebaut. Das Protokoll nennt nur die Tabelle, die 12 Punkte und: „Wie in der Probeklausur gab es hier Rahmencode zu ergänzen und dann die gebaute Klasse anzuwenden.“ Den Rahmencode haben wir darum nach Klausur 2, Aufgabe 6 gebaut. Den Namen der Suchmethode nennt das Protokoll in Aufgabe 7: getTerminFromRubrikDatum. Im Protokoll fehlt in der Tabelle das Komma hinter txt, und die Rubrik-Tabelle heißt einmal RUBRIK, einmal RUBRIKEN. Wir ergänzen das Komma und nehmen RUBRIKEN wie in Aufgabe 4.

In eigenen Worten: Die Klasse TerminDB ist das Modell für die Tabelle Termine: Nur sie spricht mit der Datenbank. Die Suche liefert alle Termine einer Rubrik ab einem Datum. insert speichert einen Termin. In Teil b ruft man beides auf.

Aus Klausur 2, Aufgabe 6 („PHP-Modellklasse BewertungDB mit mysqli“): Dieselbe Aufgabe mit der Tabelle Bewertung: Suche mit findBetweenPunkte, Speichern mit insert, Konstruktor bei den weiteren Methoden.
Merke: Kein Wert aus einer Variablen wird direkt in den SQL-Text geschrieben. An seiner Stelle steht ein ?, den Wert setzt bind_param ein. Das heißt Prepared Statement und schützt vor SQL-Injection.
  1. Den Rahmen lesen: Attribute, zwei Methoden.
  2. Suche: SQL, Parameter binden, Ergebnis lesen.
  3. insert: SQL, Daten binden, Statement schließen.
  4. Den fehlenden Konstruktor ergänzen.
  5. Teil b: Termin anlegen, Termine suchen.

Den Rahmen lesen

SpalteTyp in SQLAttribut
tidINTEGER$tid
datumDATE$datum
txtVARCHAR(50)$txt
ridINTEGER$rid

Im MVC-Modell (Model, View, Controller) liegt jeder Datenbankzugriff im Modell. Üblich ist eine Klasse je Tabelle. TerminDB gehört zur Tabelle Termine.

Die vier Attribute heißen wie die vier Spalten. Ein Objekt der Klasse ist also genau ein Termin, eine Zeile der Tabelle.

Die Suche ist static: Man ruft sie ohne Objekt auf, denn vor der Suche gibt es noch keinen Termin. insert ist nicht statisch: Es speichert das Objekt, auf dem man es aufruft. Beide bekommen die Verbindung $db als Parameter; die Klasse öffnet selbst keine Verbindung.

Aus Skript 07, Folie 9: Modellebene: häufig eine Klasse pro Tabelle, einheitliche Namen, zum Lesen findBy…, zum Ändern insert, update, delete.

Die SQL-Abfrage der Suche

    $sql = 'SELECT tid, datum, txt, rid FROM Termine'         . ' WHERE rid = ? AND datum >= ? ORDER BY datum';

Gesucht sind die Termine mit der Rubrik $rid und einem Datum ab $datum. Beide Bedingungen gelten zugleich, darum AND. Statt der Werte stehen zwei Fragezeichen im SQL-Text.

datum >= ? heißt „am Datum oder später“. So zeigt die Seite aus Aufgabe 4 nur aktuelle Termine. ORDER BY datum sortiert sie nach Datum. Das ist nicht verlangt, aber für einen Kalender sinnvoll.

Die Spalten stehen ausdrücklich da statt *. So steht ihre Reihenfolge fest, und die braucht der nächste Schritt beim Lesen.

Noch 9 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1

class TerminDB {  public $tid;  public $datum;  public $txt;  public $rid;   // Alle Termine der Rubrik $rid ab dem Datum $datum  public static function getTerminFromRubrikDatum($db, $rid, $datum) {    # XXX SQL Statement    $sql =     $stmt = $db->prepare($sql);    # XXX Parameter binden     $stmt->execute();    # XXX Ergebnis lesen     $stmt->close();    return $erg;  }   public function insert($db) {    # XXX SQL Statement    $sql =     # XXX Daten einfügen     $erg = $stmt->execute();    # XXX Statement schließen     return $erg;  }   # XXX Ggf. weitere erforderliche Methoden: }
LegendeDer Rahmencode von Teil a: die Lücken hinter den XXX-Kommentaren sind noch leer.