***** Übungen: PHP/OOP - Getter und Setter ***** PHP/OOP_6-0: Setter und Getter - Kuh Programmieren Sie die Klasse Kuh wie im Bild *LINK 10phpoop/oopphp06-bild-kuh_SEHREINFACH.png LINK* (wenn Sie sich schon etwas sicherer fühlen, nehmen Sie bitte *LINK 10phpoop/oopphp06-bild-kuh.png LINK* ). Probieren Sie die Getter und Setter aus, indem Sie zwei neue Objekte der Klasse instanziieren und die Getter/Setter-Methoden verwenden. @@@ PHP/OOP_6-1: Setter und Getter - Kunde Gegeben sei folgende Klasse: --- PHP-Code Start --- class Kunde { // Attribute private $kontostand; private $geheimzahl; // Methoden // Getter: Kontostand //... // Setter: Kontostand // ... // Getter: Geheimzahl // ... // Setter: Geheimzahl // ... } $schmitt = new Kunde; // Kontostand verändern $schmitt->setKontostand(1000); // Kontostand ausgeben $schmitt->getKontostand(); // Geheimzahl verändern $schmitt->setGeheimzahl(1321); // Geheimzahl überprüfen $eingabeausBankingFormular = 1324; // auf 1321 ändern, // um funktionalität zu überprüfen if ($schmitt->getGeheimzahl() == $eingabeausBankingFormular) { echo "zugang gewährt!"; } else { echo "zugang verweigert"; } --- Code Ende --- Schreiben Sie die entsprechenden Getter und Setter. Überprüfen Sie die Lauffähigkeit des Skripts. @@@ PHP/OOP_6-2: Setter und Getter: Login-Routine Online-Banking - Übersicht Sie sollen eine objektorientierte Login-Routine für ein Online-Banking-System schreiben, die folgende Anforderungen erfüllt: 1) Über ein Web-Formular gibt der Kunde seinen Nachnamen und seine Geheimzahl ein. 2) Name und Geheimzahl werden mit aus einer Datenbank geholt und auf Übereinstimmung geprüft. Bei fehlerhaften Eingaben erhält der Kunde eine entsprechende Fehlermeldung ("Kunde nicht in DB vorhanden" usw.). 3) Wenn der Kunde sich korrekt eingeloggt hat, erhält er die Meldung "Zugang gewährt" und die Ausgabe seines Kontostands. Programmiertechnische Anforderungen: - Erstellen Sie die Klassen wie in Abb. *LINK 10phpoop/oopphp06-bild-login_onlinebanking.png LINK* - Empfehlung: Beim Instanziieren eines neuen Kunden greifen Sie im Konstruktor mittels der Klasse Dbconnect auf die DB zu und lesen die gewünschten Daten aus (nämlich die Geheimzahl, die zum Namen gehört, der in das Formular eingegeben wurde). @@@ PHP/OOP_6-2_a): Login-Routine, Schritt a) - Klasse "Kunde" erzeugen Erzeugen Sie wie im Klassendiagramm *LINK 10phpoop/oopphp06-bild-login_onlinebanking.png LINK* dargestellt eine Klasse Kunde (Dateiname: kunde.class.php). Der Konstruktor wird angelegt, bleibt aber erst mal leer. Testen Sie die Lauffähigkeit, indem Sie - ein neues Objekt $kundeSchmitt erzeugen; - den Kontostand von $kundeSchmitt mit dem Setter setKontostand auf 1000 setzen; - sich den Kontostand von $kundeSchmitt mit dem Getter getKontostand ausgeben lassen. @@@ PHP/OOP_6-2_b): Login-Routine, Schritt b) - Datenbank "kunden" anlegen Erstellen Sie eine MySQL-Tabelle "kunden" mit vier Feldern: - id (int, AI, PK) - name (varchar) - geheimzahl (int) - kontostand (float) Tragen Sie zwei Kunden mit einfachen Zugangsdaten testweise ein (z.B. "schmitt", geheimzahl 1111). @@@ PHP/OOP_6-2_c): Login-Routine, Schritt c) - Datenbankverbindung öffnen Erstellen Sie die Klasse Dbconnect (Dateiname: dbconnect.class.php). Die kann so aussehen: --- PHP-Code Start --- --- Code Ende --- Im Konstruktor der Klasse Kunde öffnen Sie die Datenbankverbindung, indem Sie ein neues Objekt $neueDbVerbindung o.ä. instanziieren und für das Objekt die Methode dbVerbindungOeffnen ausführen. Vergessen Sie nicht, die Klasse Dbconnect an geeigneter Stelle einzubinden (z.B. zu Beginn des Konstruktors). (Hinweis: Sie könnten die DB-Verbindung natürlich auch ohne eigene Klasse direkt im Konstruktor von "Kunde" herstellen. Wartungsfreundlicher und übersichtlicher ist es jedoch, wenn die DB-Verbindung eine eigene Klasse erhält.) Für Fortgeschrittene: Damit Sie nicht jedesmal ein eigenes Objekt von Dbconnect erzeugen müssen, können Sie mit einer statischen Methode arbeiten (diese Methode kann verwendet werden, ohne dass ein dazugehöriges Objekt existiert). Dazu definieren Sie die Methode dbVerbindungOeffnen wie folgt: --- PHP-Code Start --- public static function dbVerbindungOeffnen() --- Code Ende --- Dann können Sie die statische Methode aufrufen, ohne ein Objekt zu instanziieren: --- PHP-Code Start --- Dbconnect::db_verbindung_oeffnen(); --- Code Ende --- @@@ PHP/OOP_6-2_d): Login-Routine, Schritt d) - Formular erzeugen Erzeugen Sie in einer Datei index.php eine Oberfläche mit zwei Eingabefeldern, wo der Kunde seinen Namen und seine Geheimzahl eingeben kann. Fangen Sie in index.php Fehlermeldungen (nicht definiertes $_POST-Array) ab. Lesen Sie in index.php das $_POST-Array aus und weisen Sie entsprechende Variablen zu (z.B. $geheimzahl für die eingegebene Geheimzahl). Testen Sie die Lauffähigkeit, in dem nach dem Absenden des Formulars eine Ausgabe wie "Sie haben folgende Werte eingegeben: Geheimzahl - 1234, Name - Smith" erzeugt wird. @@@ PHP/OOP_6-2_e): Login-Routine, Schritt e) - Daten aus DB holen Wenn das Formular erfolgreich abgeschickt wurde, erzeugen Sie ein neues Objekt namens $kunde. Diesem Objekt geben Sie den in das Formular eingetragenen Namen als Parameter mit, z.B. --- PHP-Code Start --- $kunde = new Kunde($name) --- Code Ende --- Führen Sie im Konstruktor der Klasse Kunde eine MySQL-Abfrage aus, mit der die Geheimzahl ermittelt wird, die zum eingegebenen Namen gehört. Für die MySQL-Abfrage können Sie Ihre Kenntnisse in 08phpmysql/phpmysql03_mysql_query-abfragenausfuehren.pdf auffrischen. Als Ergebnis der Abfrage erhalten Sie die Geheimzahl des Objekts. Weisen Sie diese Geheimzahl der Objektvariablen $this->geheimzahl zu. Für Fortgeschrittene: Sie können bereits an dieser Stelle mit mysql_num_rows überprüfen, ob es zum eingegebenen Namen überhaupt einen Kunden in der DB gibt und eine entsprechende Fehlermeldung definieren. @@@ PHP/OOP_6-2_f): Login-Routine, Schritt f) - Daten abgleichen Jetzt müssen Sie nur noch in index.php überprüfen, ob die Geheimzahl des Kunden mit der ins Formular eingegebenen Geheimzahl übereinstimmt. Ist das der Fall, können Sie den Zugang gewähren und den Kontostand ausgeben (den Sie mit $kunde->getKontostand auslesen können). Stimmt die in der DB vorhandene Geheimzahl nicht mit der ins Formular eingegebenen überein, muss eine Fehlermeldung ausgegeben werden. @@@ PHP/OOP_6-2_g): Login-Routine, Schritt g) - Ausbau (fortgeschritten) Ergänzen Sie das vorhandene Programm: - Der Kontostand soll in der DB gespeichert sein und wird aus der DB geholt (statt wie bisher als Initialwert). - Es gibt zwei zusätzliche Methoden "einzahlen" und "abheben", die den Kontostand entsprechend verändern und in der DB festhalten. Außerdem wird eine entsprechende Meldung ausgegeben ("Sie haben 200 Euro abgehoben. Ihr neuer Kontostand beträgt nun xy Euro."). Es empfiehlt sich, die Meldung mit einer eigenen Methode auszugeben (meldungAusgeben); die Meldung (oder ihre einzelnen Bestandteile) wird/werden in der jeweiligen Methode definiert und dann an meldungAusgeben übergeben (-> vgl. MVC-Architektur). - Nach dem Einloggen kann der User also wählen "einzahlen", "auszahlen" und "Kontostand abfragen". Dazu muss Ihr Skript auf der Zielseite aber noch wissen, wer eingeloggt ist. Sie haben mehrere Möglichkeiten, z.B. --- Übergabe des Formulars mit einem versteckten Feld (Google-Suche: "html form hidden field") --- Nutzung von Sessions (Google-Suche: "php session"). Hier wäre es sinnvoll, wenn die Session das Objekt übergeben würde; das müssen Sie aber in eine für Sessions lesbare Repräsentation umwandeln, hierzu benutzen Sie serialize() bzw. unserialize. Das kann so funktionieren: --- PHP-Code Start --- // Objekt in Session speichern $objekt = serialize($objekt); $_SESSION['objekt'] = $objekt; // In Session gespeichertes Objekt in ein für PHP lesbares Objekt umwandeln $objekt = unserialize($_SESSION['objekt']); --- Code Ende --- Benutzen Sie das php-Manual unter php.net/manual (um weitere Infos zu serialize() bzw. unserialize() zu bekommen). @@@ PHP/OOP_6-2_h): Login-Routine: Vervollständigen Benutzen Sie für diese Übung die Dateien in diesem Verzeichnis (Materialsammlung): 10phpoop/oopphp06-projekt_login-routine-unvollstaendig 1) Legen Sie ein neues Netbeans-Projekt aus diesem Verzeichnis an. Importieren Sie die Kundendaten (kunden_db.sql) mittels phpmyadmin in eine DB. Kontrollieren Sie die Zugangsdaten zur Datenbank (db_connect.php). 2) Sie müssen drei Zeilen ergänzen: - in formular.php Zeile 18 (IF-Abfrage) - in kunde.class.php Zeile 22 (SQL-Statement definieren) - in kunde.class.php Zeile 39 (WHILE-Schleife, um Daten aus DB auszulesen) @@@ PHP/OOP_6-3a: Setter und Getter - Rechnung - Schreiben Sie die Klasse, die im Bild *LINK 10phpoop/oopphp06-bild-rechnung-klasse.png LINK* dargestellt ist. Speichern Sie unter rechnung.class.php - Instanziieren Sie in index.php ein neues Objekt $rechnung. Sie müssen dazu ganz oben im Dokument die im letzten Schritt erstellte Klasse mit require_once einbinden. - Setzen Sie mit den Settern die Rechnungsumme auf 253 und die Rabattstufe auf 20 (das bedeutet: 20% Rabatt). - Holen Sie mit den Gettern die Rabattstufe und den Rechnungsbetrag des Objekts und berechnen Sie den Endbetrag. Geben Sie den Endbetrag in der Form "Rechnungsbetrag: 253,00; Rabatt: 50,60; Zahlungsbetrag: 202,40 Euro." aus. @@@ PHP/OOP_6-3b: Setter und Getter mit Oberfläche Benutzen Sie für diese Aufgabe Ihr Skript von 6_3a. - Erstellen Sie ein HTML-Formular, wo Rechnungsbetrag + Rabattstufe eingegeben werden können (mit Button: "Daten speichern und Endbetrag berechnen"). - Nach Eingabe der Daten und Absenden des Formulars soll die oben genannte Ausgabe erfolgen. @@@ PHP/OOP_6-3c: Rechnung: Datenbankanbindung (schwer!) Erweitern Sie Aufgabe 6-3 um diese Möglichkeiten: - Nach Klick auf "Daten speichern" werden Rechnungsbetrag und Rabattstufe in eine Datenbanktabelle geschrieben (die Rechnung bekommt eine automatische Nummer über ein Feld "id" mit AUTO_INCREMENT). - Erstellen Sie ein weiteres Formular (am besten auf der gleichen Seite), wo eine Rechnungsnummer eingegeben werden kann; nach Klick auf den Button "Rechnungsdaten ausgeben" werden die zur Rechnungsnummer zugehörigen Daten ausgegeben. Tipps/Hinweise: - Erstellen Sie für die DB_Verbindung eine eigene Klasse (dbconnect.class.php) - Beispiel unten. Wenn Sie die DB-Verbindung öffnen wollen, instanziieren Sie ein entsprechendes Objekt und benutzen die entsprechende Methode (im Beispiel unten: db_verbindung_oeffnen()). - Um zu überprüfen, ob schon eine Rechnung mit der eingegebenen Nummer vorhanden ist, benutzen Sie mysql_num_rows ( http://php.net/manual/de/function.mysql-num-rows.php ). --- PHP-Code Start --- --- Code Ende --- @@@ PHP/OOP_6-4: Setter/Getter automatisch erzeugen Erzeugen Sie die Klasse "Kunde" entsprechend dem Klassendiagramm *LINK 10phpoop/oopphp06-bild-kunde-klasse.png LINK* Benutzen Sie dabei die Möglichkeit, Getter und Setter automatisch von NetBeans erzeugen zu lassen (alt + Einfügen).