phpbar.de logo

Mailinglisten-Archive

[php] DB-Zugriff bei OO in php4

[php] DB-Zugriff bei OO in php4

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Mon Dez 12 21:11:32 CET 2005


Hi Henning,

Am Montag, 12. Dezember 2005 14:37 schrieb Henning Heil:
> gut. Ich habe schon einiges von Deinen Informationen gelesen, bei Leibe
> aber leider noch nicht alles. Ich werde mal etwas konkreter
>
> hier mal das ursprüngliche und aktuelle Datenmodell:
> http://fastview.motorcityone.com/?uid=63
> und ein wenig neuer(er) code: http://nopaste.php-q.net/177931

ok, also bildet die Klasse im Prinzip eine Datenbanktabelle ab. Dann sehe ich 
schon klarer. :-) Dann kann ich auch einen Vorschlag für die Auflösung des 
logischen Widerspruchs machen, den ich darin sehe, daß man fast alle 
Objekteigenschaften einerseits über den Konstruktor und die set-Funktionen 
sowie andererseits über die Funktion readWishlist() füllen kann. Durch diese 
zwei Wege, die Objekteigenschaften zu initialisieren und nachträglich zu 
ändern bzw. zu überschreiben, besteht die Gefahr, daß die Daten im Objekt 
inkonsistent werden, auch in Hinblick auf die Datenbank.

In Hinblick auf die Datenbank gibt es ja nur zwei Fälle: neue Wunschliste 
anlegen, bestehende Wunschliste einlesen. Daraus folgt, daß der Konstruktor 
für einen neuen Datensatz nur die Werte Status, Name und Passwort akzeptieren 
darf und für einen bestehenden Datensatz nur die UID der Wunschliste aus der 
Datenbank.
Wird eine neue Wunschliste angelegt, ermittelst Du vor dem INSERT-Befehl halt 
kurz die zu vergebende ID aus der Datenbank und speicherst diese nach dem 
Absetzen des INSERT-Befehls auch direkt im Objekt ab ($S_wishlistUID).
Wenn Du eine bestehende Wunschliste einlesen willst, liest Du über die 
übergebene ID den entsprechenden Datensatz mit readWishlist() in das Objekt 
ein. Name und Passwort können dann über die set-Methoden geändert und mit 
saveWishlist() in die Datenbank zurückgespeichert werden.
In keinem Fall darf also die UID von außen durch eine set-Methode änderbar 
sein!

Dabei fällt mir gerade noch was auf: Wenn die Klasse quasi eine 
Datenbanktabelle abbildet, dann mußt Du auch die Variablentypen zur Datenbank 
konform halten. $S_wishlistUID müßte also $I_wishlistUID sein (ich bemerke 
übrigens gerade, daß beides in der Klasse vorkommt, was sicher nur ein 
Flüchtigkeitsfehler ist). Außerdem mußt Du z.B. in 
setName($S_wishlistNewName) eine Prüfung durchführen, ob die übergebene 
Zeichenkette auch nicht die maximale Länge des Datenbankfelds von 255 Zeichen 
überschreitet. Dieselbe Prüfung mußt Du natürlich auch durchführen, wenn die 
Daten über den Konstruktor übergeben werden. Daher denke ich, daß - entgegen 
meinem Vorschlag - hier in diesem Fall Name und Passwort nicht über den 
Konstruktor übergeben werden sollten, sondern eben dann doch über die 
set-Methoden, weil diese ja noch zusätzliche Datenprüfungen enthalten und Du 
diese Prüfungen sinnvollerweise nicht im Konstruktor doppeln wirst. Der 
Konstruktor würde dann also optional nur eine UID übergeben bekommen.


> Meine Lösung für die saveWishlist()-Methode ist oben im code, gibt es
> dazu weitere Verbesserungsvorschläge?

In der Zeile 

	".mysql_real_escape_string($this->I_wishlistState).", 

kannst Du das mysql_real_escape_string weglassen. Das Feld ist ja vom Typ 
Integer. :-)

Bei der Funktion saveWishlist($I_wishlistUID, $DBlink) kann Du den Parameter 
$I_wishlistUID weglassen. Hier schlägt das prozeduralen Denken durch, daß 
einen einfach nicht loslassen will, wenn man auf OOP umsteigt. ;-) Du 
brauchst den Wert nämlich gar nicht zu übergeben, weil Du ihn doch schon im 
Objekt hast bzw. vor dem INSERT ermittelst: $this->I_wishlistUID ... :-)

Und die Zeile

	$I_saveWishlistResult = mysql_insert_id($DBlink);

muß wie folgt aussehen, weil ja die UID auch im Objekt, d.h. in der 
entsprechenden Objekteigenschaft, abgespeichert werden muß:

	$this->I_wishlistUID = mysql_insert_id($DBlink);


> Schwierigkeiten hatte ich mit
> dem DB link: im Namensraum der Klasse ist er ja anscheinend nicht
> bekannt, ich habe ihn daher mit übergeben. Gibt's da eine Alternative? [1]

[...]

> [1]: meine nette kleine $debug-Variable zum ein-/ausschalten der
> debugging-Ausgaben funktioniert ja auch nicht mehr, wäre in diesem Fall
> eine (super)Globale angebracht?

Eigentlich sehe ich bei Deiner Klasse nur diese zwei Möglichkeiten für $DBlink 
und $debug: Übergabe als Funktionsparameter oder Verwendung einer globalen 
Variablen. Oder Du müßtest das Ganze eben etwas anders ansetzen.


Viele Grüße
Lutz

php::bar PHP Wiki   -   Listenarchive