Tải bản đầy đủ (.pdf) (30 trang)

PHP – Endlich objektorientiert- P14

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.29 MB, 30 trang )

5 – Projektpraxis
360
}
$handle = fopen ($url, "r");
$data="";
while (!feof($handle)) $data .= fgets($handle, 4096);
fclose ($handle);
// Kurs auslesen
$search='<td class="column-datavalue2 last strong">';
$searchE='</td>';
$pos1=strpos($data,$search,1);
if ($pos1>0){
$pos1E=strpos($data,$searchE,$pos1+strlen($search));
$AktKurs=(str_replace(",",".",substr($data,$pos1+strlen($search),
$pos1E-$pos1-strlen($search))));
}
else{
$ret[Kurs]=FALSE;
}
// Datum und Zeit auslesen
$search='<td class="column-datavalue2 last">';
$pos2=0;
$pos2=strpos($data,$search,$pos1+1);
if ($pos2>0){
$ret[Datum]=substr($data,$pos2+strlen($search),10);
$ret[Zeit]=substr($data,$pos2+strlen($search)+11,5);
}
else{
$ret[Datum]=FALSE;
$ret[Zeit]=FALSE;
}


return $ret;
}

public function getDaten(){
$data=array();
$data[aktienname]=$this->bestand->getAktie()->getName();
$data[aktienISIN]=$this->bestand->getAktie()->getISIN();
$data[aktienURL]=$this->bestand->getAktie()->getURL();
$data[anzahl]=$this->bestand->getAnzahl();
$data[dividenden]=$this->bestand->getDividenden();
$data[ekDatum]=$this->bestand->getEkDatum();
Listing 5.11: Die neue Klasse „Bilanz“ (Forts.)
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Das Fallbeispiel der Depotverwaltung
PHP – Endlich objektorientiert 361
Im ersten Schritt wird die Methode ermittelnAktuelleDaten() beschrieben. Die Homepage
bietet den kostenlosen Dienst an, stets aktuelle Börsenkurse bereitzustellen. Abbildung
5.16 zeigt die Darstellung der Daten in der HTML-Ausgabe. Interessant ist dabei neben
dem Preis auch das Datum und die Uhrzeit der Ermittlung des Kurses. Es sollen die
Daten des Handelsplatzes Frankfurt verwendet werden, da unser Auftraggeber der
RAUB-Bank ebenso den Handel an der Frankfurter Börse für seine Kunden anbietet.
$data[ekGebühr]=$this->bestand->getKaufGebühren();
$data[ekEinzelpreis]=$this->bestand->getEkEinzelpreis();
if ($this->bestand->isVerkauft()){
// alles wurde bereits verkauft
$data[aktDatum]=$this->verkauf->getDatum();
$data[aktGebühr]=$this->verkauf->getGebühr();
$data[aktEinzelpreis]=$this->verkauf->getEinzelpreis();
}
else{

// $verkauf wären die aktuellen Verkaufsgebühren
$akt=$this->ermittelnAktuelleDaten();
$data[aktDatum]=$akt[Datum];
$data[aktGebühr]=$verkauf;
$data[aktZeit]=$akt[Zeit];
$data[aktEinzelpreis]=$akt[Kurs];
}
$data[tageImBesitz]=(strtotime($data[aktDatum])-
strtotime($data[ekDatum]))/86400;
$data[ekSumme]=$data[ekEinzelpreis]*$data[anzahl]+$data[ekGebühr];
$data[aktSumme]=$data[aktEinzelpreis]*$data[anzahl]-
$data[aktGebühr];
$data[diffAktieEur]=$data[aktEinzelpreis]-$data[ekEinzelpreis];
$data[diffAktieProz]=($data[aktEinzelpreis]/$data[ekEinzelpreis]-
1)*100; // ohne Kosten
$data[gewinnEur]=$data[aktSumme]-$data[ekSumme]+$data[dividenden];
$data[gewinnProz]=$data[gewinnEur]/$data[ekSumme]*100;
$data[gewinnProzProJahr]=100*($data[gewinnEur]/$data[tageImBesitz]
*365.25)/$data[ekSumme];
if ($data[gewinnProzProJahr]<0) $data[gewinnProzProJahr]=0;
return $data;
}
}
?>
Listing 5.11: Die neue Klasse „Bilanz“ (Forts.)
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
5 – Projektpraxis
362
Abbildung 5.16: Aktuelle Kursdaten der HTML-Datei
Der entsprechende HTML-Quellcode kann im Internetbrowser des Clients ausgelesen

