studyklar
IProg · Klausur 3 · Aufgabe 6

PHP-Klasse ArtikelDB: Artikel anlegen und nach Warengruppe lesen

Zu einer Tabelle soll eine PHP-Klasse entstehen, die Artikel speichert und liest. Rechts füllt sich das leere Gerüst der Klasse Zeile für Zeile, links steht zu jedem Stück, warum es so aussieht. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

6) PHP DB-Klasse (15 Punkte)

Erstellen Sie zur folgenden DB-Tabelle in einer MySQL-DB eine sinnvolle PHP-Klasse:

CREATE TABLE Artikel (  artnr   CHAR(10) NOT NULL PRIMARY KEY,  name    VARCHAR(24) NOT NULL,  wgruppe INTEGER NOT NULL REFERENCES Warengruppe (id))

Die zu erstellende Klasse soll in MVC-Anwendungen sinnvoll eingesetzt werden können. Sehen Sie mindestens zwei Methoden vor: Eine zum Anlegen und eine zum Lesen aller Artikel einer Warengruppe. Außerdem gegebenenfalls notwendige Hilfsfunktionen.

Der Aufruf der Funktionen soll folgendermaßen geschehen (ohne Fehlerbehandlung):

$db = new mysqli( 'localhost', 'myUser', 'myPw', 'myDB' ); # Lesen$myArticles = ArtikelDB::findByWgruppe ($db, 4711); # Anlegen$a = new ArtikelDB ('A1234', 'Irgendwas', 456);$ok = $a -> insert ($db);

Darunter steht auf dem Blatt das Gerüst class ArtikelDB { } mit viel freiem Platz.

Gesucht ist eine Klasse ArtikelDB, die zwischen PHP und der Tabelle Artikel vermittelt. Eine solche Klasse heißt DB-Klasse oder Modellklasse: Sie gehört zum Modell (M) in MVC (Model, View, Controller). Das Modell kümmert sich um die Daten, die View um die Anzeige, der Controller um den Ablauf.

Zur Tabelle: NOT NULL heißt, die Spalte darf nicht leer bleiben. PRIMARY KEY (Primärschlüssel) heißt, jede Artikelnummer gibt es nur einmal. REFERENCES Warengruppe (id) macht wgruppe zum Fremdschlüssel: Der Wert muss eine vorhandene id der Tabelle Warengruppe sein.

Die vorgegebenen Aufrufe sind der wichtigste Hinweis. Sie legen Namen, Parameter und Rückgaben fest. Die Klasse muss genau zu ihnen passen.

Merke: Eine DB-Klasse bildet eine Tabelle ab. Werte kommen nie direkt in den SQL-Text, sondern über Platzhalter.
  1. Aus den Aufrufen ablesen, was die Klasse braucht.
  2. Attribute und Konstruktor schreiben.
  3. findByWgruppe: vorbereiten, binden, ausführen, Ergebnis lesen.
  4. insert: vorbereiten, binden, ausführen.
  5. Prüfen, ob die Klasse in MVC passt.

Was die Aufrufe verraten

$db = new mysqli( 'localhost', 'myUser', 'myPw', 'myDB' ); # Lesen$myArticles = ArtikelDB::findByWgruppe ($db, 4711); # Anlegen$a = new ArtikelDB ('A1234', 'Irgendwas', 456);$ok = $a -> insert ($db);

ArtikelDB::findByWgruppe(…) steht mit :: direkt hinter dem Klassennamen. Das ist eine statische Methode (static): Man ruft sie ohne Objekt auf. Sie liefert $myArticles, also mehrere Artikel. Am besten ein Array aus ArtikelDB-Objekten.

new ArtikelDB('A1234', 'Irgendwas', 456) verlangt einen Konstruktor mit drei Werten, in der Reihenfolge der Spalten: Artikelnummer, Name, Warengruppe.

$a->insert($db) ruft eine Methode auf dem Objekt $a auf. Sie speichert genau diesen Artikel. Ihr Ergebnis heißt $ok, also true oder false.

$db ist die Verbindung zur Datenbank. mysqli („MySQL improved“) ist die PHP-Schnittstelle zu MySQL. Beide Methoden bekommen die Verbindung übergeben, die Klasse öffnet selbst keine.

Ein Attribut je Spalte

class ArtikelDB {  public $artnr;  public $name;  public $wgruppe;

Ein Objekt der Klasse steht für eine Zeile der Tabelle. Darum bekommt es je Spalte ein Attribut, mit demselben Namen wie die Spalte: $artnr, $name, $wgruppe.

public heißt: Auch Code außerhalb der Klasse darf sie lesen, etwa die View, die den Namen ausgibt. Die Musterlösung erlaubt auch private mit Getter-Methoden.

Aus Skript 07, Folie 9: Häufig gibt es eine Klasse pro Tabelle, mit einheitlichen Namen: zum Lesen findBy…, zum Ändern update, insert, delete.
Noch 8 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

CREATE TABLE Artikel (  artnr   CHAR(10) NOT NULL PRIMARY KEY,  name    VARCHAR(24) NOT NULL,  wgruppe INTEGER NOT NULL REFERENCES Warengruppe (id))
class ArtikelDB {                                }
LegendeGegeben: die Tabelle Artikel und das leere Gerüst der Klasse. Es füllt sich Schritt für Schritt.