Es wurde im UML-Teil des dritten Kapitels bereits erklärt, dass Inter-faces auch vererbt werden können, um zusätzliche Funktionalität hinzuzufügen.. Auch in Listing 4.51 werden Fehlerprü
Trang 1Der Datenzugriff kann natürlich um Transaktionen und/oder verschlüsselten Zugriffergänzt werden Es wurde im UML-Teil des dritten Kapitels bereits erklärt, dass Inter-faces auch vererbt werden können, um zusätzliche Funktionalität hinzuzufügen Dies
kann beispielsweise durch die Definition interface iCryptedDZ extends iDZ erfolgen.
Nun muss der Zugriff auf diese Implementierung noch getestet werden Dazu wird aufdie existierende Börsendatenbank aus dem zweiten Kapitel zurückgegriffen (Abb 2.11
ff.) In der Datenbank boerse ist eine Tabelle ag enthalten, die einen Identifikator und den
Namen von Aktiengesellschaften enthält Zum Testen wird die Verbindung zum bankserver geöffnet, der Name einer Aktiengesellschaft aktualisiert, anschließend diegesamte Tabelle ausgelesen und im letzten Schritt wird die Verbindung wieder geschlos-sen
Daten-Im Gegensatz zum zweiten Kapitel wird die Datenbankverbindung hier innerhalb des
Verbindungsobjekts $db verwaltet Dieses Objekt verfügt durch die Implementierung
des zuvor definierten Interfaces über die Methoden
쮿 öffnen
쮿 schreiben
쮿 lesen
쮿 schließenFür die Parametrierung werden beim Öffnen, Schreiben und Lesen eigene Parameterob-
jekte definiert, die beim Öffnen über die Parameter host, user, pass und db sowie beim reiben und Lesen über den Parameter sql verfügen.
Sch-Erkennen Sie den Mehrwert gegenüber der Realisierung im zweiten Kapitel? Der
Pro-grammierer, der ein mysqlDZ-Objekt verwendet, muss nichts über die MySQL-Befehle
von PHP wissen Er muss lediglich die zum Öffnen notwendigen Parameter kennen unddie SQL-Sprache beherrschen Über dasselbe Interface könnten Sie auch Implementie-rungen für eine Oracle-, MS-SQL- oder eine DB2-Datenbank schreiben Die Verwendungwäre identisch Gegebenenfalls müssten die Parameter etwas verändert werden Mitähnlichen Parametern lassen sich auf die gleiche Art und Weise auch Zugriffe aufDateien realisieren
Die Eingabe der Parameter erfolgt jedoch üblicherweise über eine bemaske, die einem eingeloggten Administrator zur Verfügung steht Für jede Imple-
} private function starts_with($str,$wert){
return strtolower(substr($str,0,strlen($wert)))==strtolower($wert);
} }
?>
Listing 4.47: Die Implementierung des Interfaces für einen MySQL-Zugriff (Forts.)
Trang 2Realisierung von Klassengeflechten
mentierung muss also im Frontend noch eine passende Eingabemaske erstellt werden,mit der die Parameter festgelegt werden
Doch zunächst zurück zum Testprogramm Bei $p_öffnen, $p_schreiben und $p_lesen
han-delt es sich um die Parameterobjekte, die gemäß den Vorgaben aus der Implementierung
mysqlDZ gefüllt werden Das Verbindungsobjekt selbst heißt $db Der schreibende Zugriff $db->schreiben($p_schreiben) liefert als Ergebnis lediglich einen Wahrheitswert,
der den Erfolg des Schreibzugriffs widerspiegelt
Interessant ist der lesende Zugriff Wie bereits beschrieben wurde, liefert
$ausgabe=$db->lesen($p_lesen) ein zweidimensionales Feld als Ergebnismenge in der Referenz $ausgabe zurück Mit den PHP-Befehlen count($ausgabe) können Sie die Anzahl der Datensätze ermitteln und mit count($ausgabe[0]) die Anzahl der zurückgegebenen Spalten der Ergeb-
nistabelle Das sind die Spalten, die Sie hinter dem SELECT-Befehl der SQL-Anweisung
angegeben haben Mit der verschachtelten foreach-Schleife können Sie nun auf jedes
Datenelement zugreifen
<?php require_once("classloader.inc.php"); ?>
<html><body>
<?php // neues DB-Verbindungsobjekt erstellen, welches das Interface iDZ // implementiert
$db=new mysqlDZ();
// 1 öffnen $p_öffnen=new ParameterListe();
$p_schreiben->add('sql','UPDATE ag SET name="Dopatka AG" WHERE ID=6');
echo 'Schreiben erfolgreich:';
echo var_dump($db->schreiben($p_schreiben)); echo '<br>';
echo 'Anzahl Spalten:'.count($ausgabe[0]).'<br>';
foreach($ausgabe as $index => $datensatz){
Listing 4.48: Test der Implementierung
Trang 3Auf diese Weise wird die folgende Ausgabe erzeugt Als Übung können Sie diese gabe in eine HTML-Tabelle umformatieren.
Aus-Schreiben erfolgreich:bool(true) Anzahl Datensätze:30
Anzahl Spalten:2 1
ADIDAS-SALOMON AG 2
ALLIANZ AG VNA O.N 3
ALTANA AG O.N.
4 BASF AG O.N.
5 BMW 6 Dopatka AG
4.2.6 Umsetzung von Sequenzdiagrammen
Wie Sie aus einem bestehenden UML-Klassendiagramm eine Klasse in PHP 5 ableitenkönnen, haben Sie bereits in den vorherigen Kapiteln erfahren Hier wird die Definitionder Klassen, der Eigenschaften und Methoden sowie der Beziehungen der Klassen unter-einander fokussiert Ebenso wurde bereits ein Aktivitätsdiagramm aus Abbildung 4.9 inListing 4.36 in einer Methode umgesetzt
foreach($datensatz as $index2 => $wert){
echo $wert;
echo '<br>';
} } // 4 schliessen $db->schliessen();
?>
</body></html>
Listing 4.48: Test der Implementierung (Forts.)
Trang 4Realisierung von Klassengeflechten
Die Beziehung zwischen einem UML-Sequenzdiagramm und einer PHP-Klasse wurdejedoch noch nicht vorgestellt Wie ein Aktivitätsdiagramm zeigt ein Sequenzdiagrammeinen Ablauf, der jedoch weniger einen Geschäftsprozess abbildet, sondern eher dieInteraktion von Objekten in den Vordergrund stellt
Der Quellcode aus Listing 4.49 ist ein Ausschnitt aus dem bereits vorgestellten Quellcodedes Listings 4.41, der den Test des Klassengeflechts zwischen Kunden, Rechnungen,Rechnungspositionen und Artikeln realisiert Es wird also eine Kommunikation vonObjekten von vier verschiedenen Klassen abgebildet Dieser existierende Quellcode soll
in diesem Beispiel in einem Sequenzdiagramm auf Muschelebene dokumentiert werden
Zunächst wird über den Frontend-Quellcode – den man als Akteur gegenüber den
ande-ren Objekten sehen kann – die Methode getRechnungen des Kunden Dopatka aufgerufen.
Daraufhin erhält der Aufrufer eine Liste der Rechnungen als Rückgabe Von dieser Liste
wird das erste Element, $rechnungen[0] betrachtet Dies ist ein Objekt der Klasse nung Von dieser Rechnung werden nun Eigenschaften ausgelesen, nämlich
Rech-쮿 die Rechnungsnummer (ID)
쮿 das Rechnungsdatum
쮿 der Name des Kunden der Rechnung
쮿 der Rabatt auf die Gesamtrechnung
쮿 die Anzahl der RechnungspositionenGenau dieses Auslesen erkennen Sie im Sequenzdiagramm der Abbildung 4.12 ImAnschluss daran wird jede Rechnungsposition in einer Schleife durchgegangen DieSchleife kann in einem Sequenzdiagramm nur schwer abgebildet werden und wird in
$rechnungen=$k1->getRechnungen();
echo '<b>RECHNUNG Nr '.$rechnungen[0]->getID().' vom '.$rechnungen[0]
->getDatum().':</b><br>';
echo 'Kunde: '.$rechnungen[0]->getKunde()->getName().'<br>';
echo 'Rabatt auf die Gesamtrechnung: '.$rechnungen[0]
->getRabatt().'%<br>';
$positionen=$rechnungen[0]->getPositionen();
$i=0;
foreach ($positionen as $index => $p){
echo '<i>Position '.($i+1).':</i><br>';
echo $p[0]->getName().', '.$p[1].' Stück, '.$p[2].'% Rabatt<br>';
echo number_format($p[3],2).'EUR pro Stück, '.number_format($p[4],2)
'EUR gesamt incl ';
Trang 5dem gepunkteten Kasten mit der Beschriftung *positionen (heißt: für alle Positionen)
dar-gestellt Für jede Rechnungsposition werden nun ausgegeben:
쮿 der Name des Artikels
쮿 die bestellte Menge
쮿 der Rabatt dieser einzelnen Position
쮿 der Einzelpreis
쮿 der Gesamtpreis dieser Position
쮿 der Mehrwertsteuersatz Der Name des Artikels wird über die Artikelreferenz ausgelesen, die jede Rechnungspo-sition besitzt Im Sequenzdiagramm der Abbildung 4.12 werden nur die ersten beidenLesevorgänge aus jeder Rechnungsposition, also Artikelname und Menge, dargestellt
Abbildung 4.12: Sequenzdiagramm des PHP-Codes aus Listing 4.49
4.2.7 Umsetzung von Zustandsautomaten
Auch die Implementierung eines in UML definierten Zustandsdiagramms ist in PHP 5möglich Die folgende Abbildung 4.13 wurde bereits im dritten Kapitel zur Beschreibungdes Zustandsdiagramms der UML verwendet Es beschreibt das Interface einer Flugre-servierung mit den Methoden
Trang 6Realisierung von Klassengeflechten
쮿 reservieren
쮿 stornieren
쮿 buchenDies ist zunächst Bestandteil eines Klassendiagramms Zusätzlich wird jedoch ein Proto-koll in Form eines Zustandsdiagramms dargestellt Dieses Protokoll zeigt, in welcherReihenfolge die Methoden einer Klasse abgearbeitet werden müssen, die das Interfaceund das Protokoll implementieren soll
Abbildung 4.13: Zustandsdiagramm einer Interfacebeschreibung
Listing 4.50 zeigt im ersten Schritt die Definition des Interfaces zur Flugreservierung mitden drei Methoden
Hinweis
Sie erkennen daran, dass jedes UML-Diagramm der Designphase direkten Einflussauf den entstehenden Quellcode haben kann Dies gilt insbesondere für die Fisch-und Muschelebene Jedes Diagramm stellt einen anderen Aspekt des Quellcodes darund kann direkt in Quellcode übersetzt werden Ebenso ist eine Übersetzung vonQuellcode in UML zu Zwecken der Dokumentation möglich
<?php interface iFlugreservierung{
Listing 4.50: Das Interface der Flugreservierung
Trang 7Listing 4.51 zeigt nun die Implementierung des Interfaces unter Berücksichtigung des imZustandsdiagramm definierten Protokolls Insgesamt existieren die Zustände
Zustand des Reservierungsobjekts jederzeit abfragen kann
Dem folgen die im Interface deklarierten Methoden reservieren, stornieren und buchen.
Dabei wird stets im ersten Schritt geprüft, ob die entsprechende Methode im aktuellenZustand überhaupt ausgeführt werden darf Ist dies nicht der Fall, so gibt die Methode
FALSE zurück Ansonsten erfolgt ein Zustandswechsel und die entsprechende Methode gibt den Wahrheitswert TRUE zurück.
Zu berücksichtigen ist noch, dass nicht jede Reservierung in einer erfolgreichen Buchungendet Dies geschieht dann, wenn die Reservierung zu spät in eine Buchung umgewan-delt wird und bereits viele andere Kunden den Flug ausgebucht haben Da jedoch in die-sem Beispiel kein vollständiges Reservierungssystem implementiert werden soll, wirddie Reservierung per Zufallssystem in eine Buchung umgewandelt Dazu wird mit
srand(microtime()*1000000) ein Zufallszahlengenerator auf Basis der Systemzeit siert Der Befehl $zufall=rand(0,2) gibt dann eine Zufallszahl zwischen 0 und 2 zurück Ist
initiali-die erstellte Zahl größer als 1, so gilt initiali-die Buchung als erfolgreich, ansonsten nicht DerZustandswechsel innerhalb einer Methode wird dann wiederum in der Eigenschaft
$zustand festgehalten.
public function reservieren();
public function stornieren();
public function buchen();
}
?>
<?php class AirlineReservierung implements iFlugreservierung{
// 0:init, 1:reserviert, 2:gebucht, 3:storniert private $zustand;
public function construct(){
$this->zustand=0;
}
Listing 4.51: Die Interfaceimplementerung und Umsetzung des Zustandsautomaten Listing 4.50: Das Interface der Flugreservierung (Forts.)
Trang 8Realisierung von Klassengeflechten
public function getZustand(){
if ($this->zustand!=0) return FALSE;
$this->zustand=1; // reserviert return TRUE;
} public function stornieren(){
if ($this->zustand!=1) return FALSE;
$this->zustand=3; // storniert return TRUE;
} public function buchen(){
if ($this->zustand!=1) return FALSE;
// es ist Zufall, ob die Buchung funktioniert
srand(microtime()*1000000);
$zufall=rand(0,2);
if ($zufall>1){
$this->zustand=3; // gebucht }
else{
$this->zustand=2; // storniert }
return TRUE;
}
Listing 4.51: Die Interfaceimplementerung und Umsetzung des Zustandsautomaten (Forts.)
Trang 9Der Test der Implementierung erfolgt, indem ein Objekt der AirlineReservierung
ange-lehnt wird Im Anschluss daran wird ein Pfad im Zustandsdiagramm durchgegangenund nach jedem Schritt der aktuelle Zustand des Objekts ausgegeben
Die Ausgabe ist im Folgenden dargestellt, wobei in ca 50 % der Fälle die dritte Ausgabe
storniert lautet:
initialisiert reserviert gebucht
4.3 Objektorientierte Fehlerbehandlung
Bereits im zweiten Kapitel wurde der @-Operator zur Fehlerunterdrückung vorgestellt.
So wird mit $datei=@fopen("counter.txt","w") die Meldung Warning: fopen(counter.txt) [function.fopen]: failed to open stream unterdrückt Über die Prüfung if($datei===FALSE){ } könnte dann eine Behandlung des Fehlers erfolgen, wenn die
Datei nicht existiert Auch in Listing 4.51 werden Fehlerprüfungen durchgeführt, indem
eine if-Verzweigung zum Einsatz kommt und bei einem Fehler der Rückgabewert einer Methode in besonderem Maße erfolgt Die implementierten Methoden reservieren, stor- nieren und buchen liefern im Fehlerfall FALSE zurück.
Auch die Implementierung der Datenbankzugriffsschnittstelle in Listing 4.48 arbeitetauf diese Weise Das Lesen aus der Datenbank liefert ein Datenfeld als Rückgabe oder
FALSE, wenn das Lesen nicht erfolgreich war.
Trang 10Objektorientierte Fehlerbehandlung
Doch wird diese besondere Fehlerrückgabe vom Aufrufer einer Methode ausgewertet? DieAntwort lautet: Meistens nicht! Dies liegt daran, dass man oft dazu neigt, nur den erfolgrei-chen Fall zu betrachten, um möglichst schnell eine lauffähige Anwendung zu erhalten
Im Fall der Flugreservierung hat dies zur Folge, dass Sie unter Umständen einen Flug in
einem Zustand stornieren wollen, der ungleich reserviert ist In diesem Fall liefert die Methode stornieren den Wert FALSE Wird dieser Rückgabewert nicht ausgewertet, so
geht der Aufrufer der Methode davon aus, dass sein Flug erfolgreich storniert wurde.Nun könnte man sagen: Aber dann hätte der Wert doch ausgewertet werden müssen! Die Verantwortung für die Fehlerbehandlung wird also vom Programmierer der Klasseauf den Aufrufer der Methode weitergegeben Dieser muss dann nach jedem Methoden-aufruf eine Prüfung vornehmen, ob der Aufruf erfolgreich war oder nicht Dies führtdazu, dass Sie den regulären, erfolgreichen Ablauf des Programms bei vielen ZeilenQuellcode kaum noch nachvollziehen können, da er ständig von der Fehlerprüfungunterbrochen wird
So zeigt Listing 4.53 einen Ausschnitt aus dem bereits vorgestellten Listing des
objektori-entierten Datenzugriffs mit dem Datenzugriffsobjekt $db Der reguläre Programmablauf
ist fett gedruckt, während der restliche Code zur Fehlerbehandlung dient Bei größeremQuellcode entstehen viele Fehlerpfade im Quellcode, sodass Sie den regulären Ablaufdes Programms kaum noch erkennen können
Fehler in einer Klasse: werfen und fangen
Das Beispiel in Listing 4.53 zeigt ein Datenbankobjekt, das Fehler produzieren kann Beider Flugreservierung in Abbildung 4.13 sind nicht alle Methodenaufrufe in jedemZustand erlaubt Die jeweilige Methode des Reservierungsobjekts gibt bei einem ungül-
tigen Aufruf ebenso FALSE zurück wie die Methode des Datenbankobjekts
Mit der fünften Version hat PHP nun ein Konzept zur Fehlerbehandlung eingeführt, dasbei anderen objektorientierten Sprachen wie Java, VB.NET oder C# bereits sehr erfolg-reich ist Dabei wird der Quellcode, der Fehler produzieren kann, an einem Stück in
einem so genannten try-Block ausgeführt Die Idee ist, dass man zunächst versucht, den
Quellcode an einem Stück auszuführen Ist dies erfolgreich, wird der aufrufende Codelinear abgearbeitet Ansonsten ist ein Fehler aufgetreten, der von einer aufgerufenen
echo 'Anzahl Spalten:'.count($ausgabe[0]).'<br>';
Listing 4.53: Ausschnitt aus Listing 4.48
Trang 11Methode eines Objekts geworfen wurde Dieser Fehler wird dann in einem separatenQuellcodebereich gefangen und behandelt.
Damit dieses Konzept funktioniert, müssen sich zunächst die Rückgabewerte der Methodenauf ihre eigentliche Funktion besinnen; nämlich Werte, Objektreferenzen oder Datenfelder
zurückzugeben Rückgabewerte geben in diesem Konzept also keine Fehlermeldungen wie
FALSE oder bestimmte Error-Codes zurück Stattdessen können diese Methoden auf einem
neuen, unabhängigen Fehlerkanal ihre Fehlermeldungen zurückgeben
In der objektorientierten Denkweise sind auch Fehler Objekte, die Eigenschaften undMethoden besitzen Da Objekte von der Schablone einer Klasse erzeugt werden, könnenSie nun eigene Fehlerklassen schreiben und ein Fehlermanagement ihrer komplexenAnwendung einführen
Listing 4.54 skizziert eine erste Fehlerklasse, die von der in PHP vordefinierten Klasse
Exception vererbt wird Damit ist die eigene Klasse eine Exception, die geworfen und
behandelt werden kann Unsere Fehlerklasse besteht aus
쮿 einer Fehlernummer
쮿 einer Fehlermeldung
쮿 einer Eigenschaft, in der man den Namen der Methode speichern kann, in der derFehler aufgetreten ist
쮿 einem Wahrheitswert, der signalisiert, ob ein Fehler kritisch ist oder nicht
Im Konstruktor werden die vier Eigenschaften wie üblich gesetzt Beim Erzeugen eineskritischen Fehlerobjekts könnte man beispielsweise automatisch eine E-Mail an denAdministrator absetzen (Kap 2.2) oder ein Logging in eine Datenbank und/oder in eineTextdatei vornehmen
Zusätzlich besitzt die eigene Fehlerklasse Get-Methoden, um die gesetzten
Eigenschaf-ten auszulesen sowie eine toString()-Methode, damit der Fehler unmittelbar
vorforma-tiert ausgegeben werden kann
<?php class Fehler extends Exception{
private $nummer; private $meldung;
private $methode; private $kritisch=FALSE;
public function construct($nummer,$meldung,$methode,$kritisch){
$this->nummer=$nummer; $this->meldung=$meldung;
$this->methode=$methode; $this->kritisch=$kritisch;
} public function getNummer(){
return $this->nummer;
}
Listing 4.54: Die erste Fehlerklasse
Trang 12Fehlerobjekt erzeugt und geworfen Der Befehl throw new Fehler( ) ruft den Konstruktor
der Fehlerklasse auf Im Anschluss daran wird die aufgerufene Methode wie bei einer
return-Anweisung sofort beendet Das Fehlerobjekt wird dabei automatisch an den
Auf-rufer weiter gegeben
Im Gegensatz zu Listing 4.47 erkennen Sie, dass die Texte der neu erzeugten dungen (fett gedruckt) den Quelltext vergrößern Bei der Fehlerbehandlung sind Siejedoch auf aussagekräftige Texte angewiesen Als Alternative könnten Sie auch nur Feh-lernummern vergeben und jeder Nummer in einer externen Textdatei oder in einer MS-Excel-Liste einen Fehlertext zuweisen Auf diese Weise kann mit mehreren externenDateien auch eine Sprachumschaltung der Fehlermeldungen realisiert werden
public function getMeldung(){
return $this->meldung;
} public function getMethode(){
return $this->methode;
} public function istKritisch(){
return $this->kritisch;
} public function toString(){
?>
<?php class mysqlDZ implements iDZ{
private $conn; private $connected=FALSE;
public function öffnen($p){
if (!isset($p)) throw new Fehler(1,'Das Parameter-Objekt ist
Listing 4.55: Datenbankzugriff mit objektorientiertem Fehlermanagement Listing 4.54: Die erste Fehlerklasse (Forts.)
Trang 13ungültig!','mysqlDZ-öffnen',FALSE);
if ((!$p->isParam('host'))||(!$p->isParam('user'))||
(!$p->isParam('pass'))||(!$p->isParam('db'))){ throw new Fehler(2,'Das Parameter-Objekt ist
unvollständig!','mysqlDZ-öffnen',FALSE); }
} else{
throw new Fehler(4,'Verbindung zum Server konnte nicht aufgebaut werden!','mysqlDZ-öffnen',FALSE); }
} public function schliessen($p){
@mysql_close();
} public function lesen($p){
if (!isset($p)) throw new Fehler(5,'Das Parameter-Objekt ist ungültig!','mysqlDZ-lesen',FALSE);
if (!$p->isParam('sql')) throw new Fehler(6,'Das Parameter-Objekt ist unvollständig!','mysqlDZ-lesen',FALSE); $sql=$p->get('sql');
if ($this->startswith($sql,'SELECT')==FALSE){
throw new Fehler(7,'Das SQL-Statement muss mit SELECT beginnen!','mysqlDZ-lesen',FALSE); }
$data=@mysql_query($sql);
if ($data==FALSE){
throw new Fehler(8,'Ergebnis-Menge ist ungültig oder leer!
','mysqlDZ-lesen',FALSE); }
Listing 4.55: Datenbankzugriff mit objektorientiertem Fehlermanagement (Forts.)
Trang 14$x++;
} return $ausgabe;
} public function schreiben($p){
if (!isset($p)) throw new Fehler(9,'Das Parameter-Objekt ist ungültig!','mysqlDZ-schreiben',FALSE);
if (!$p->isParam('sql')) throw new Fehler(10,'Das Parameter-Objekt ist unvollständig!','mysqlDZ-schreiben',FALSE);
$sql=$p->get('sql');
if (($this->startswith($sql,'UPDATE')==TRUE)||($this->startswith ($sql,'INSERT')==TRUE)){
// UPDATE oder INSERT
if (@mysql_query($sql)!=TRUE){
throw new Fehler(11,'Fehler beim Ausführen der SQL-Anweisung!', 'mysqlDZ-schreiben',FALSE);
} } else{
// FEHLER throw new Fehler(12,'Das SQL-Statement muss mit UPDATE oder INSERT beginnen!','mysqlDZ-schreiben',FALSE);
} } private function startswith($str,$wert){
return strtolower(substr($str,0,strlen($wert)))==strtolower($wert);
} }
?>
Listing 4.55: Datenbankzugriff mit objektorientiertem Fehlermanagement (Forts.)
Trang 15Das Testskript für die Fehlerbehandlung aus Listing 4.48 muss nur unwesentlich dert werden Zunächst geht man davon aus, dass der Quellcode erfolgreich abgearbeitetwird Die Abfragen, ob das Öffnen, Schreiben und Lesen erfolgreich war oder nicht, fal-len demnach weg.
verän-Im darauf folgenden Test wurde beim Öffnen der Verbindung das Parameterobjekt $p_ öffnen nicht vollständig gefüllt; der Parameter für das Passwort wurde weggelassen Das
PHP-Skript beantwortet dies mit der folgenden Meldung:
Fatal error: Uncaught Fehler Nr 2<br>in Methode mysqlDZ-öffnen<br>Das Parameter-Objekt ist unvollständig!<br> thrown in mysqlDZ.inc.php on line 9
Es wurde also in Listing 4.55 der Fehler Nummer 2 erzeugt Die Öffnen-Methode wurde abgebrochen Dann wurde festgestellt, dass der Quellcode nicht in einem try/catch-Block
ausgeführt wurde Das entstandene Fehlerobjekt konnte dadurch nicht abgefangen den Dies führt zum Abbruch der Abarbeitung des Skripts und zur Ausgabe der Mel-dung
wer-Um einen Fehler abzufangen, versuchen Sie nun, den Quellcode erfolgreich
auszufüh-ren Dazu wird er in eine try-Konstruktion geschrieben Dieser Code wird in Listing 4.56
fett dargestellt Sie erkennen, dass der Code nicht durch Fehlerabfragen unterbrochenwird
<?php require_once("classloader.inc.php"); ?>
<html><body>
<?php $db=new mysqlDZ();
try{
// 1 öffnen $p_öffnen=new ParameterListe();
$p_öffnen->add('host','localhost'); $p_öffnen->add('user','root');
$p_öffnen->add('pass',''); $p_öffnen->add('db','boerse');
$db->öffnen($p_öffnen);
// 2 schreiben $p_schreiben=new ParameterListe();
$p_schreiben->add('sql','UPDATE ag SET name="Dopatka AG" WHERE ID=6');
$db->schreiben($p_schreiben);
// 3 lesen $p_lesen=new ParameterListe();
$p_lesen->add('sql','SELECT ID,name FROM ag ORDER BY ID');
$ausgabe=$db->lesen($p_lesen);
echo 'Anzahl Datensätze:'.count($ausgabe).'<br>';
echo 'Anzahl Spalten:'.count($ausgabe[0]).'<br>';
foreach($ausgabe as $index => $datensatz){
Listing 4.56: Objektorientierte Fehlerbehandlung beim Datenbankzugriff