werden. Er ist im Folgenden dargestellt, wobei einige zusätzliche Zeilenumbrüche zur
Übersichtlichkeit eingefügt wurden:
<th class="column-datacaption first"></th>
<th class="column-datavalue1 strong">Xetra</th><th class="column-datavalue2 strong
last">Frankfurt</th></tr><tr>
<td class="column-datacaption first strong">Letzter Preis</td><td class="column-datavalue1
strong">8,420</td><td class="column-datavalue2 last strong">8,45</td>
</tr><tr class="odd"><td class="column-datacaption first">Datum, Zeit</td>
<td class="column-datavalue1">19.10.2009 17:35</td>
<td class="column-datavalue2 last">19.10.2009 19:53</td>
</tr><tr>
Ähnlich wie bei einem Dateizugriff wird mit dem Befehl $handle = fopen (...) unter
Angabe des URL eine Referenz auf die betreffende Homepage erstellt. Vorher wird
jedoch geprüft, ob der URL-String nicht leer ist. Eine leere oder auch ungültige Zeichen-
kette sorgt dafür, dass fopen blockiert und in einen Timeout läuft, der die Rückgabe der
Funktion stark verzögert.
Die anschließende while-Schleife liest den HTML-Text der Seite so lange ein, bis das Ende
erreicht ist. Dabei werden mit dem Befehl $data .= fgets($handle, 4096); jeweils 4kByte-Blö-
cke eingelesen und der HTML-Quellcode als Zeichenkette in der Variablen $data gespei-
chert. Mit dem Befehl fclose ($handle); wird die Verbindung zur Internetseite dann wieder
geschlossen, deren Inhalt Sie nun als Zeichenkette vorliegen haben.
Wie jede andere Zeichenkette, können Sie $data jetzt mit den mächtigen Zeichenketten-
funktionen von PHP durchsuchen. Die erste Suche konzentriert sich auf die Zeichenfolge
<td class="column-datavalue2 last strong">. Die Position, an der die Zeichenfolge gefun-
den wurde, wird unter $pos1 gespeichert. Die Zeichenfolge kommt nur einmalig im
HTML-Code vor. Die Position ist nicht größer als 0, wenn die Zeichenfolge nicht gefun-
den wurde. In diesem Fall wird der ermittelte Kurswert auf $ret[Kurs]=FALSE; gesetzt.
Im Anschluss daran wird das nächste </td> hinter der gefundenen Position gesucht.
Dazwischen steht dann der Kurs, der extrahiert und in $AktKurs gespeichert wird.
Zusätzlich wird das Kommatrennzeichen über die Funktion str_replace in einen Punkt

umgewandelt, sodass $AktKurs als Gleitkommazahl gesehen wird. Auf diese Weise kann
man mit dem extrahierten Wert rechnen.
Nach dem gleichen Prinzip werden das Datum und die Uhrzeit ausgelesen, zu der der
Kurs ermittelt wurde. Hier wird nach der einmalig im HTML-Code vorkommenden Zei-
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Das Fallbeispiel der Depotverwaltung
PHP – Endlich objektorientiert 363
chenkette <td class="column-datavalue2 last"> gesucht. Da das Datum mit dd.mm.yyyy
hh:mm ein festes Format und im Gegensatz zu einem Aktienkurs (1,23 € oder 123,45 €)
eine feste Anzahl an Stellen hat, werden die nächsten 16 Stellen hinter der gesuchten Zei-
chenkette extrahiert. Die ersten 10 Stellen werden als Datum in der Variablen $ret[Datum]
und die Stellen 11 bis 15 als Uhrzeit in der Variablen $ret[Zeit] abgelegt. Wenn dies nicht
erfolgreich ist, werden diese beiden Variablen ebenfalls mit FA LSE belegt. Zur weiteren
Verarbeitung wird das Datenfeld mit dem Kurs, dem Datum und der Zeit dann als Rück-
gabewert der Funktion zurückgegeben.
Die zweite Methode der Bilanz, getDaten(), gibt die Ergebnisse der Bilanzberechnung als
Datenfeld zurück. Aus dem Aktienbestand werden zunächst ausgelesen

