1. Trang chủ
  2. » Công Nghệ Thông Tin

PHP – Endlich objektorientiert- P11

30 240 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề PHP – Endlich objektorientiert- P11
Trường học University of Applied Sciences Kaiserslautern
Chuyên ngành Computer Science
Thể loại Lecture Notes
Thành phố Kaiserslautern
Định dạng
Số trang 30
Dung lượng 576,49 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

Der 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 2

Realisierung 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 3

Auf 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 4

Realisierung 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 5

dem 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 6

Realisierung 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 7

Listing 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 8

Realisierung 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 9

Der 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 10

Objektorientierte 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 11

Methode 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 12

Fehlerobjekt 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 13

ungü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 15

Das 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

Ngày đăng: 29/10/2013, 02:15

TỪ KHÓA LIÊN QUAN