studyklar
IProg · Klausur 2 · Aufgabe 6

PHP-Modellklasse BewertungDB mit mysqli

Eine PHP-Klasse soll Bewertungen von Gerichten in der Datenbank speichern und wieder lesen. Teil (a) füllt die Lücken der Klasse BewertungDB, Teil (b) benutzt sie. Rechts steht der Rahmencode der Klausur; Schritt für Schritt füllt sich eine Lücke nach der anderen. Mit Weiter geht es voran.

Die Aufgabe

6) PHP DB-Klasse (12 Punkte)

Im Folgenden finden sie eine rudimentäre PHP-Modell-Klasse basierend auf mysqli. Diese Klasse soll die Verwaltung von Bewertungen ermöglichen. Zum Speichern der Daten wird die folgende Tabelle genutzt:

CREATE TABLE Bewertung (  gid      INTEGER NOT NULL, -- Gericht  punkte   INTEGER NOT NULL, -- Bewertung  txt      VARCHAR(50) -- Kommentar)

a) Die zu erstellende Klasse soll in MVC-Anwendungen sinnvoll eingesetzt werden können. Ergänzen Sie den Rahmencode auf der nächsten Seite sinnvoll. Wichtige fehlende Stellen sind mit XXX markiert. (Der Rahmencode steht rechts.)

b) Nutzen Sie Ihre in Teil a) erstellte Klasse nun. Betrachten Sie dazu die Klasse auf der Folgeseite – und ergänzen Sie dann den hier angegebenen Programmcode (ohne Fehlerbehandlung). Es soll zunächst eine Bewertung angelegt werden. Anschließend werden die Bewertungen zu Gerichten mit mehr als 4 Punkten gesucht:

$db = new mysqli( 'localhost', 'myUser', 'myPw', 'myDB' ); # XXX Anlegen einer neuen Bewertung#     mit 3 Punkten und Kommentar "naja" für Gericht mit gid=42   # XXX Lesen der Bewertungen mit mindestens 4 und max. 5 Punkten$ergebnis = 

Gegeben ist eine Tabelle Bewertung mit drei Spalten: die Nummer des Gerichts (gid), die Punkte und ein Kommentar (txt). Gesucht ist eine PHP-Klasse, die diese Tabelle für den Rest der Anwendung verwaltet.

mysqli ist die PHP-Schnittstelle zu einer MySQL-Datenbank. Das Objekt $db ist die offene Verbindung; jede Methode bekommt sie als Parameter.

In (a) füllt man die mit XXX markierten Lücken. In (b) schreibt man zwei Stellen Code, die die Klasse benutzen. Für die ganze Aufgabe gibt es 12 Punkte.

Merke: Werte aus Benutzereingaben gehören nie direkt in den SQL-Text. Man schreibt ein Prepared Statement mit Platzhaltern und bindet die Werte danach.
  1. Aufbau der Klasse: ein Attribut je Spalte.
  2. findBetweenPunkte: SQL, Parameter binden, Ergebnis lesen.
  3. Der Konstruktor als „weitere erforderliche Methode“.
  4. insert: SQL, vorbereiten und binden, Statement schließen.
  5. Teil (b): ein Objekt anlegen, speichern, Bewertungen suchen.

Eine Klasse für eine Tabelle

class BewertungDB {  public $gid;  public $punkte;  public $txt;

In einer MVC-Anwendung (Model, View, Controller: Daten, Anzeige, Steuerung) gehört diese Klasse zum Model. Nur sie spricht mit der Tabelle Bewertung. Controller und Seiten rufen ihre Methoden auf und schreiben selbst kein SQL.

Jede Spalte der Tabelle wird ein Attribut: $gid, $punkte, $txt. Ein Objekt der Klasse ist also genau eine Bewertung, eine Zeile der Tabelle. Diese Zeilen gibt der Rahmen schon vor.

Aus Skript 07, Folie 9: Auf der Modellebene gibt es meist eine Klasse pro Tabelle. Lesende Methoden heißen findBy…, ändernde insert, update, delete.

findBetweenPunkte: das SQL mit Platzhaltern

  public static function findBetweenPunkte($db, $min, $max) {    # XXX SQL Statement    $sql = 'SELECT * FROM Bewertung WHERE punkte BETWEEN ? AND ?';    $stmt = $db->prepare($sql);

Gesucht sind alle Bewertungen, deren Punkte zwischen $min und $max liegen. In SQL heißt das BETWEEN ? AND ?; die Grenzen zählen mit.

Statt der Werte stehen zwei Fragezeichen im Text. Das sind Platzhalter. Die Datenbank prüft zuerst den SQL-Text (prepare in Zeile 9) und bekommt die Werte erst danach. So kann ein Wert nie den Befehl verändern: Das schützt vor SQL-Injection, bei der ein Angreifer eigenes SQL in eine Eingabe schreibt.

Aus Skript 06, Folie 30: Wichtigster Vorteil von Prepared Statements ist der Schutz vor SQL-Injection.
Noch 10 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(a) Die Klasse

Lücken im Rahmencode füllen

class BewertungDB {  public $gid;  public $punkte;  public $txt;  // Alle Bewertungen deren Punkte zwischen $min und $max liegen  public static function findBetweenPunkte($db, $min, $max) {    # 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();     return $erg;  }  # XXX Ggf. weitere erforderliche Methoden:     }
LegendeZeilen des SchrittsDer Rahmencode der Klausur: Die Lücken sind noch leer, sie füllen sich Schritt für Schritt.