der Name der Aktie

die ISIN der Aktie

der URL der Aktie
Im Anschluss daran werden die Daten des Einkaufs in das Datenfeld hinzugefügt. Dazu
gehören

die Anzahl der Aktien im Bestand

die ggf. erhaltenen Dividendenzahlungen


das Datum des Einkaufs (bzw. der arithmetisch gewichtete Mittelwert bei mehreren
Einkäufen)

die Gebühren beim Einkauf

der Einzelpreis der eingekauften Aktien (bzw. der arithmetisch gewichtete Mittel-
wert bei mehreren Einkäufen).
Der nächste Teil der Bilanz ist abhängig davon, ob der Bestand bereits verkauft wurde
oder nicht. Wenn er bereits verkauft wurde, so besitzt das Bilanzobjekt eine Verkaufsor-
der. Daraus werden extrahiert und dem Datenfeld hinzugefügt:

das Datum des Verkaufs

die Verkaufsgebühren

der Einzelpreis der Aktie, zu dem verkauft wurde
Wurde der Bestand noch nicht verkauft, werden zunächst die aktuellen Daten von der
Homepage ausgelesen. Aus diesen Daten werden ausgegeben:

das aktuelle Datum

die Zeit, zu dem der Kurs ermittelt wurde

der aktuelle Einzelpreis, also der Kurs selbst
Zusätzlich dazu werden die Verkaufsgebühren aus dem Konstruktor der Bilanz ausgege-
ben, die bei einem Verkauf anfallen würden.
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
5 – Projektpraxis
364
Im Anschluss daran werden die eigentlichen Berechnungen der Bilanz durchgeführt.

Dabei werden die folgenden Fakten ermittelt und in das Ausgabefeld $data hinzugefügt,
die auch später in der Ausgabe erscheinen sollen:

tageImBesitz beschreibt die Anzahl der Tage, die der Bestand schon existiert. Dazu
wird das Datum des Einkaufs und das aktuelle Datum (entweder das jetzige Datum,
falls der Bestand noch nicht verkauft wurde oder das Datum des Verkaufs) zunächst
in Sekunden umgewandelt mit der Funktion strtotime. Die erhaltene Differenz der
beiden Werte ergibt dann die Anzahl der Sekunden, die der Aktienbestand im Besitz
des Anlegers war bzw. ist. Dividiert man den Wert durch 86 400, so erhält man die
Anzahl der Tage, die die Aktie im Besitz war bzw. ist, da ein Tag 24 Stunden hat, eine
Stunde 60 Minuten und eine Minute 60 Sekunden hat (24x60x60=86 400).

ekSumme beschreibt den Betrag, die der Anleger für den Aktienbestand bezahlen
musste. Sie besteht aus dem (durchschnittlichen) Kurs der Aktie beim Einkauf, multi-
pliziert mit der Anzahl der gekauften Aktien. Hinzu kommen noch die angefallenen
Kaufgebühren.

aktSumme beschreibt den Wert des Bestands. Dies ist der aktuelle Kurs bzw. der Ver-
kaufskurs multipliziert mit der Anzahl. Davon müssen die Verkaufsgebühren noch
abgezogen werden.

diffAktieEur ist die Differenz des Kurses beim Einkauf zu dem aktuellen Kurs bzw.
zum Kurs, zu dem verkauft wurde.

diffAktieProz ist dieselbe Differenz, jedoch in Prozent. Bei beiden Differenzen wird nur
der Kurs betrachtet und keine angefallenen Kosten und Dividendenzahlungen.

gewinnEur ist der Gewinn (oder Verlust) in Euro, die der Aktienbestand abgeworfen
hat. Dazu wird der Wert beim Einkauf vom aktuellen Wert des Bestands bzw. der
Wert beim Verkauf abgezogen. Da hier die Kosten bereits berücksichtigt sind, müssen

nur noch die erhalteten Dividenden hinzugefügt werden.

gewinnProz ist dieser Gewinn, umgerechnet in Prozent.

gewinnProzProJahr rechnet den ermittelten Gewinn auf ein Jahr hoch. Dazu wird der
erhaltene Gewinn durch die Anzahl der Tage geteilt, die sich der Aktienbestand im
Besitz des Anlegers befindet. Dann haben Sie den durchschnittlichen Gewinn pro Tag
ermittelt. Dieser durchschnittliche Gewinn pro Tag wird mit den Tagen eines Jahres,
also mit 365.25, wegen des Schaltjahres alle 4 Jahre, multipliziert. Dieser Jahresge-
winn wird dann noch in Prozent umgerechnet. Dieser Wert dient zum Vergleich mit
einer Festgeldanlage.
Wenn Sie mit dem Aktienbestand Verlust gemacht haben, wäre gewinnProzProJahr nega-
tiv. Da Sie jedoch selbst im Falle der Insolvenz der Aktiengesellschaft kein Geld drauf-
zahlen müssen, wird der prozentuale Gewinn pro Jahr bei einem negativen Wert zum
Abschluss der Methode getDaten() auf 0 gesetzt.
Die Erweiterung der Klasse Aktienbestand sowie die Klasse Bilanz sorgen dafür, dass die
erwartete Ausgabe des Tests erfüllt wird. Die einzelnen direkten Tests mit kleinen PHP-
Skripten sind damit abgeschlossen. Im nächsten Schritt wird nun die erste Benutzerober-
fläche für unseren Auftraggeber erstellt.
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Das Fallbeispiel der Depotverwaltung
PHP – Endlich objektorientiert 365
Die zweite Phase: Die Schnittstelle zum Benutzer
Für den Prototyp der Benutzeroberfläche (GUI) wird eine Menüführung benötigt, durch
die unser Auftraggeber die von ihm definierten Anwendungsfälle (Abb. 5.2) wieder fin-
det. Dadurch wird eine geschäftsprozessnahe Umsetzung der Anforderungen unter-
stützt.
Sowohl die Verwendung von JavaScript-Menüs als auch HTML-Frames sind veraltet. Sie
erlauben kein direktes Bookmarking und sind auch hinderlich für einen barrierefreien
Zugriff. Die gesamte Darstellung soll daher in einer einzigen HTML-Datei möglichst

ohne Verwendung von aktiven Skripten beim Client erfolgen.
Gleichzeitig sind Erweiterungen und Änderungen in der Menüführung sehr wahr-
scheinlich. Schon ab ca. 50 Bildschirmmasken ist eine Änderung vom Entwickler oder
Designer nur nervenaufreibend konsistent durchzusetzen. Die Bildschirmmasken wer-
den also nicht vollständig auf dem Webserver gespeichert, sondern modular zusammen-
gesetzt. Für die kleine Beispielanwendung der Depotverwaltung genügt die in Abbil-
dung 5.17 beschriebene Aufteilung.
Abbildung 5.17: Aufteilung der Bedienführung
In der header.inc.php beginnt der HTML-Code. Dort soll auch die PHP-Session des Benut-
zers initialisiert werden. Die Menüführung soll auch einmalig in der Header-Datei unter-
gebracht werden.
Der zweite Teil der HTML-Ausgabe besteht aus dem eigentlichen Inhalt, den der Benut-
zer ausgewählt hat. Möchte er beispielsweise einen neuen Aktienbestand anlegen, so
sind dazu einige Eingabeparameter nötig. Diese Parameter sollen im Inhaltsteil in einem
HTML-Formular eingegeben werden. Genau dies ist die Aufgabe der View im MVC-
Paradigma (Abb. 3.28). Die Weiterleitung des ausgefüllten HTML-Formulars erfolgt
dann an eine PHP-Datei, die den Controller des MVC darstellt. Dort werden die eingege-
benen Daten ggf. auf Gültigkeit geprüft und an das Datenmodell übergeben. Der Erfolg
dieser Aktion wird dann wiederum an den Benutzer weitergegeben.
Die footer.inc.php enthält dann lediglich einen einheitlichen Abschluss für die HTML-
Darstellung, wie eine Copyright-Information und das eigentliche Ende der HTML-Datei.
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
5 – Projektpraxis
366
Die Realisierung des Konzepts erfolgt dadurch, dass jede PHP-Inhaltsdatei den Header
und den Footer inkludiert und diese beiden Dateien nur einmalig vorhanden sind. Dies
ist der erste Ansatz für eine zentrale Verwaltung des Layouts und der Menüführung. Bei
größeren Projekten wird ein solches Konzept weiter ausgebaut, indem die HTML-Dar-
stellung von einem Objekt einer Template-Klasse übernommen wird. Das Darstellungs-
Template enthält dann unter anderem Eigenschaften für die Farbdarstellung und den

gesamten Stil der Präsentation. Dies kann beispielsweise über die Parametrierung des
Objekts mit CSS-Dateien erfolgen.
Damit unser Auftraggeber die bislang nur exemplarisch getestete Funktionalität der
PHP-Anwendung prüfen kann, wird in Abbildung 5.18 ein typisches Szenario in einem
Aktivitätsdiagramm auf Meeresspiegelebene (also auf der Ebene des Benutzers) zusam-
mengestellt, welches einen Großteil der geforderten Anwendungsfälle abdeckt. Dieses
Szenario wird im Folgenden über das zu erstellende GUI abgedeckt.
Abbildung 5.18: Szenario für die Schnittstelle zum Benutzer
Der erste Schritt besteht also darin, die Depotverwaltung zu starten. Die entsprechende
Inhaltsdatei soll eine leicht in HTML zu realisierende Willkommensmeldung darstellen
und sowie das Menü der Depotverwaltung präsentieren. Wie in jede Inhaltsdatei werden
der Header und der Footer eingebunden. Der Inhalt dieser beiden Rahmendateien wird
in den Listings 5.12 und 5.13 dargestellt.
<?php
session_start();
require_once("classloader.inc.php");
if (!isset($_SESSION[Bestand])) $_SESSION[Bestand]=NULL;
if (!isset($_SESSION[BestandAnzahl])) $_SESSION[BestandAnzahl]=0;
if (isset($_GET[w])){
$_SESSION[BestandGewählt]=$_GET[w];
}
else{
if (!isset($_SESSION[BestandGewählt])) $_SESSION[BestandGewählt]=-1;
}
?>
<html><body>
Listing 5.12: header.inc.php
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Das Fallbeispiel der Depotverwaltung
PHP – Endlich objektorientiert 367

<center>
<h1>Depotverwaltungsprogramm</h1>
<h3>Gewählter Bestand:&nbsp;
<?php
if ($_SESSION[BestandGewählt]==-1){
$status="disabled";
echo '---';
}
else{
$status="";
$bestandGewählt=unserialize($_SESSION[Bestand]
[$_SESSION[BestandGewählt]]);
echo $bestandGewählt->getAktie()->getName();
}
?>
</h3>
<table border="0">
<tr>
<td><form action="laden.php" method="post">
<input type="submit" value=" laden "/>
</form></td>
<td><form action="speichern.php" method="post">
<input type="submit" value=" speichern " <?php echo $status?>/>
</form></td>
<td><form action="uebersicht.php" method="post">
<input type="submit" value="Übersicht / wählen" <?php echo $status?>/>
</form></td>
<td><form action="neu.php" method="post">
<input type="submit" value=" neu "/>
</form></td>

<td><form action="hinzukaufen.php" method="post">
<input type="submit" value=" hinzukaufen " <?php echo $status?>/>
</form></td>
<td><form action="dividende.php" method="post">
<input type="submit" value="neue Dividende" <?php echo $status?>/>
</form></td>
<td><form action="verkaufen.php" method="post">
<input type="submit" value=" verkaufen " <?php echo $status?>/>
</form></td>
</tr>
Listing 5.12: header.inc.php (Forts.)
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
5 – Projektpraxis
368
In der PHP-Session (Kap. 2.2) wird vor allem die Liste der Aktienbestandsobjekte in der
Referenz $_SESSION[Bestand] verwaltet. Zusätzlich wird festgehalten, wie viele Aktien-
bestände im Depot liegen ($_SESSION[BestandAnzahl]) und welcher Aktienbestand ggf.
ausgewählt wurde ($_SESSION[BestandGewählt]). Der gewählte Bestand kann über eine
HTTP-Get Anfrage ($_GET[w]) an jede Datei übergeben werden, die die header.inc.php
einbindet.
Im Anschluss daran beginnt die Ausgabe des HTML-Codes. Sie ist abhängig davon, ob
bereits ein Aktienbestand gewählt wurde oder nicht. Ist dies nicht der Fall, wird
zunächst eine Statusvariable $status mit dem Textwert disabled belegt, die später im
Menü der HTML-Datei noch Verwendung findet. Wurde bereits ein Bestand gewählt, so
bleibt die Statusvariable leer. Im zweiten Schritt wird das gewählte Aktienbestandsob-
jekt aus der Liste der Bestände in die Variable $bestandGewählt extrahiert. Da die Liste der
Objekte in einer Session nicht direkt zugegriffen werden kann, muss das entsprechende
Objekt zunächst deserialisiert werden (Kap. 4.1.2). Im Anschluss daran können Sie aus
der Aktie des Bestands den Namen auslesen und ausgeben.
Im Anschluss daran folgt im Header eine HTML-Tabelle mit einer Zeile und sieben Spal-

ten, in der sich jeweils HTML-Formulare befinden, die auf die vom Auftraggeber defi-
nierten Anwendungsfälle verweisen. Sie bieten die Dienste an, um

Aktienbestände aus der Datenbank zu laden

Bestände wieder in die Datenbank abzuspeichern

eine Übersicht über alle Bestände anzuzeigen und ggf. einen Bestand auszuwählen

einen neuen Bestand anzulegen

Aktien zu dem gewählten Bestand hinzuzukaufen

eine Dividende zu dem gewählten Bestand hinzuzufügen

den gewählten Bestand zu verkaufen
Wenn genau ein Bestand in der Depotverwaltung existiert, soll er stets angewählt sein.
Wenn mehr als ein Aktienbestand existiert, muss stets genau ein Bestand angewählt sein.
Zu Beginn der Anwendung existiert jedoch noch kein Bestand in der Depotverwaltung.
Deshalb sind nur zwei Anwendungsfälle ausführbar, nämlich

Aktienbestände aus der Datenbank laden

einen neuen Bestand anlegen
</table>
<hr>
</center>
Hinweis
Erkennen Sie, wie sich die objektorientierte Denkweise der Aktienbestände mit der
prozeduralen Denkweise bei der Darstellung des HTML-Codes vereinigt?

Listing 5.12: header.inc.php (Forts.)
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Das Fallbeispiel der Depotverwaltung
PHP – Endlich objektorientiert 369
Alle anderen Anwendungsfälle können deaktiviert werden, indem die entsprechenden
Schaltflächen im HTML-Formular über den Text disabled grau dargestellt und inaktiv
gesetzt werden. Genau dies geschieht über die Ausgabe der Variablen $status, die entwe-
der den Wert disabled enthält oder leer ist.
Die Footer-Datei enthält lediglich einen textuellen Copyright-Hinweis und das Ende der
HTML-Datei.
Die Willkommensseite ist die erste und einfachste Inhaltsseite. Sie inkludiert den Header
und den Footer, die nun die Session verwalten, das Menü und den HTML-Rumpf.
Wenn Sie nun die start.php ausführen, sehen Sie die in Abbildung 5.19 dargestellte Start-
seite.
Abbildung 5.19: Startmaske der Depotverwaltung
<center>
<hr>
Copyright by Dr. Frank Dopatka
</center>
</body></html>
Listing 5.13: footer.inc.php
<?php require_once("header.inc.php"); ?>
<center>
<h1>Herzlich Willkommen!</h1>
</center>
<?php require_once("footer.inc.php"); ?>
Listing 5.14: start.php (View)
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
5 – Projektpraxis
370

Der nächste Schritt im Szenario besteht darin, einen neuen Aktienbestand anzulegen.
Dazu klicken Sie auf die Schaltfläche neu, die zu der Datei neu.php verweist. Diese Datei
ist in Listing 5.15 dargestellt.
<?php require_once("header.inc.php"); ?>
<form action="neu2.php" method="post">
<table border="0" width="100%">
<tr><td align="right" width="50%">
Name der Aktie:
</td><td align="left" width="50%">
<input type="text" name="name" size="30"/>
</td></tr>
<tr><td align="right" width="50%">
ISIN der Aktie:
</td><td align="left" width="50%">
<input type="text" name="isin" size="30"/>
</td></tr>
<tr><td align="right" width="50%">
URL der Aktiendaten:
</td><td align="left" width="50%">
<input type="text" name="url" size="30"/>
</td></tr>
<tr><td align="right" width="50%">
Anzahl gekaufter Aktien:
</td><td align="left" width="50%">
<input type="text" name="anz" size="5"/> Stück
</td></tr>
<tr><td align="right" width="50%">
Kurs beim Kauf:
</td><td align="left" width="50%">
<input type="text" name="kaufkurs" size="10"/> ?

</td></tr>
<tr><td align="right" width="50%">
Kauf-Datum:
</td><td align="left" width="50%">
<input type="text" name="kaufdatum" size="10"/>
</td></tr>
<tr><td align="right" width="50%">
Kauf-Gebühren:
</td><td align="left" width="50%">
<input type="text" name="kaufgebühr" size="10"/> ?
Listing 5.15: neu.php (View)
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Das Fallbeispiel der Depotverwaltung
PHP – Endlich objektorientiert 371
Wie in jedem anderen Anwendungsfall werden auch hier der Header und der Footer ein-
gebunden. Die Datei selbst besteht aus einer HTML-Tabelle, in der alle Parameter einge-
geben werden, die zur Erstellung eines neuen Aktienbestands notwendig sind. Sie könn-
ten zusätzlich dazu clientseitige Gültigkeitsprüfungen – beispielsweise in einem Java-
Skript – vornehmen, um den Benutzer frühzeitig auf Fehleingaben hinzuweisen.
Das HTML-Formular der View verweist auf neu2.php, die eine Controller-Datei darstellt.
Die eingegebenen Daten werden per HTTP-POST-Protokoll übergeben. Abbildung 5.20
zeigt zunächst die Eingabemaske der Datei neu.php.
Wenn Sie in Abbildung 5.20 nun auf OK oder Abbrechen klicken, werden alle eingegebe-
nen Daten per HTTP-POST an die Datei neu2.php übertragen. Deren Quellcode ist in Lis-
ting 5.16 dargestellt. Dort wird zunächst geprüft, ob Sie die Abbrechen-Schaltfläche betä-
tigt hatten. Dies ist noch vor der Einbindung der header.inc.php notwendig, da dort bereits
die Ausgabe des HTML-Codes zum Client beginnt. In dem Fall, dass Sie den Vorgang
abbrechen wollen, werden Sie nämlich über das direkte HTTP-Kommando Location:
start.php an start.php weitergeleitet. Wenn die Ausgabe der HTML-Seite bereits begonnen
hat, ist eine solche Weiterleitung nicht mehr möglich.

</td></tr>
<tr><td align="right" width="50%">
Verkauf-Gebühren*:
</td><td align="left" width="50%">
<input type="text" name="verkaufgebühr" size="10"/> ?
</td></tr>
<tr><td align="right" width="50%">
<input type="submit" name="eingabe" value=" OK "/>
</td><td align="left" width="50%">
<input type="submit" name="eingabe" value="Abbrechen"/>
</td></tr>
</table>
</form>
<p>
*: Die Gebühren, die zu erheben wären, wenn man den Aktienbestand jetzt verkaufen
würde.
</p>
<?php require_once("footer.inc.php"); ?>
Listing 5.15: neu.php (View) (Forts.)
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.

×