Learn PHP3
Learn PHP3
19,80 DM
PHP-Power
mit CD
fürs Web
Tools for Business
19,80 DM
Anzeige
LE_PHP (3-14) 23.08.2001 10:11 Uhr Seite 3
große Rolle spielt, will dieser Artikel zeigen. Mitbegründer von Zend Technologies
Community
14 PHP-Community bündelt ihre Kräfte
Der neugegründete PHP Verein stellt sich
vor
15 „Wir wollen ein Bindeglied sein“
15 Interview mit Ulf Wendel, Georg Richter,
Mit der rasanten Verbreitung von PHP suchen immer mehr Nut- Jörg Behrens und Thomas Fromm
zer nach Hilfestellung. Der neu gegründete PHP e.V. möchte Mitglieder des neu gegründeten
professionelle und private Anwender vernetzen, um Hilfestel- PHP-Vereins
lung zu leisten, Erfahrungen auszutauschen und die Akzeptanz
von PHP zu stärken. Am Rande des LinuxTags 2001, auf dem Start up
der Verein gegründet wurde, sprachen wir mit dem frisch ge-
wählten Vorstand. 18 PHP in fünf Minuten
Eine kleine Einführung
68 Ein Bild sagt mehr als 1.000 Worte 50 Schnelligkeit durch Faulheit
Dynamische Grafiken mit GD
Mit dem PEAR Cache Modul steht für
PHP-Skripte ein universeller Datencache
Datenbanken zur Verfügung, der zum Caching von
Daten beliebigen Typs verwendet wer-
73 Open Source Alternative den kann.
PostgreSQL als Alternative zu kommerziel-
len Datenbanken und MySQL
Editorial
End Produkte umsteigen. Wir geben Ihnen beispiels-
Higher & High End weise eine Einführung in den Zugriff auf Oracle Daten-
banken via PHP.
Es ist kein Geheimnis, dass das Internet im Prinzip ein In unserer Rubrik Solutions stellen wir Ihnen Anwen-
einziges großes Open Source Projekt ist. Standards dungen vor, die auf der Basis von PHP realisiert wurden.
und Protokolle sind offen beziehungsweise die für die Wer mit seiner Website ein ausgeklügeltes Customer
Realisierung von Websites erforderlichen Technologien Relationship Management betreiben möchte, findet
stehen als Open Source Software oder als kommerziel- Anregungen, wie sich mit PHP und MySQL Web Com-
le Produkte, die auf im freien Prozess entwickelten munities umsetzen lassen. Auch wenn es um Team-
Sprachen basieren, zur Verfügung. work via Internet geht, hat PHP einiges zu bieten. Wir
Was der Apache Webserver mit seinem Marktanteil von stellen Ihnen eine Groupware-Lösung vor, die in PHP
mehr als 60 Prozent im Hinblick auf die leistungsfähige programmiert ist.
Infrastruktur im Hintergrund ist, ist die Skriptsprache eBusiness sowie Kommunikation und PHP katapultiert sich
PHP, wenn es darum geht, aus statischen Dokumenten Interaktion via Internet sind auf Techno- nach vorn
dynamische Seiten und Applikationen zu generieren. logien angewiesen, die stetig mit den
Dabei besticht PHP sowohl durch geringe Einstiegs- Anforderungen wachsen. PHP hat sich bei der Erstel-
hürden als auch durch Skalierbarkeit bis hin zum High lung von dynamischen Webapplikationen bereits be-
End Einsatz. währt – und entwickelt sich mit den neuen Herausfor-
derungen der eEconomy weiter.
Leistungsfähigkeit im eBusiness
Wir wollen Ihnen in unserem PHP-Sonderheft die Leis- Viel Erfolg!
tungsbreite der Skriptsprache darstellen, indem wir Ih-
nen zeigen, welche Möglichkeiten sich durch den Ein-
satz von PHP im eBusiness ergeben. Wir stellen Ihnen
leistungsfähige Profi-Tools und Informationsquellen
vor und geben Ihnen Einblicke in die aktuellen Trends
innerhalb der PHP Community. In Interviews kommen
Entwickler aus der Community sowie Anbieter profes-
sioneller Software zu Wort, sodass Sie sich ein Bild da-
von machen können, was PHP zu bieten hat und wo die
Entwicklung hinführen wird.
Anzeige
LE_PHP (3-14) 23.08.2001 10:12 Uhr Seite 10
es, PHP weiter Wir hoffen, dass bereits erhältliche und zu-
künftige Zend-Produkte, sowie unsere
Unterstützung von PHP dabei hilfreich
sind, PHP den kommerziellen und Unter-
nehmensmarkt besser zu erschließen. Die
LE: Können Sie uns erklären, wie der LE: Welche Verbesserungen erwar-
Zend Subscription-Plan funktio-
niert?
„Viele Leute waren sicherlich ten Sie in der nahen Zukunft von PHP?
Und wie wird Zend diese Entwicklung
Suraski: Wie bereits erwähnt, erstaunt darüber, dass Zend unterstützen?
wurde die Zend Developer Server Suraski: Im User-Layer sind die
Suite für die Belange der Entwick- für seine Produkte Geld will.“ hauptsächlichen Verbesserun-
ler gestaltet. Sie sollen gen durch PEAR bereits erreicht
hierdurch Zend-Produkte und worden. PEAR hat ambitionierte
Services erhalten, damit sie PHP-Applika- ben kommerzieller Unternehmen richtet. und weitreichende Ziele, und ich bin ge-
tionen entwickeln und einsetzen können. LE: Die Verschlüsselungs-Engine, die dazu ge- spannt darauf, inwieweit diese erreicht
Die Suite enthält sowohl kleine als auch nutzt wird, PHP-Programme zu verschlüsseln, werden. Auf dem Sprachlevel sind wir da-
umfangreiche Versionen und außerdem ist aus der Sicht der Open-Source-Gemeinde bei, Exception Handling zu integrieren,
Updates über das ganze Jahr weg. Gerade kontraproduktiv. Warum bieten Sie eine solche und – auf längere Sicht – wollen wir die
für Produkte wie das Zend LaunchPad und Applikation an, und für welche Art von User ist Objektorientierung sowie die Java/.NET-
die Zend IDE, die sehr häufig verbessert diese gedacht? Integration verbessern.
und als Update veröffentlicht werden, Suraski: Auf den ersten Blick mag es tat-
schien uns dies der effektivste Weg zu sein, sächlich so erscheinen, aber das ist nicht
um diese Software anzubieten. ganz zutreffend. Wir haben bereits seit ein
paar Jahren wiederholt Rückfragen eini- Unser Gesprächspartner
Zeev Suraski hat bereits während seiner Tätigkeit
LE: Ist die Kombination mit proprietären Add- ger Unternehmen erhalten, die darum ba-
für das Web Development bei Netvision, Israels
Ons und Support Ihrer Meinung nach die einzige ten, dass wir einen Mechanismus zur Dis- größtem Internet Service Provider, einige Erfahrun-
Möglichkeit, um im Feld der Open-Source- tribution von proprietärem PHP-Code gen mit PHP/FI gesammelt. Zusammen mit Andi
Software Geld zu verdienen? zur Verfügung stellen. Tatsache ist, dass Gutmans wählte er es für ein Universitäts-Internet-
Suraski: Sie haben Recht, davon sind wir viele Firmen sich deswegen von PHP dis- Projekt aus. Später entwickelten Suraski und Gut-
überzeugt. Im allgemeinen sind Support- tanziert haben, weil es nicht möglich war, mans u.a. die Zend Engine, die PHP 4.0 unterstützt.
basierte Geschäftsmodelle sehr schwierig proprietären Code auszuliefern. Auf die- Suraski designte auch andere PHP 4.0-Komponen-
zu implementieren – gerade in einem Um- ses Anliegen sollte man aber nicht damit ten. Im Jahr 1999 gründete er zusammen mit ande-
feld, das zuverlässige Software produziert, reagieren, die Firmen zu drängen, ihren ren Entwicklern Zend Technologies. Suraski war im
wie das Open-Source-Umfeld. Der Sup- Code offenzulegen. Wir glauben an das Jahr 1999 für den GNU 1999 Free Software Award
nominiert. Er erhielt außerdem weitere Auszeich-
port ist in vielen Fällen gar nicht unbedingt BSD-Modell – ich meine damit: Jeder
nungen für seine Arbeit.
notwendig, und die meisten werden wahr- kann mit dem Code machen, was er will,
scheinlich ohne ihn weiterarbeiten. Den- ob nun als Open Source oder proprietär. Das Unternehmen
noch ist es nach wie vor wichtig, Support Wir mögen den Open-Source-Gedanken, Zend Technologies Ltd. wurde im Oktober 1999 ge-
anzubieten, auch wenn er nicht immer pro- aber wir wollen niemanden dazu zwingen, gründet – die Anfänge des Unternehmens liegen je-
fitabel ist: Er ermöglicht es dem Produkt, in seinen Code offenzulegen, der das gar doch bereits im Jahr 1997. Hier engagierten sich
Gebiete zu gelangen, die ihm ansonsten nicht will. Denn es hat nichts mit Freiheit die Gründer Zeev Suraski und Andi Gutmans im PHP-
verschlossen wären – die Unternehmens- zu tun, wenn man jemanden dazu zwingt, Core-Development-Team und wurden zu dessen
Märkte. Viele Unternehmen hätten nicht seinen Code offenzulegen. wichtigsten Mitgliedern.
einmal darüber nachgedacht, PHP zu be- Den Zend Encoder Unlimited haben Zend Technologies Ltd. ist ein Software-Unterneh-
nutzen, wenn die Option auf einen kom- wir entwickelt, um diesem kommerziellen men, das seinen Schwerpunkt im Bereich der Inter-
merziellen Support nicht existieren würde. Interesse zu begegnen, und nicht, um be- net-Infrastruktur sieht. Es stellt Produkte für Unter-
nehmen sowie Services für PHP zur Verfügung.
Es ist sehr wahrscheinlich, dass die Unter- reits offenen Code wieder zu verschlüsseln.
Zend bietet Lösungen für Unternehmens- und kom-
nehmen, wenn sie damit beginnen PHP Hier liegt auch einer der Gründe dafür,
merzielle Applikationen an, wo Kriterien wie die Ti-
einzusetzen, bemerken, dass sie keinen zu- weshalb wir Gebühren für das Produkt
me-to-market, eine hohe Website-Performance so-
sätzlichen Support brauchen. Hätte es je- entrichten. Ein freies Verschlüsselungstool wie der Schutz von Intellectual Property eine große
doch keine Option auf einen Support gege- widerspricht tatsächlich den Zielen von Rolle spielen.
ben, dann hätten sie PHP wahrscheinlich Open Source, weil es die Leute geradezu er-
Community PHP-Verein
PHP-Community
kumentieren. Die Planungen für das PHP-
Zertifikat werden Anfang nächsten Jahres
beginnen und Vereinsmitglieder sowie
Nichtmitglieder aus allen Bereichen ein-
binden.
bündelt Kräfte
Wer Beratungstätigkeit benötigt, die
über das hinaus geht, was die PHP Com-
munity leisten kann, der kann sich an den
PHP Verein wenden. Beispielsweise kann
der PHP Verein Beratungen zu den vielfäl-
tigen, kaum überschaubaren Lizenzen der
von Ulf Wendel Open-Source-Welt geben, aber auch bei
fachlichen Fragen weiterhelfen. Fachwis-
sen aus der Community kann durch die
Der neugegründete PHP Verein stellt sich vor Vernetzung der einzelnen Kräfte allen
Mitgliedern zur Verfügung gestellt wer-
den.
Mitglieder der PHP-Gemeinschaft
Am Rande des LinuxTag 2001 wurde ein PHP Verein gegrü[Link] Verein, welcher die Gemein- dürfen sich auf die Organisation von
nützigkeit anstrebt, dient zur Förderung und Verbreitung der Webskriptingsprache [Link] soll mehrtägigen Treffen freuen, von denen ein
erreicht werden durch die Förderung von Aus- und Weiterbildung, Koordination von Aktivitäten, erstes für den Sommer 2002 geplant ist. In
diesen Tagen beginnt die Suche nach ge-
Öffentlichkeitsarbeit sowie die Veranstaltung und Förderung von Tagungen und [Link]
eigneten Veranstaltungsorten. Jungauto-
Angebotspalette soll eine sehr breite Zielgruppe ansprechen, die von PHP begeisterten Laien und ren können sich an den Verein wenden,
Schülern bis hin zu Firmen und Trägern öffentlicher Bildungseinrichtungen reicht. falls sie mithelfen möchten, PHP verstärkt
in der Presse zu präsentieren. Der Verein
wird seine Pressekontakte gerne zur Ver-
fügung stellen und sich auch selbst bemü-
hen, PHP einer breiteren Basis bekannt zu
machen.
Eine eigene Publikation, der PHP-Al-
Der Verein besteht aus einem fünfköpfi- wuchsförderung zu betreiben. Im Falle ei- manach, soll PHP-Begeisterte mit Infor-
gen Vorstand (siehe auch Interview), dem ner Fachhochschule ist eine kostenneutra- mationen versorgen. Ausführliche Fach-
ein sieben Personen starkes Beratergre- le, offene Vortragsreihe angedacht, die bei artikel, die in einem Magazin nicht
mium zur Seite steht. Aufgabe des vom hinreichender Resonanz in einem Informa- möglich sind, Erfahrungsberichte, Nach-
Vorstand bestimmten „Advisory Boards“ tionstag endet, an dem sich auch die regio- richtenübersichten, Termine und Vereins-
ist die Beratung und in einem gewissen nale Wirtschaft beteiligen kann, um sich notizen sollen in der Periodika erscheinen.
Maße auch die Kontrolle des Vorstands. vorzustellen und Arbeitskräfte zu werben. So werden beispielsweise die Ergebnisse
Zu den Angeboten des Vereins zählen Die Zusammenarbeit mit anderen Interes- der Wahl zum PHP-Projekt des Jahres prä-
PHP-Schulungen und Workshops, Bera- senvertretungen, beispielsweise PingOS sentiert und die Bestplatzierten erhalten
tungstätigkeiten und die Vermittlung von und Schulen ans Netz, wird angestrebt, um die Möglichkeit, sich vorzustellen. Die Su-
Ansprechpartnern. Weiterhin ist langfris- die Angebote attraktiver gestalten zu kön- che nach einem Partner aus der Fachpresse
tig geplant, ein PHP-Zertifikat, ähnlich nen. für den Wettbewerb beginnt in diesen Ta-
dem GNU Linux-Zertifikat, zu erarbei- Langfristig sollen die Fortbildungsan- gen.
ten, einen PHP-Almanach herauszugeben gebote von einem industriell anerkanntem Wer mehr über den PHP-Verein erfah-
und noch dieses Jahr das PHP Projekt des PHP-Zertifikat begleitet werden. Das Zer- ren möchte, findet auf der im Aufbau be-
Jahres zu küren. fitikat könnte dreistufig aufgebaut sein findlichen Homepage [Link] wei-
Die Schulungsangebote wenden sich und von der Abfrage von allgemeinem tere Informationen. Während Mitglieder
nicht nur an Firmen, die von den Kontakten Grundwissen bis hin zur Abfrage des not- auf einer eigenen Mailingliste diskutieren
des Vereins zu Spezialisten profitieren kön- wendigen Wissens zur Erweiterung der können, müssen sich Interessenten noch
nen, sondern auch an öffentliche Bildungs- Skriptsprache selbst reichen. Ziel ist es, etwas gedulden, bis sie die Informationen
einrichtungen. So wurden bereits drei Wo- Entscheidungsträgern in der Wirtschaft per Mail erhalten. Wer mag, kann auch
chen nach Gründung des Vereins eine Orientierungshilfe bei der Auswahl dem IRC Channel #[Link] einen Be-
Gespräche mit zwei Fachhochschulen und von Arbeitskräften zu geben und Selbst- such abstatten, in dem meist mehrere Vor-
einer Schule aufgenommen, um Nach- ständigen zu helfen, ihr Fachwissen zu do- standsmitglieder vertreten sind.
Bindeglied sein“
tent des Vorstands in den Bereichen
Controlling, Finanzen, Investor Relation
bei der KnowOne AG.
Ulf Wendel: Der Posten des Schriftfüh-
rers wird von Thomas Fromm bekleidet.
Thomas dürfte vielen Lesern als Oracle-
von Sebastian Bergmann Spezialist bekannt sein.
Thomas Fromm: Spezialist? Lieber be-
geisterter Oracle User. Dass ich kein Spe-
zialist bin, hat mir Thies Arntzen gerade
Mit der rasanten Verbreitung von PHP suchen immer mehr Nutzer nach [Link] neu ge-
wiedermal gezeigt. (lacht)
gründete PHP e.V.möchte professionelle und private Anwender vernetzen, um Hilfestellung zu Ulf Wendel: Ich schätze Thomas, weil er
leisten, Erfahrungen auszutauschen und die Akzeptanz von PHP zu stä[Link] Rande des Linux- in hektischen Momenten einen ruhigen
Tags 2001, auf dem der Verein gegründet wurde, sprachen wir mit dem frisch gewählten Vorstand. Kopf bewahren kann. Die Presse und Öf-
fentlichkeitsarbeit wird von Georg Rich-
ter geleitet. Georg war einige Jahre als
Pressereferent im Sportbereich für ver-
schiedene Vereine und Verbände tätig, so
zum Beispiel als Pressereferent für den
Billard-Landesverband-Südwest, oder
als Organisator und Pressesprecher von
über 30 internationalen Billard- und
Linux Enterprise: Herr Wendel, Sie wurden auf Schachturnieren, vom Grand-Prix bis
der Gründungsversammlung des PHP e.V. als hin zum Weltcup.
erster Vorsitzender in den Georg Richter: Bei seiner Arbeit kann der
Vorstand gewählt. Bitte Vorstand auf die Unterstützung des Ad-
stellen Sie sich und die an- visory Boards bauen. Dieses setzt sich zu-
deren Vorstandsmitglieder sammen aus Thies C. Arntzen, Hartmut
kurz vor. Holzgraefe, Kristian Köhntopp, Sascha
Ulf Wendel: Der Vor- Schumann für technische Fragen, Adrian
stand besteht auf fünf Hardt für rechtliche Aspekte, Thomas
Personen: dem ersten Weinert als Ansprechpartner für die
und zweiten Vorsitzen- PHP-Usergroups und zu guter Letzt Du,
den, dem Kassenwart, Sebastian, um mich bei der Pressearbeit
einem Schriftführer und zu entlasten.
einem Pressereferenten. Ulf Wendel: Über mich gibt es nicht viel
Der Posten des zweiten zu sagen. Die meisten werden mich ken-
Vorsitzenden wird von nen durch meine Arbeit an der PHPLIB,
Jörg Behrens bekleidet. am PEAR-Projekt oder das – leider noch
Die Leidenschaft von unvollendete – Tool PHPDoc. All diese
Jörg ist es, am Ende eines Tages seine Personen sind wohl bekannt in der deut-
IRIX-Maschinen staunend anzuschauen, schen PHP Community.
PHP in fünf
nem Windows-Editor arbeiten, achten Sie
darauf, die Seite im Text-Format zu spei-
chern und an die Extension .php nicht
noch die von Windows-Editoren so ge-
liebte Endung .txt zu hängen.
Hallo Welt mit PHP <? $a=“Hallo Welt“; Wenn Sie die Seite erfolgreich geladen
Der Apache-Webserver durchsucht PHP- echo $a; ?> haben, sollten Sie sich den Quelltext im
Dokumente nach ausführbaren Program- Browser ansehen, hier steht jetzt reiner
mier-Befehlen. Findet er derartige Befeh- Der Echo-Befehl bewirkt eine Ausgabe HTML-Text:
le, so führt er sie aus und fügt die an den Browser.
Ausgaben in die vom Benutzer angefor- Um wie in diesem kurzen Beispiel den <HTML><HEAD><TITLE>Testprogramm</TITLE></HEAD><BODY>
derte HTML-Seite ein. Alle PHP-Pro- Text „Hallo Welt“ per PHP-Befehl auszu- <CENTER><H1>Testprogramm</H1></CENTER>
gramme erzeugen immer Seiten in korrek- geben, müssen Sie aber die beiden Zeilen Hallo Welt
</BODY></HTML>
ter HTML-Syntax. in eine komplette HTML-Seite einbin-
Je nach Konfiguration erkennt Apache den:
PHP-Seiten an den speziellen Endungen Variablen in PHP
.php, phtml, php3 oder php4 oder durch- <HTML><HEAD><TITLE>Testprogramm</TITLE></HEAD><BODY> In dem Beispiel taucht eine Variable a$
sucht jede .html-Seite nach für ihn ausführ- <CENTER><H1>Testprogramm</H1></CENTER> auf. Variablen kennzeichnet man durch
baren PHP-Befehlen. PHP-Befehle grenzt <? ein vorangestelltes $-Zeichen. PHP kennt
$a=“Hallo Welt“;
man durch einen speziellen Tag vom reinen drei Variablentypen:
echo $a;
HTML-Code ab, dieser spezielle Tag be-
?>
ginnt und endet mit einem Fragezeichen: •String $a=“5“
</BODY></HTML>
•Real $a=5.0
<? $a=5; ?> •Integer $a=5
Speichern Sie diese Seite unter dem
Innerhalb der spitzen Klammern kön- Namen [Link] im Wurzelverzeich- PHP ordnet Variablen automatisch ei-
nen beliebig viele PHP-Befehle stehen, die nis Ihres Apache-Webservers, meist nen Datentyp zu. Verwenden Sie stets die
man jeweils mit einem Semikolon beendet: /usr/local/httpd/htdocs. Falls Sie mit ei- richtige Verknüpfung.
• + – Addition $a=“Hallo“;
• - – Subtraktion $$a=“Welt“;
• * – Multiplikation
• / – Division Das doppelte $ macht den Wert von $a
• % – Modulo zum Variablenbezeichner. Die zweite Zei-
le hat also den gleichen Effekt wie:
Sie selber müssen darauf achten, dass
Sie die richtige Verknüpfung wählen. Defi- $Hallo=“Welt“;
nieren Sie für das folgende Beispiel bitte
die Variablen: Noch ungewöhnlicher ist der Umgang mit
Arrays. Diese werden dynamisch und sehr
$a =“Hallo „; flexibel angelegt:
$b=“Welt“;
$a[0]=“Hallo“;
$a[1]=“Welt“;
Anzeige
Wenn Sie diese Variablen mit „+“ ver-
knüpfen, würde Apache „0“ ausgeben,
da PHP die Inhalte als Zahlen interpre- legt ein Feld mit zwei Komponenten an,
tiert: das aber jederzeit erweitert werden kann.
Die Definition hätte man auch abkürzen
echo $a+$b können mittels:
Startup
•Festes Einlinken von PHP in den WWW-Server
Dadurch wird PHP ein fester Bestandteil des Servers. Diese
Vorgehensweise ist einfach und auch in allen Schritten ausführ-
lich in der Dokumentation zu PHP beschrieben. Sie hat den
Nachteil, dass für jede neue Version von PHP auch der Server
neu zu übersetzen ist.
•Einbinden als DSO (dynamic shared object)
Hier wird PHP zu einem dynamisch ladbaren Modul des WWW-
Servers. Diese Art ist nicht aufwändiger, hat jedoch den großen
Vorteil, dass eine neue PHP-Version sehr viel einfacher zu instal-
lieren ist, weil nicht der gesamte WWW-Server neu übersetzt
werden muss. Ein Übersetzen der neuen PHP-Version mit an-
schließendem Kopieren des dynamisch ladbaren Moduls genügt,
um in den Genuss der neuen PHP-Version zu kommen.
Wichtig für die Konfiguration von PHP als DSO Modul ist
hierbei --with-apxs. Damit wird die Übersetzung von PHP als
DSO-Modul vorbereitet und die Makefile’s entsprechend erzeugt.
Dabei müssen keinerlei Sourcen von Apache selbst mehr vorhan-
den sein, es genügt die installierte Binärversion. Man beachte auch
die Verwendung von ./configure (mit Pfadangabe), statt des kürze-
ren configure v.a. aus Sicherheitsgründen: Zum einen ist sicherge-
stellt, dass wirklich das gewünschte configure Skript verwendet
wird, zum anderen sollte sich „.“, also das aktuelle Verzeichnis,
nicht im Pfad befinden.
Optionen, Optionen,...
Das ./configure-Skript versteht eine Menge von Optionen, vor al-
lem um die diversen Schnittstellen von PHP einzustellen. Einen
Überblick über alle möglichen Optionen liefert ein ./configure --
help. Das Skript versucht zwar herauszubekommen, welche Pro-
gramme auf dem lokalen Rechner installiert sind und zu welchen
entsprechende Schnittstellen sie in PHP eingebunden werden kön-
LE_PHP (15-24) 23.08.2001 10:14 Uhr Seite 22
PHP goes
Verbindung mit dem ZendCache, da hier
der Kompilierungsschritt nur einmalig
ausgeführt wird. Im Gegensatz zur Zend
Engine ist der ZendOptimizer, ebenso
wie die nachfolgenden kommerziellen
Zum ZendCache existieren zwei Open darunter auch eine Klasse zur Daten- dass der Server mit ZendCache eine Load
Source Software Alternativen: Der Alter- bankabstraktion sowie eine Template von ungefähr drei erreicht, was dem
native PHP-Cache (APC, [Link] Engine. durchschnittlichen Wert von Produk-
[Link]/) und der afterBUR- Während des Benchmarks wurde der tionsservern entspricht. Getestet wurden
NER Cache ([Link] it/). Server (Intel Pentium III 500 MHz, 256 die Versionen bware afterBURNER Ca-
Die nachstehende Grafik zeigt das Ergeb- MB Ram, SuSE 7.1, Linux Kernel 2.4.2, che 0.7, APC 1.0.8, sowohl in der mmap-
nis eines Benchmarks, in dem die drei ge- Apache 1.3.17, PHP 4.0.4pl1 und dem je- als auch in der Shared Memory-Variante
nannten PHP Caching-Systeme miteinan- weils getesteten Caching System) in 100 und der ZendCache 1.0.0.
der verglichen worden sind. Für diesen Durchläufen mit insgesamt 10.000 Anfra- PHP-Entwickler, die ihren Kunden ei-
Benchmark kam zum einen die Web- gen beschickt, von denen jeweils zehn nen Blick auf den Quelltext ihrer Produkte
server-Benchmark Software httperf (www. gleichzeitig abgesetzt wurden. Zur Wahl nicht erlauben möchten, bekommen mit
[Link]/personal/David_Mos-berger/ der Testbedingungen: Bereits nach den dem ZendEncoder ([Link]/
[Link]) zum Einsatz, zum anderen ersten Tests zeichnete sich die klare Über- store/products/[Link]) nun ein
eine repräsentative PHP-Anwendung, legenheit des ZendCache ab. Daher wur- eigens für diese Aufgabe entwickeltes Hilfs-
die mehrere Bibliotheken inkludiert, den die httperf-Parameter so gewählt, mittel an die Hand. Mit Hilfe des ZendEn-
coders erzeugt man aus seinen PHP-Quell-
texten verschlüsselten Bytecode, den man
an seine Kunden ausliefern kann. Auf dem
Webserver des Kunden sorgt der ZendOp-
timizer (siehe oben) dafür, dass der ver-
schlüsselte Bytecode ausgeführt wird.
Eine Lizenz für den ZendEncoder Un-
limited kostet 2.400 US-Dollar.
Mit der ZendIDE ([Link]/
store/products/[Link]) stellt Zend
die erste kommerzielle, auf PHP zuge-
schnittene integrierte Entwicklungsum-
gebung (IDE) vor. Diese besteht aus zwei
Programmteilen: Zend DebugServer und
dem ZendIDE Client. Während sich der
DebugServer für den Entwickler „un-
sichtbar“ auf dem Server in die ZendEn-
gine integriert, arbeitet man mit dem in
Java geschriebenen ZendIDE Client
Abb. 2: PHP-
Debugging mit plattformunabhängig an seinen PHP
ZendIDE Projekten.
und Editoren
der die PHP-Community stützen möchte
und professionellen Anwendern ebensol-
chen Support zukommen lassen will. Auf
der Website finden sich neben guten Tuto-
rials, Foren und News auch die Produkte
von Ulf Wendel Zend Cache und Zend IDE. Wie bereits in
einer früheren Ausgabe diskutiert, kann
der Einsatz des kommerziellen Zend Ca-
Die besten Quellen rund um PHP che dramatische Geschwindigkeitssteige-
rungen bewirken.
Wer Tutorials sucht, ist mit
[Link] gut bedient. Regel-
mäßig tauschen Entwickler ihre Gedanken
und Erfahrungen aus und präsentieren ne-
ben hilfreichen Tipps auch mal Irrwege,
Vor vier Jahren bestand noch keine Gefahr, Die Reise durch den Hyperspace startet aber der Lerneffekt ist garantiert.
stets auf der Homepage von PHP, In Deutschland bilden [Link]-
dass beim Ausdruck des PHP-Manuals die Tin-
[Link]. Quelltexte, Downloads, [Link] und [Link] die
tenpatrone ersetzt werden [Link] weni- Manual, Mailinglisten, Bücherliste und interessantesten Portale. Beide sind voll-
gen Zentimetern Papier stoppte der Drucker, alles was das Herz begehrt, befindet sich wertige Portale mit allerlei Informationen
und ein Abend reichte aus, um sich einen auf diesem Eintrittspunkt in die PHP- von News über Installationstutorials bis
Welt. Einsteiger wie Profis freuen sich hin zu Skriptsammlungen. Das PHP-Cen-
Überblick über das Material zu verschaffen.
gleichermaßen über die Möglichkeit, ter bietet zusätzlich noch Links zur größ-
Wer heute [Link] nach „PHP“ be- durch Anwahl der URL [Link]/ ten deutschsprachigen Mailingliste und
fragt, braucht viele Tintenpatronen:„Resultate strstr automatisch zur Manualseite der zum PHP-Kongress [Link] [Link].
1 - 10 von ungefähr 18,000,000“. Funktion strstr() geleitet zu werden, des- Über eine besonders aktive und hilfs-
sen Parameter-Reihenfolge sich selbst bereite Nutzergemeinde verfügt die
mittelt, sondern unter anderem auch Kon- sein, da Entwicklern, die mit diesen Pro- ISBN: 3-4462-1546-8
Dieses Buch widmet sich der derzeit sehr die kurz und knapp die jeweiligen Funk- tionen kurz und gut dargestellt werden.
beliebten Open Source Skriptsprache tionen der einzelnen Sparten, wie bei- Das Buch richtet sich nicht an Anfänger
namens PHP. Die Sprache PHP, die Ab- spielsweise HTTP, Stringoperationen oder Neueinsteiger, da es nicht das Ziel
kürzung steht für Hypertext oder Grafik beschreibt. ist, dem Lesenden die Programmierung
Preprocessor, wird in erster Zu jeder Sparte gibt es mit PHP zu vermitteln. Das Buch sollte
Linie zur Erstellung dynami- außerdem noch eine kom- trotz dessen auf keinem PHP-Program-
scher Webseiten verwendet. pakte Beschreibung, die mierer-Schreibtisch fehlen, da es zu ei-
Das Buch geht im ersten Ka- das entsprechende An- nem günstigen Preis eine nützliche Hil-
pitel auf die Installation und wendungsgebiet kurz zu- festellung zur täglichen Arbeit mit PHP
Konfiguration von PHP ein, sammenfasst. Die Funk- leisten kann.
wobei die verschiedenen tionsreferenz ist nicht Jens Gräfe
Möglichkeiten der Platt- alphabetisch geordnet,
formintegration kurz ge- sondern baut sich nach
nannt werden. Weiterhin den bestehenden Funk-
werden grundsätzliche Infor- tionsklassen auf. Diese
Rasmus Lerdorf,
mationen über Variablen, Datentypen Tatsache ist zu bemängeln, da das Auffin- deutsche Übersetzung von Ingo Marks
und Ausdrücke sowie Kontrollstruktu- den der gewünschten Funktion unter Um-
PHP – kurz & gut
ren und Funktionen übersichtlich erläu- ständen erheblich erschwert wird.
O’Reilly Verlag, 2000
tert. Prinzipiell ist das Buch als Funk-
Die weiteren Kapitel bestehen aus- tionsreferenz und Nachschlagewerk 112 Seiten, DM 14,80
schließlich aus einer Funktionsreferenz, sehr interessant, da die gesuchten Funk- ISBN 3-89721-225-0
Office und Shop, bei denen dem Leser ches Diagramm auf, bei dem von der
PHP 4, Tutorial und weitreichende Kenntnisse der fortge- Rechtschreibprüfung des verwendeten
kussion der beiden großen Projekte My- kludieren. Ebenfalls negativ fällt so man- ISBN 3932311795
ist das 580 Seiten starke Buch in 21 Kapi- kann (z.B. ODBC, Perl, PHP). Die letz- ISBN 3-8272-5850-2
Templates Development
Nachname <input type=“text“ name=“nachname“ value=“
<?php print $nachname; ?>“>
<p>
<input type=“submit“ value=“Namen speichern“>
</p>
</form>
Zeit gewinnen
die Produktdarstellung haben.
Anforderungsanalyse
Das Szenario verlangt vom Programmie-
rer zwei Dinge:
von Ulf Wendel Die erste Forderung ließe sich mit ei-
nem Layout-Manager erfüllen. Ein Lay-
out-Manager ist ein Objekt, welches über
Trennung von Layout und Code eine Grundregel zur Anordnung von dar-
zustellenden Elementen verfügt und an es
übergebene Elemente in einem Zielfor-
mat, z.B. HTML, darstellt. Eine einfache
Grundregel zur Darstellung von Elemen-
ten könnte lauten: Stelle jedes Element
zentriert in einer eigenen Zeile dar. Der In-
formatiker wäre mit einem solchen Ansatz
Es ist paradox:Templates und Template-Klassen In Version 2 trug PHP noch den Namen sehr zufrieden. Die erste Aufgabe ist er-
widersprechen einem der größten Vorteile von „PHP/FI“. FI steht für „Form Interpre- füllt, es steht kein HTML im Programm-
ter“. Durch die Einbindung von PHP in code, es entsteht ein HTML-Dokument,
PHP, der direkten Einbindung in HTML-Doku- das HTML-Formular gelingt es auch heu- und mit einem leicht veränderten Layout
mente, und dennoch sind sie [Link] treibt te noch, bei geringen Programmierkennt- Manager wäre gar PDF als Ausgabefor-
Programmierer dazu, sich mit fremden Skripten nissen eine interaktive Seite zu erstellen. mat möglich.
zu beschäftigen und ihre Programme zu ver- Das „PHP-Normalformular“, welches Leider droht dem Programmierer die
auf sich selbst verweist und die Formular- Kündigung, weil es trotz der raffinierten
langsamen? felder mit übermittelten Werten vorbe- Abstraktion nicht gelungen ist, die Dar-
legt, ist jedem Einsteiger bekannt. stellung von der Programmlogik zu tren-
nen. Der Grafiker des Kunden, welcher
<form action=“<?php print $PHP_SELF; ?>“ method=„post“> weder PHP noch HTML, sondern nur sei-
Vorname <input type=“text“ name=“vorname“ value=“ nen WYSIWYG-Editor beherrscht, ist mit
<?php print $vorname; ?>“><br> dem Layout unzufrieden und kann keine
Development Templates
Änderung vornehmen. HTML-Templates Sie ähneln einem XSL Subset. Oft sind schwindigkeit der Templateklasse. Alle
bieten sich als Ausweg an. sie nicht als Open-Source verfügbar, Templateklassen müssen das Templatefile
sondern Teil eines kommerziellen Pro- laden und verwalten. Der Verwaltungs-
... dukts.) aufwand kann ab einer gewissen Zahl von
<table> Das einfache Template zur Produkt- Ersetzungen vernachlässigt werden. We-
<tr> darstellung kommt ohne sich wiederho- sentliche Geschwindigkeitsunterschiede
<td colspan=“2“><h2>{ARTIKELBEZEICHNUNG}</h2></td> lende Blöcke aus. EasyTemplate bietet können nur bei der Variablenersetzung
</tr>
sich an. Die Anwendung ist sehr einfach, auftreten.
<tr>
da die API nur vier Funktionen umfasst: PHP kennt drei Gruppen von Funk-
<td>Beschreibung</td>
<td>{BESCHREIBUNG}</td>
tionen zur Stringersetzung. Einfache Er-
</tr> •Template Klasse einbinden – require_on- setzungen mit den str*-Funktionen, Er-
<tr> ce(„[Link]“) setzungen basierend auf POSIX-kon-
<td>Preis</td> •Template Objekt von dem angegebenen formen Regulären Ausdrücken mit den
<td>{PREIS_DM}</td> File erzeugen – $tpl = new EasyTempla- ereg*-Funktionen und die preg*-Funk-
</tr> te(„[Link]“) tionen, die Perl-kompatible Reguläre
<tr> •Ersetzungen: Artikeldaten Ausdrücke verarbeiten. Das Parsen des
<td colspan=“2“> –$tpl->assign(„ARTIKELBEZEICH- einfachen Artikeltemplates gelingt mit
In den <a NUNG“, „Easy Rider“) den str_replace() am schnellsten. Rund
href=“{URL_BESTELLUNG}“><b>Warenkorb</b></a> legen.
–$tpl->assign(„BESCHREIBUNG“, 20% langsamer sind ereg_replace() und
</td>
„Abenteuer, VHS, 91 min., FSK 16“) ein mit Arrays aufgerufenes preg_repla-
</tr>
</table>
–$tpl->assign(„PREIS“, „14.95 DM“) ce(). Wirklich wichtig ist diese Erkenntnis
... •Ersetzungen: Shop Verwaltung – jedoch nicht, selbst mein Entwicklungs-
$tpl->assign(„URL_BESTELLUNG“, server, KROETE, ein AMD5x86-133 (et-
„/[Link]?inc=3016“) wa Pentium 60) benötigt nur 0.003
Ein Template ist ein HTML-Doku- •Template ausgeben – alternativ print Sekunden für die Ersetzungen im Artikel-
ment, welches Platzhalter enthält, die $tpl->easy_parse();$tpl->easy_print() template. Kein guter Ausgangspunkt für
vom Programm durch Werte ersetzt wer- Optimierungen!
den. Die meisten Template-Klassen ver- Der Konstruktor lädt das Template- EasyTemplate von Till Gerken ist für
wenden Platzhalter in der Form: {NA- file, dessen Name ihm übergeben wird. die gestellte Aufgabe die Template-Klasse
ME_IN_GROSSBUCHSTABEN}. Variablenersetzungen werden mit boole- der Wahl. Doch ein Kunde wäre kein ech-
an assign(string $varname, mixed $repla- ter Kunde, wenn keine neuen Anforderun-
Frei verfügbare Templatesysteme cement) vorgenommen. Die Ausgabe er- gen gestellt würden. Schnell wird klar,
Nachdem die Anforderungen geklärt sind folgt mit mixed easy_parse(void) oder dass nicht alle Produkte im Online-Shop
und ein Lösungsansatz gefunden wurde, boolean easy_print(void). in einer Detailansicht dargestellt werden
beginnt die Suche nach einer geeigneten können. Bei Auswahl einer Artikelgruppe
Templateklasse. [Link] zeigt schnell Laufzeitanalyse einfacher Lösungen soll zunächst eine Listendarstellung aller
zwei Gruppen von Templates. Intern verwendet EasyTemplate die Funk- enthaltenen Artikel erscheinen, bevor der
tion str_replace() zur Variablenersetzung. Internetnutzer zur Detaildarstellung ver-
Templates ohne Blöcke: Die Wahl der Funktion bestimmt die Ge- zweigen kann.
•EasyTemplate – [Link]/
(Teil des phpChat) PHPLib Template API PHPLib IT[X] API
Templates mit Blöcken: • Void Template([string $root = „.“, string • Void IntegratedTemplate([string $root = „“])
•QuickTemplate – [Link] $unknowns = „remove“]) – Setzt den Pfad, in – Setzt den Pfad, in dem die HTML Templates
[Link]/[Link]/ dem die HTML Templates liegen und be- liegen.
package/49 schreibt das Handling von unbekannten Platz • Boolean loadTemplatefile(string $filenam
•FastTemplate – [Link]. haltern. [, boolean $removeUnknownVariables = true,
net/php/[Link] • Void set_file(string $handle, string $filename) – $removeEmptyBlocks = true]) – Lädt das HTML
•PHPLib Template – [Link] Legt für das HTML Template $filename einen Template $filename in die Templateklasse und
de symbolischen Handlernamen $handle an. bestimmt das Handling von unbekannten
•Integrated Templates IT[X] – http:// • Void set_var(mixed $varname[, string Platzhaltern und Blöcken.
[Link] $value = „“]) – Ersetzt die Variable $varname • Void setVariable(mixed $variable[, $value = „“})
durch den Wert $value. Alternativ kann die – Ersetzt die Variable $variable durch den Wert
Funktion auch mit einem Array der Form [string $value. Alternativ kann die Funktion auch mit
(Eine dritte Gruppe von Templates
$var name => mixed $value] aufgerufen einem Array der Form [string $varname =>
mit Steueranweisungen und eigener
werden. mixed $value] aufgerufen werden.
Makrosprache wird nicht besprochen.
Templates Development
Templates mit Blöcken Gruppe der Template- Klassen mit Unter- Die ausgestatteten Perl-kompatiblen
Der Grafiker gibt folgendes Layout für die stützung für sich wiederholende Blöcke Regulären Ausdrücke (preg*-Funktionen,
Listendarstellung vor: wird benötigt. Es konkurrieren X-, Fast- [Link]/manual/en/[Link])
und die beiden PHPLib-Templates. sind deutlich schneller und auch leistungs-
... Die Features und APIs der einzelnen fähiger als die POSIX- konformen ereg*-
<table> Templatesysteme unterscheiden sich et- Funktionen. FastTemplate wird zum
<tr> was, im Wesentlichen bieten sie jedoch die SlowTemplate und kann nicht mit seinen
<td colspan=“3“>Angebote aus der Artikelgruppe gleiche Funktionalität. Somit entscheidet Brüdern, den doppelt so schnellen PHPLib
Mustergruppe</td>
die Geschwindigkeit der Systeme über ih- Templates, mithalten. Die ursprünglich
</tr>
ren Einsatz. Ein einfacher Test (siehe aus der PHPLib stammenden Integrated
<!—- Anfang Listendarstellung eines Artikels — >
<tr>
[Link]/tpl_test.html) stellt Templates, kurz IT[X] genannt, gewinnen
<td><a href=“/[Link]“><img src=“/[Link]“></a></td> die verschiedenen APIs dar und spaltet das das Rennen knapp, weil die etwas andere
<td>Name des Artikels, Preis 99.99 DM</td> Lager in zwei Gruppen. Wieder entschei- Block-API einen Funktionsaufruf pro
<td><a href=“/[Link]“>Detailansicht</a></td> det die Wahl der Funktion zur Stringerset- Schleifendurchlauf einspart.
</tr> zung über Sieg und Niederlage. Zu verdanken haben die PHPLib-
<!—- Ende Listendarstellung eines Artikels — > Templatesysteme ihren Sieg Sascha Schu-
</table> •PHPLib Integrated Template mann. Er stattete in Version 3.0.7 die
... 4.13s (100.00%) PCRE-Funktionen mit einem Cache aus.
•PHPLib Template Der Cache speichert die Ergebnisse der C-
Zu den ursprünglichen Anforderun- 4.77s (115.58%) Funktion regcomp(). Regcomp() kompi-
gen an das Programm kommt eine neue •XTemplate liert ein Suchmuster und überführt es in ei-
hinzu: Der <tr>-Container mit der Listen- 8.94s (216.73%) ne Form, die von der C-Funktion
darstellung eines Artikels muss beliebig •FastTemplate regexec() verstanden wird, welche die ei-
oft wiederholt werden können. Die zweite 9.78s (237.08%) gentliche Suche durchführt. Hinzu kommt,
Anzeige
LE_PHP (35-46) 23.08.2001 10:34 Uhr Seite 38
Development Templates
dass preg_replace() im Gegensatz zu er- Mit der Methode set_block() wird dem zeug bereit, verlangt jedoch, dass dieser
eg_replace() mit nur einem Funktionsauf- Objekt mitgeteilt, dass im Template im Detail versteht, was passiert. Be-
ruf gleich eine ganze Reihe Ersetzungen „main“ ein Block „product_row“ exis- sonders bei komplexen Aufgaben mit
durchführen kann. Hierzu wird der Funk- tiert, der mehrmals dargestellt werden soll. mehreren Template-Files und tief ver-
tion statt eines einzelnen Suchmusters ein Set_block() ersetzt nun intern den Block schachtelten Blöcken kann leicht Verwir-
Array von Suchmustern und Ersatzwerten durch die Variable ROWS, die im dritten rung entstehen.
übergeben. Parameter benannt wurde. Zu diesem Die Integrated Templates versuchen,
Zeitpunkt ist der Inhalt von ROWS leer: hier Abhilfe zu schaffen. Zur Erledigung
Testsieger PHPLib (PEAR) der gleichen Aufgabe benötigt der Anwen-
Der Leistungsumfang der zwei schnell- $tpl->set_block(„main“, „product_row“, „ROWS“); der ein etwas kürzeres Skript. IT[X] geht
sten Systeme liegt so nah beisammen, davon aus, dass alle Blöcke in einem Tem-
dass die API über den Einsatz der einen In einer Schleife werden die Artikelda- plate-File enthalten sind. Es wird keine
oder anderen Lösung entscheidet. Wäh- ten dem Template-Objekt mit set_var() zu- Möglichkeit bereitgestellt, die Block-
rend das Laden eines Templates und die gewiesen. Das Objekt wird anschließend schachtelung zu verändern und einen ge-
Variablenzuweisungen in beiden Klassen mit parse() angewiesen, die übermittelten parsten Block an mehreren Stellen im
sehr einfach sind, unterscheiden sich die Daten im Block „products_row“ einzuset- Template einzufügen.
Funktionen zum Blockhandling wesent- zen und das Ergebnis dem Inhalt von Durch die Grundannahmen wird die
lich. ROWS hinzuzufügen. ROWS umfaßt mit API selbsterklärend. Wer nur selten die
Perl-Programmierer werden die Tem- jedem Schleifendurchlauf die Darstellung Einschränkungen überwinden muss, der
plate-Klasse von Kristian Köhntopp eines weiteren Artikels. Im Performance- sollte auf die Klasse Integrated Template
schnell anwenden können, weil sie stark testskript sieht dies alles wie folgt aus: Extension schauen. Sie enthält zusätzliche
an FastTemplate erinnert, welches wiede- Methoden, die sogar mehr Funktionalität
rum aus der Perl-Welt stammt. Anderen for ($j = 0; $j < ARTIKEL; $j++) { bieten, als die Template-Klasse zur Verfü-
wird das Verständnis nur gelingen, wenn gung stellt.
sie wissen, wie die Klasse arbeitet. Im $tpl->set_var($daten);
Gegensatz zu IT[X] analysiert Template $tpl->parse(„ROWS“, „product_row“, true); $tpl = new IntegratedTemplate(TEMPLATE_ROOT);
nicht das HTML Template, um herauszu-
finden, wie die gefundenen Blöcke ineinan- } $tpl->loadTemplatefile(„template_detail3.html“);
der verschachtelt sind. Die Klasse hat kein Statt für jeden Platzhalter set_var()
Wissen darüber, wie die Blöcke zu- aufzurufen, wird der Methode ein Array $tpl->setCurrentBlock(„product_row“);
for ($j = 0; $j < ARTIKEL; $j++) {
sammengesetzt werden müsen, ohne Rei- mit den Artikeldaten übergeben. Das For-
$tpl->setVariable($daten);
henfolge und Schachtelung zu zerstören. mat von $daten entspricht dem typischen
$tpl->parseCurrentBlock();
Die Vorlage des Grafikers ist nur mini- Rückgabewert einer Datenbankfunktion
}
mal zu verändern, damit sie verwendet wie mysql_fetch_array().
werden kann. Der erste HTML- Kom- $tpl->show();
mentar wird gegen <!—BEGIN pro- $daten = array(
duct_row ➞ ausgetauscht, der zweite ent- „URL_BESTELLUNG“ => „/[Link]?inc=3016“,
„URL_DETAIL“ => „/[Link]?art=3016“,
sprechend durch <!—END product_row Mit diesem Basiswissen ist es möglich,
„BEZEICHNUNG“ => „Easy Rider“,
➞ ersetzt, letztendlich werden Platzhalter HTML komplett aus dem Programmcode
„PREIS“ => „14.95 DM“
in der bekannten Form {VARNAME} ein- zu verbannen. Die Wiederverwendung
);
gefügt. Das Skript zur Bearbeitung benö- von Skripten wird einfacher, und die lästi-
tigt nur wenige, jedoch gehaltvolle Zei- gen Gespräche mit den Mäuseschubsern,
len. Das Template-File selbst muss auch ei- auch Grafiker genannt, bleiben aus, so-
Zunächst wird ein Objekt der Templa- ner Variablen zugewiesen werden, bevor bald diese einmal verstanden haben, was
te-Klasse erzeugt. Durch den Konstruktor diese ausgegeben werden kann. Der par- ein Template ist.
wird dem Objekt mitgeteilt, wo die se()-Aufruf legt den Inhalt des Template- Endlich gewinnt man Zeit, um eine ei-
HTML-Templates zu finden sind. Idealer- Files in der Variablen MAIN ab. Diese gene Templateklasse zu erfinden. Schließ-
weise ist dies in einer leicht veränderbaren kann abschließend mit der Methode p(), lich gehört es zum guten Ton in der PHP-
Konstanten gespeichert. Anschließend für print, ausgegeben werden: Szene, über eine solche zu verfügen, wenn
wird das Template „template_detail. html“ man schon kein Content Management
unter dem Handler „main“ geladen: $tpl->parse(„MAIN“, „main“); System geschrieben hat. Einige CMS set-
$tpl->p(„MAIN“); zen zwar schon auf XML und XSLT, doch
$tpl = new Template(TEMPLATE_ROOT); Templates sind verständlicher und lassen
Die fein abgestufte API stellt dem Pro- sich nicht nur zur Erstellung von HTML
$tpl->set_file( array(„main“=> „template_detail.html“) ); grammierer zwar ein mächtiges Werk- einsetzen.
Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 2
Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 3
Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 4
Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 5
Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 6
Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 7
Anzeige
php 8seiter PHPSonder 23.08.2001 9:50 Uhr Seite 8
Anzeige
LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 47
Klassensystem
Unterverzeichnissen doc, pages, php und
stuff. Unter doc ist die Dokumentation
zu dieser Version enthalten; pages enthält
einige Testseiten; stuff enthält Dateien,
die zur Einrichtung der benötigten Da-
tenbanktabellen verwendet werden kön-
von Martin Jansen nen. Das Verzeichnis php schließlich ent-
hält die Klassen der PHPLIB. Der Inhalt
dieses Verzeichnissen muss auf den Web-
PHPLIB und PEAR im Überblick server kopiert werden. Die Dateien soll-
ten sich vorzugsweise in einem Verzeich-
nis befinden, welches außerhalb der
Document Root liegt. Auf jeder Seite, auf
PHPLIB (PHP Base Library) ist die eierlegende Wollmilchsau von PHP:Sie bietet komfortables und der die PHPLIB verwendet werden soll,
sehr mächtiges Session-Handling, Datenbank-Abstraktions-Klassen für den Zugriff auf eine Viel- muss später die Datei prepend.php3 aus
zahl verschiedener Datenbanksysteme unter derselben API, stellt Systeme zur Realisation von Be- dem Verzeichnis php eingebunden wer-
nutzerverwaltungen und geschützten Bereichen zur Verfügung und hat darüber hinaus viele wei- den. Wenn man dies nicht manuell für je-
tere Features zu bieten, auf die in diesem Artikel eingegangen [Link] alles geschieht unter der de einzelne Datei machen will, kann man
prepend.php3 in der [Link] bzw.
„schützenden Hand“ von LGPL (GNU Library Public License), was zur Folge hat, dass die Elemente [Link] als Wert für die Direktive
der PHPLIB sowohl in kommerziellen als auch in nichtkommerziellen Projekten kostenlos einge- auto_prepend_file mit der passenden
setzt werden dürfen. Pfadangabe eintragen.
Datenbank-Abstraktion
PHPLIB stellt eine Klasse DB_Sqlzur Verfü-
gung, die den Zugriff auf Datenbanken in
Was ist die PHPLIB? zum Download verfügbar. Unter der sel- einer Weise erlaubt, die weitgehend unab-
Die PHPLIB ist eine Sammlung von in PHP ben Adresse findet sich auch die englisch- hängig davon ist, welches Datenbanksys-
geschriebenen Klassen, die viele Mechanis- sprachige Dokumentation und Demon- tem verwendet wird. PHPLIB unterstützt
men bieten, welche ein Programmierer strationen verschiedener Features der derzeit die folgenden Datenbanksysteme:
beim Entwickeln von Applikationen in PHPLIB. mSQL, MSSQL, MySQL, Oracle 8, ODBC,
PHP häufig benötigt. Der Anlass, die Ent- Weiteren Support erhält man zu den PostgreSQL und Sybase. Somit ist es mög-
wicklung der PHPLIB zu starten, war der verschiedenen Klassen auf der Mailing- lich, eine Applikation zu entwickeln, die
Wunsch nach einer Möglichkeit, Variablen liste der PHPLIB, auf der man sich unter sich relativ flexibel an das gegebene Daten-
und deren Werte über mehrere Webseiten [Link] banksystem anpassen kann. Jedem Daten-
hinweg gültig und verfügbar zu machen. anmelden kann. banksystem ist eine Datei nach dem Muster
Daraus entstand die Session-Klasse, auf die Die PHPLIB steht unter der GNU Li- db_<Name>.inc im Verzeichnis php zuge-
im weiteren Verlauf dieses Artikels noch brary General Public License (LGPL) ordnet (MySQL: db_mysql.inc, ODBC:
eingegangen wird. Die ursprüngliche Ver- und kann daher sowohl in kommerziel- db_odbc.inc usw.). Durch das Ändern der
sion der PHPLIB wurde von Kristian Köhn- len als auch in nichtkommerziellen Pro- require-Anweisung in prepend.php3(De-
topp und Boris Erdmann entwickelt. Im jekten kostenfrei eingesetzt werden. Ein- fault:require($_PHPLIB[„libdir“].“db_m
Laufe der Zeit haben eine Vielzahl anderer zelheiten zur LGPL der PHPLIB finden [Link]“);) kann man festlegen, welches
Programmierer Klassen beigesteuert, dar- sich in der Datei COPYING, die Be- Datenbanksystem genutzt werden soll. Die
unter Sascha Schumann und Ulf Wendel. standteil jeder PHPLIB-Distribution ist. Klasse DB_Sql dient als Grundlage der Da-
Die Entwicklung von PHPLIB läuft über Die Installation der PHPLIB beginnt tenbank-Abstraktion und enthält keinerlei
CVS (Concurrent Versions System; mit dem Extrahieren der Dateien aus dem Verbindungsparameter. Daher muss vor der
[Link]) ab, was den Vorteil Archiv, das man unter [Link] Verwendung der Datenbank-Abstraktion
hat, dass Programmierer überall auf der [Link]/ heruntergeladen hat. Es ist un- eine von DB_Sql abgeleitete Klasse gebildet
Welt ihren Code auf eine sehr einfache Art günstig, die Development-Versionen der werden, in der die Verbindungsparameter
und Weise beisteuern können und gleich- PHPLIB im Produktionsbetrieb einzuset- angegeben sind. Beispiel:
zeitig eine korrekte und effiziente Versions- zen, da in diesen Versionen manche Me-
verwaltung durchgeführt werden kann. chanismen fehlerhaft oder nur experi- <?php
Die PHPLIB ist unter [Link] mentell implementiert sind. Nach dem class My_DB extends DB_Sql {
[Link] als komprimiertes tar-Archiv Extrahieren der Dateien entsteht ein Ver- var $Host = “localhost”;
oder als selbstentpackendes Shellscript zeichnis phplib-<version> mit den vier var $Database = “test”;
Das PEAR befindet sich zu dem Zeit- verfügen über ein Layout und eine API, PEAR-Homepage: [Link]
punkt, da dieser Artikel geschrieben die sehr allgemein formuliert sind (ohne Dokumentation zu PEAR:
wird, noch in einem sehr frühen Entwick- dabei an Leistungsfähigkeit einzubü- [Link]/manual/[Link]
lungsstadium, verfügt allerdings bereits ßen), wodurch die Elemente leicht in al- Links zu Tutorials über PEAR-Komponenten:
über eine breite Basis an engagierten Ent- len möglichen Arten von Projekten ein- [Link]
wicklern, die Code beisteuern und die gesetzt werden können. Das CVS-Repository von PEAR:
Entwicklung von PEAR koordinieren. •Naming-Conventions und eine Untertei- [Link]
Möglicherweise wird nun die Frage lung des PEAR in verschiedenen Kate- Die Development-Mailingliste zu PEAR:
aufkommen: „Warum das alles? Es exis- gorien stellen sicher, dass selbst bei sehr pear-dev@[Link]
tieren doch mehr als genug Code-Archi- vielen verschiedenen Elementen und zu- Die User-Mailingliste zu PEAR:
ve!“. Diese Frage ist durchaus berechtigt. nehmender Größe des PEAR der Über- pear-general@[Link]
Das Problem bei den derzeit existieren- blick nicht verloren gehen wird.
if ($data = $cache->start($id))
Würde ein Student die Aufgabe erhalten, einen In diesem Beispiel hat der Student eine die(„$data<hr>Cache hit.“);
Versuch, [Link] Ball aus einer definierten simple Optimierung vorgenommen, in-
dem er bereits ermittelte Werte wiederver- // zeitaufwendiges Skript.
Höhe fallen zu lassen und die Wucht des Auf-
wendet hat, was aufgrund der determinis- print „Beliebige Ausgaben.“;
pralls zu messen, jede Stunde wiederholen zu tischen Natur des Vorgangs möglich ist. $cache->end();
müssen, so wäre eine zweite Person notwen- Cache-Technologien bedienen sich der print „<hr>Cache miss.“;
dig, die kontrolliert, dass der Laborant nicht die gleichen Idee und sind beispielsweise von
Festplatten bekannt, aber auch in der Zur Arbeit mit dem Cache wird ein
Ergebnisse des vorherigen Versuchs abschreibt
Softwaretechnik finden sie Anwendung. Objekt vom Typ Cache_Output erzeugt.
und die eingesparte Zeit für einen Flirt nutzt. Durch „top-down dynamic program- Im Konstruktor wird dem Objekt mitge-
Anzeige
LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 52
Sessionmanagement Development
Benutzer-
neuer Vorgang, der verarbeitet wird. Er
kann nicht unterscheiden, ob es sich um
den alten oder einen weiteren Benutzer
handelt.
orientiert Daten
Hilfe für den Server: Cookies
Für die Lösung dieses Problems wurden
von Netscape die Cookies erfunden. Diese
sind kleine Datenschnipsel, die im Brow-
ser gespeichert werden. Sie werden bei der
Development Sessionmanagement
programmiert oder mit Werkzeugen wie Abb. 1: Anzeige des Cookies mit der
der PHPLIB simuliert werden. So einfach, Session-ID im Internet Explorer
wie es beim ersten Hinschauen aussieht,
ist es denn auch nicht immer. Wenn der
Browser Cookies nicht akzeptiert, funk-
tioniert das Sessionmanagement nicht
mehr. Damit das nicht passiert, gibt es Al-
ternativen. So werden Daten vom Brow-
ser immer per GET oder POST angefor-
dert, wie am Anfang beschrieben. Wenn
Sie nun an jede Anforderung die Session-
daten anhängen, braucht Sie keine Coo-
kies mehr. In einer größeren Applikation
gibt es aber Hunderte von Links und Dut-
zende von Formularen – keine leichte Ar-
beit, alle von Hand zu erweitern.
Beachten Sie, dass die Funktion ses- Dieses Skript ruft sich immer wieder [Link]?parameter=wert¶meter2=wert2
sion_start() hier ganz am Anfang des selbst auf. Schalten Sie nun Cookies ab,
Skripts steht. Beim Aufruf erzeugt die müsste das Skript bei jedem Aufruf eine Da diese Zeile Bestandteil der Anforde-
Funktion die entsprechenden Kopfzeilen neue Session-ID erzeugen. PHP 4 erkennt rung per GET ist, wird dies auch als GET-
für das Cookie. Kopfzeilen müssen aber dies und behilft sich selbst. Ein Blick in den Methode bezeichnet. Die Zeichenkette ist
vor den Daten stehen. Quellcode der HTML-Seite zeigt, wie hier der so genannte QueryString. Solche
Wenn der Browser des Benutzers Coo- Hand angelegt wurde: Schlangen sind im Browser in der Adress-
kies akzeptiert, ist damit eigentlich schon Da dieses Verhalten manchmal stören zeile gut zu erkennen – und auch zu mani-
alles erledigt. Wird die Seite erneut abge- kann, ist die Option steuerbar. Das auto- pulieren. Abgesehen davon ist die Länge
rufen, gibt es nun zwei Fälle: matische Einsetzen erfolgt nur, wenn PHP auf etwa 2000 Zeichen begrenzt, danach
Sessionmanagement Development
Abb. 2: Ohne Cookies: PHP ergänzt Links automatisch um die Session ID Abb.3: Die Sessionfunktionenwerden vor oder nach dem eigentlichen
Script aufgerufen
schneidet der Browser einfach ab. Wenn den Sessionvariablen deshalb unter einem gentlichen Daten. Mehrere Variablen sind
Sie Daten benutzerabhängig übergeben eigenen Namen mit dem Präfix sess_ abge- durch Semikola getrennt.
wollen, sollten Sie sich mit Sessionvaria- legt.
blen beschäftigen. Das funktioniert dank Sessiondaten selber speichern
PHP 4 sehr einfach. Variablen, die Sie er- Wo die Daten bleiben Wenn Sie eine große, kommerzielle Site
halten möchten (sowohl der Name als Da die Inhalte der Variablen auf der planen, ist diese Form der Speicherung
auch der Inhalt wird gespeichert), „regis- nächsten Seite geradezu magisch wieder vielleicht nicht so sicher wie gewünscht
trieren“ Sie für die laufende Sitzung. Dazu auftauchen, stellt sich die Frage, wo diese und auch nicht ausreichend flexibel. PHP
wird die Funktion session_register() ver- Werte gespeichert werden. Das Session- 4 bietet deshalb die Möglichkeit, eigene
wendet. Listing 1 zeigt die Anwendung. cookie enthält, wie in Abbildung 1 ge- Handlerfunktionen zu definieren, die
Dort wird der Benutzer zur Auswahl einer zeigt, nur die Session-ID. Standardmäßig beim Aufruf von session_register() und
Farbe aufgefordert. Erst wenn er sich ent- werden diese Werte in Dateien in seriali- session_unregister() aufgerufen werden.
schieden hat, kann er per Link weiterma- sierter Form abgelegt. Gespeichert wer- Diese können eingesetzt werden, um Da-
chen. Die ausgewählte Farbe taucht schein- den sie im temporären Verzeichnis /tmp. ten in einer Datenbank zu speichern, die
bar magisch im nächsten Skript auf. Das Andere Ziele lassen sich im Abschnitt möglicherweise flexibler mit den Informa-
Beispiel mag primitiv erscheinen, denken [session] in der [Link] einstellen (siehe tionen umgeht, als ein Dateisystem. Eine
Sie aber an ein umfangreiches Formular. Kasten „Sessions konfigurieren“). andere Alternative ist das Modul „mm“,
Erst wenn alle Felder ausgefüllt und über- Die Art der Speicherung ist unspekta- das die Daten im Shared Memory spei-
prüft wurden, geht es weiter. Die Daten kulär. Der Name der Datei entspricht der chert. Allerdings steht dies nur zur Verfü-
werden nicht einfach an den Links ange- Session-ID, der Inhalt der Darstellung gung, wenn PHP 4 als Apache-Modul
hängt – clevere Benutzer könnten sie nach der Variablen, wie sie die Funktion seria- kompiliert wurde, was die Einsatzbreite
der Prüfung wieder manipulieren. Statt lize() erzeugt. In der [Link] kann mit der Skripte einschränkt.
dessen werden sie in der Session als Ses- dem Parameter [Link] fest- Interessanter ist der Einsatz eigener
sionvariablen verpackt. gelegt werden, wann dieses Verzeichnis Sessionfunktionen. Dabei werden nicht
Beim Umgang mit den Variablen soll- aufgeräumt wird – der Standardwert be- die Aufrufe zu session_register() usw. er-
ten Sie darauf achten, für jede Methode trägt 1440 Minuten (1 Tag). Zumindest setzt, sondern die dahinterliegenden Funk-
der Übertragung andere Variablennamen beim Start der ersten Versuche mit Ses- tionen. An den Skripten, die bereits mit
zu verwenden. PHP erlaubt zwar die Fest- sions ist ein Blick in dieses Verzeichnis Sessions arbeiten, müssen Sie nichts än-
legung der Reihenfolge, in der externe Da- ratsam, weil die Aktivitäten der Skripte dern. Die Definition erfolgt mit zwei
ten automatisch in Variablen übertragen gut überwacht werden können. Das be- Funktionen:
werden – im Zweifelsfall handeln Sie sich reits gezeigte Beispiel würde in der Ses-
damit aber mehr Probleme ein als es Vor- siondatei folgende Daten ablegen: session_module_name(„user“);
teile bietet. Wechseln Sie vom lokalen Sys- session_set_save_handler(‘ms_open’, ‘ms_close’, ‘ms_read’,
‘ms_write’, ‘ms_destroy’, ‘ms_gc’);
tem zu einem Provider, der keine kunden- color|s:7:“#00ff00“;
spezifische Konfiguration der [Link]
erlaubt, funktioniert das Skript nicht Die serialisierte Form einer Variablen Mit session_module_name(“user”)
mehr. Was viel schlimmer ist: Solche Feh- ist gut lesbar. Zuerst kommt der Name, wird der interne Handler abgeschaltet.
ler sind nicht auf den ersten Blick zu erken- dann nach dem senkrechten Strich der Typ Welche Funktionen nun für die Ausfüh-
nen, führen nicht zu Laufzeitfehlern und („s“ steht für string, „i“ für integer usw.), rung zuständig sind, wird mit session_
sind kaum zu debuggen. Im Listing wer- dann die aktuelle Länge und zuletzt die ei- set_save_handler() definiert. Insgesamt
Development Sessionmanagement
können sechs Funktionen definiert wer- <html> session_register(‘s’, ‘a’);
den: <body> ?>
<h3>Seitenstart</h3> <h3>Seitenende</h3>
•Öffnen – ms_open im Beispiel <?php
</body>
$sessid = session_id();
•Schließen – ms_close </html>
$x = 122;
•Zurückholen von registrierten Variablen
$s = „Test“;
– ms_read Dies erzeugt nun die in Bild 4 gezeigte
•Registrieren von Variablen – ms_write $a = array(1, 22, „acht“); Ausgabe.
•Zerstören der Session – ms_destroy session_register(‘x’); Sie sehen hier, dass der Aufruf vor
•Funktion, die von der Garbage Collec- echo „<h4>Nach erstem session_register()</h4>“; dem Beginn der Seite erfolgt – und zwar
tion aufgerufen wird – ms_gc
Bis zu diesem Punkt ist der Vorgang si- Sessionfunktionen auf einen Blick
cher sehr einfach. Was etwas mehr Arbeit bool session_start(void) Startet eine neue Session und gibt immer TRUE zu-
verursacht, ist die Definition der Funktio- rück. Dabei wird eine neue Session-ID erzeugt.
nen. An dieser Stelle versagen leider auch
string session_save_path([string path]) Setzt oder ermittelt den Pfad, unter dem die Ses-
das Handbuch und diverse Tutorials. In sion-Daten abgespeichert werden.
Listing 2 finden Sie eine Definition der
bool session_register(string name [, string ...]) Registriert Variablen für eine Sitzung. Als Argument
wichtigsten Funktionen. ms_close() hat
wird der Name der Variable angegeben, nicht die Va-
hier keine Funktion, sondern wurde nur
riable selbst.
zu Testzwecken eingesetzt. Sie können die
bool session_unregister(string varname) Hebt die Registrierung einer Variablen wieder auf.
Definition auch weglassen. Nicht benötig- Die Variable selbst wird im aktiven Skript nicht ge-
te Funktionen werden dann in session_ löscht.
set_save_handler() durch eine leere Zei- string session_name([string sessionname]) Ermittelt oder setzt den Namen der Session. Dieser
chenkette ’’’’ ersetzt. Wert wird als Name des Session-Cookies oder der
Die verwendete MySQL-Tabelle hat GET/POST-Variablen verwendet.
folgende Struktur: string session_module_name([string modulename]) Setzt oder ermittelt das Modul, mit dem die Ses-
sion-Informationen verarbeitet werden.
CREATE TABLE currentsession (
bool session_is_registered(string varname) Prüft, ob eine Variable bereits registriert ist. Als Ar-
sessionID varchar(32) NOT NULL,
gument wird der Name der Variablen als Zeichen-
usrID bigint(20) NOT NULL,
kette übergeben.
variables text NOT NULL,
bool session_decode(string data) Dekodiert die in der Session in Form einer Zeichen-
laccess int(14),
kette gespeicherten Variablen, die mit session_en-
PRIMARY KEY (sessionID),
code verpackt wurden.
KEY usrID (usrID)
); bool session_destroy(void) Löscht alle Session-Daten. Das zugehörige Cookie
wird jedoch nicht sofort gelöscht. Die angelegte
Diese Tabelle erlaubt zusätzlich noch temporäre Datei wird sofort gelöscht.
die Zuordnung einer User-ID, die regis-
string session_encode(void) Kodiert alle Daten der aktuellen Session in Form al-
trierte Benutzer einer Session zuordnet. So
ler Zeichen.
gehen die Daten nicht verloren, die bereits
anonym erfasst wurden, wenn der Benut- string session_id([string sessionid]) Für die angegebene Session (Session-Name) wird
die aktuelle Session-ID ermittelt und zurückgege-
zer sich später anmeldet. Eine solche Ver-
ben.
haltensweise ist auf vielen Sites typisch.
Setzt die aktuellen Parameter für Cookies. Diese
Um sich klar zu machen, wann welche array session_set_cookie_params(int time
Einstellung überschreibt die Werte in der [Link]
Funktion aufgerufen wird, können Sie in ………………………[, string path]
nur die Laufzeit des aktuellen Skripts.
jede selbstdefinierte Funktion eine ent- ..............................[, string domain])
sprechende echo-Anweisung setzen und array session_get_cookie_params(void) Liest die aktuellen Parameter für Cookies aus und
das Verhalten beim Ausführen eines gibt sie in einem assoziativen Array zurück.
Skripts beobachten. Das folgende Skript Void session_set_save_handler(string open, Registriert nutzerdefinierte Funktionen, die als
zeigt die Nutzung: string close, string read, string write, Routinen für die Verwaltung genutzt werden. Diese
string destroy, string gc) Werte müssen vor session_start gesetzt werden
<?php (siehe Text).
include(„session_listing_2.[Link]“); string session_cache_limiter([string limiter]) Liest oder setzt die aktuellen Einstellungen für die
Sessionmanagement Development
ausgelöst von session_start(). Am Ende bank. Die geringe Größe der Sitzungsdaten
erfolgt dann die Speicherung der „unter- erlaubt den Einsatz verschiedener Optimie-
wegs“ registrierten Daten. Das ist wich- rungsmechanismen. Auch ein paar Hun-
tig zu wissen, weil ein Skript, das ab- dert gleichzeitig aktiver Nutzer führen nur
bricht, nicht die Registrierung ausführt. zu wenigen Kilobyte Daten. Der Aufwand
Interessant ist auch, dass die registrierten dafür ist – zumindest programmtechnisch –
Daten bereits serialisiert sind, während sehr gering. Viel mehr, als hier gezeigt wur-
Sie diese beim Lesen aus der Datenbank de, muss man zu Sessions nicht wissen.
selbst wieder herstellen müssen. Das ist
mit session_decode() aber sehr einfach.
Literatur
Zusammenfassung [1] Jörg Krause, PHP 4 –
Die Nutzung eigener Sessionfunktionen Grundlagen und Profiwissen,
kann oft eingesetzt werden, um die Leis- Carl Hanser Verlag, 2000,
tung einer Seite zu steigern, beispielsweise ISBN 3-446-21546-8
durch Auslagerung in eine anderen Daten-
Sessions konfigurieren
session.save_handler. Name der Prozedur, mit der Daten gespeichert werden. Der Stan-
dardwert ist files.
session.serialize_handler Art der Serialisierung der Daten, kann z.B. „php“ oder „wddx“
sein.
session.referer_check. Referer, der bei jedem Zugriff geprüft wird. Stimmt der Referer
nicht, wird die Sitzung gelöscht und neu gestartet. Der Referer ist
die letzte Adresse, von der der Seitenabruf kommt.
session.entropy_file. Pfad zu einer Datei mit Startwerten für den Generator der Ses-
sion-IDs.
session.entropy_length. Anzahl der Bytes, die von der Datei mit den Startwerten gelesen
werden. Der Standardwert ist 0.
session.cache_expire. Zeit, innerhalb derer die Daten im Cache bleiben. Der Standard-
wert ist 180. Die Angabe ist wirkungslos, wenn „nocache“ einge-
stellt wurde.
LE_PHP (47-60) 23.08.2001 10:38 Uhr Seite 58
Absolut clever
ben werden dann zum Browser gesendet.
Dieser verarbeitet die Informationen –
HTML und natürlich auch JavaScript. Es
liegt dann am gesendeten Code und der
Interaktion des Benutzers, wie es weiter-
geht. Klickt der Benutzer auf einen Link,
von Jörg Krause wird dieses als HTTP-Aktion an den Web-
server gesendet. Ebenso funktioniert es
bei Formularen – die Daten werden zu-
sammengestellt und gesendet. Ein Skript
Formularhandling mit JavaScript auf dem Server kann die Daten dann ver-
arbeiten. Der Datenaustausch zwischen
beiden Welten kann also nur an zwei Stel-
len stattfinden. Beim Aufbau der Seite
können Sie Daten an JavaScript folgen-
dermaßen übergeben:
Richtig gute Webseiten entstehen, wenn Sie ei- Puristen werden beim Gedanken, Java
nen ganzheitlichen Ansatz bei der Program- Script einzusetzen, erschaudern. Die Nach- <script language=“JavaScript“>
teile sind offensichtlich: Hat der Benutzer var muster = <?php echo $muster ?>
mierung verfolgen:Kombinieren Sie clever ser- </script>
JavaScript deaktiviert oder ist der Brow-
ver- und clientseitige [Link] PHP 4 und
ser nicht von der neuesten Generation,
JavaScript stehen Ihnen zwei äußerst vielsei- gibt es Schwierigkeiten beim Einsatz. Um Der Wert der PHP-Variablen $muster
tige Sprachen mit ähnlicher Syntax zur Verfü- diese zu umgehen, müssten einige Teile des steht nun in der JavaScript-Variablen
[Link] Artikel zeigt Ihnen, wie Sie damit Codes in PHP erneut ausgeführt werden, muster zur Verfügung. Umgekehrt ist es
elegant umgehen kö[Link] Schwerpunkt z.B. beim Prüfen von Formularen. Das be- schon etwas schwieriger. Daten vom
bildet der Umgang mit [Link]- deutet doppelten Aufwand und erhöht die Client können über einen Hyperlink
Fehlerquote. (HTTP-GET), ein Formular (HTTP-
vaScript selbst ist im Web und in zahlreichen
Auf der anderen Seite gehört meiner POST) oder Cookies zum PHP-Skript ge-
Büchern exzellent dokumentiert und wird hier Meinung nach JavaScript zum festen Be- langen. Cookies scheiden hier aus – die mit
beim Leser vorausgesetzt. standteil der clientseitig verfügbaren JavaScript erzeugten haben mit den über
Techniken. Der Prozentsatz der „Verwei- HTTP gesendeten absolut nichts zu tun.
gerer“ ist gering und bei vorteilhaftem Wenn Sie sowieso ein Formular senden,
Einsatz profitiert der Benutzer davon. Vie- können Sie ihre mit JavaScript erzeugten
le Gestalter gehen inzwischen dazu über, Daten dorthinein legen:
ihre Website in zwei Versionen anzubieten
– einer sehr einfachen ohne Skriptnutzung <script language=“JavaScript“>
und einer „feature reach“-Version, die function sendform()
Flash, JavaScript und Grafik nutzt. Beob- {
[Link] = „Wert“;
achtungen zeigen, dass Benutzer die auf-
[Link]=post;
wendigste Version annehmen, wenn ihre
[Link]();
Internetzugänge dies hinsichtlich der ver-
}
fügbaren Bandbreite und Kosten gestat- </script>
ten. Mit jedem neuen ADSL-Anschluss ...
und jeder besseren Standleitung in Unter- <form action=“[Link]“ name=“myform“ onsubmit=“
nehmen wird ihre Schar größer. Bereiten sendform();“>
Sie sich auf anspruchsvolle Benutzer vor <input type=hidden name=myfield>
und lernen Sie, clientseitige Techniken mit </form>
PHP 4 zu verknüpfen.
Wenn das Formular abgesendet wird,
Prinzipielle Fragen ruft der Klick auf den Submit-Schalter die
Bevor Sie sich intensiv mit PHP 4 und Ja- JavaScript-Funktion sendform() auf. Dort
vaScript auseinandersetzen, sollten Sie wird der Wert des versteckten Feldes „my-
sich völlig klar darüber sein, wo was ab- field“ mit einem beliebigen Wert belegt und
läuft. PHP wird auf dem Server verarbei- das Formular abgesendet. Alle anderen Fel-
tet. Die mit dem Skript erzeugten Ausga- der werden unverändert verarbeitet. In
Abb. 1: Formular zu Listing 1 in Aktion Abb. 2: Die Interaktion von JavaScript und PHP funktioniert perfekt
PHP können Sie auf die Variable $myfield Das Absenden des Formulars kann man error() erfolgt die Übergabe der Ergeb-
bzw. $HTTP_POST_VARS[„myfield“] auch durch JavaScript erledigen lassen, z.B. nisse an JavaScript und die erneute Anzei-
zugreifen, um den Wert auszulesen. Verges- nach der Absolvierung aller Prüfungen: ge – ohne Bruch der Benutzerführung.
sen Sie nicht „global“, um dies auch in Abbildung 2 zeigt dieses Wechselspiel –
Funktionen sichtbar zu machen. document.<formname>.submit() beim Absenden eines leeren Feldes erfolgt
hier keine Übertragung zum Server. Mit
Mit Formularen spielen Was Sie bei der Entwicklung clientsei- wenig Aufwand ist es möglich, nun auch
JavaScript erlaubt manchmal einfach tiger Prüfungen beachten sollten, betrifft zwischen Browsern mit und ohne JavaS-
Lösungen für eine raffinierte Benutzer- eine konsistente Benutzerführung. Es ist cript zu unterscheiden. Ohne die Verfüg-
führung. Angenommen, Sie möchten auf unglücklich, zuerst mit JavaScript-seiti- barkeit von JavaScript erfolgt die Prüfung
Ihrer Webseite eine Abstimmung auf- gen Alert-Meldungen zu arbeiten und der Daten nur mit PHP. Wenn JavaScript
bauen, dann wäre ein Formular mit dem nach der Prüfung in PHP – die vielleicht aktiviert ist, profitiert der Benutzer durch
in Abbildung 1 gezeigten Aussehen so umfassender und genauer ist – rote Fehler- schnelleren Seitenaufbau und weniger
einfach wie möglich und so funktional texte auszugeben. In solchen Fällen mag Serverzugriffe.
wie nötig. Listing 1 zeigt den Code für Ihnen mit ein wenig JavaScript und dem
dieses Formular, wobei die oben bereits HTML-Objektmodell geholfen sein. Das Optimales Zusammenspiel
beschriebene Mischung aus PHP und Ja- Skript in Listing 6 zeigt Fehlermeldungen Kleine Chat-Lösungen erfreuen sich nach
vaScript mit der Wertübergabe verwen- im HTML-Text an – ebenso wie Sie dies wie vor großer Beliebtheit. Das hier vorge-
det wird. mit PHP realisieren können. Es basiert auf stellte Projekt realisiert einen Chat, der ser-
einem Layer und einem kleinen Formular: verseitig auf MySQL und PHP-Sessions
Zugriff auf Formulare basiert, clientseitig die Darstellung aber
Der Zugriff auf Formulare ist per Java <div id=“errors“></div> durch JavaScript unterstützt. Dies vermin-
Script sehr einfach. Wenn der Code im <form name=“myform“ method=“post“> dert etwas den Datentransfer zwischen
aktuellen Dokument steht, können Sie <input type=“Text“ name=“namefield“ value=“<?php echo Client und Server und bietet dadurch einen
$namefield; ?>“>
sich an folgenden Aufrufen orientieren. ähnlichen Komfort wie Chats, die auf Java
<input type=“button“ value=“Absenden“ onclick=“check()“>
Dabei ersetzen Sie <formname> durch basieren. Im Ganzen besteht der Chat aus
</form>
den Namen des Formulars (Attribut na- einer Datenbanktabelle, die alle Einträge
me=“„ im <Form>-Tag) und <feldname> der Chatter ausnimmt. Hier der Code, mit
durch den Namen eines Felds (Attribut Abgefangen wird das onClick-Ereig- dem Sie die Tabelle erzeugen können:
name=“„ im <input>-Tag). Die folgen- nis, das zur ersten Prüfung mit Java Script
den Formen erlauben den Zugriff auf den führt. In diesem Fall wird nur die Länge CREATE TABLE chat (
Feldwert: überwacht. Falls zu wenig Zeichen einge- id bigint(20) NOT NULL auto_increment,
time varchar(10) NOT NULL,
geben wurden, erscheint eine entspre-
data text,
document.<formname>.<feldname>.value = „Neuer Wert“; chende Meldung. Reicht die Anzahl der
sender varchar(32) DEFAULT ‘1’ NOT NULL,
variable = document.<formname>.<feldname>.value; Zeichen aus, wird das Formular versen-
PRIMARY KEY (id),
det – das Skript ruft sich dabei selbst auf. KEY id (id)
Die Eigenschaften des Formulars wer- In PHP erfolgen weitere Prüfungen (im );
den folgendermaßen festgelegt: Listing 6 ist dies natürlich nur angedeu-
tet). Je nach Struktur der Daten werden Neben der ID wird ein Zeitstempel ti-
document.<formname>.method = „Post“; verschiedene Meldungen in der Variablen me und der Name des Chatters sender
document.<formname>.action = „url“; $errors abgelegt. In der Funktion show_ festgehalten. In data stehen die Einträge.
Geladen!
gen werden.
•Ebenfalls im <form>-Tag muss der Wert
des enctype-Attributs auf multipart/form-
data gesetzt werden, ansonsten kann die
zu übertragende Datei serverseitig nicht
ausgelesen werden.
von Christian Wenz
•Das action-Attribut des Formulars wird
auf [Link] ersetzt. Die Formular-
daten, also auch die zu übertragende
Datei-Uploads mit PHP leicht gemacht Datei, werden an dieses Skript ver-
schickt. Wir werden also im Folgenden
eine [Link] entwickeln müssen.
•Das Formularfeld, das für die Dateiüber-
tragung zuständig ist, heißt <input
Eines der seltener verwendeten HTML-Ele- Normalerweise ist es nicht im Sinne type=“file“>. Das name-Attribut ist
mente ist <input type=“file“>. Damit können des Webmasters, wenn ein Surfer Dateien hierbei wichtig; setzen Sie es auf eine ein-
auf seinen Server überspielen kann. Doch deutige Zeichenkette (in unserem Bei-
Dateien per Formular auf den Webserver über-
keine Regel ohne Ausnahmen. Stellen spiel: datei).
tragen [Link] vielen Skriptsprachen ist Sie sich beispielsweise einen Webserver
das Arbeiten mit diesen Dateien mühsam oder vor, der hinter einer Firewall steht. FTP- Im Browser wird das File-Upload-For-
erfordert externe Komponenten – nicht so bei Zugriff ist nur von hinter der Firewall aus mularfeld durch ein Eingabefeld nebst
[Link] ist es ein Leichtes, auf die Daten zuzu- möglich, also beispielsweise im Netzwerk Schaltfläche DURCHSUCHEN oder
greifen und [Link] PHP 4.0.3 der betreuenden Agentur. Weder der Kun- BROWSER dargestellt. Durch einen Klick
de noch irgendwelche anderen Personen auf diese Schaltfläche öffnet sich ein Dia-
gibt es hierzu neue Funktionen, auf die wir ei-
haben von außen Zugriff. Auf einer pass- logfenster, in dem der Benutzer die zu
nen gesonderten Blick werfen mö[Link] wortgeschützten Seite kann dem Kunden übertragende Datei per grafischer Ober-
auch Benutzer von PHP 3 kommen hier nicht zu jedoch die Möglichkeit geboten werden, fläche auswählen kann. Alternativ dazu
kurz. Dateien in ein bestimmtes Verzeichnis zu kann der Dateiname (inklusive komplet-
übertragen. Dies können HTML-Seiten tem Pfad) auch direkt in das Textfeld ein-
sein, aber auch andere Dateitypen wie et- gegeben werden.
wa PDFs oder Grafiken.
PHP-Vorbereitungen
HTML-Vorbereitungen In der [Link] (bzw. [Link] für PHP 3) fin-
Das Webinterface für dieses Szenario ist den Sie nach der Standardinstallation die
schnell erstellt: folgenden Einträge:
Anzeige
LinuxAbo_Doppelseite 23.08.2001 9:56 Uhr Seite 2
LinuxAbo_Doppelseite 23.08.2001 9:56 Uhr Seite 2
Anzeige
LE_PHP (61-72) 23.08.2001 10:47 Uhr Seite 66
PHP-Shellskripts
die Möglichkeit, situationsabhängige
Daten zur Laufzeit über eine Eingabeauf-
forderung eingeben zu können, sehr hilf-
reich.
In PHP gibt es grundsätzlich zwei Al-
mitUsereingaben
ternativen zum Lesen von der Standard-
eingabe:
Pseudoprotokoll php://
Ab PHP3 können Usereingaben über das
Pseudoprotokoll php:// verarbeitet wer-
von Christiane Schmidt-Köster den. Die Standardeingabe wird hierfür
wie eine ganz normale Datei aus dem
Skript heraus mit fopen() geöffnet. Mit
Hilfe von fgets() kann dann das Warten
Lesen aus der Standardeingabe mit PHP des Skriptes auf Eingaben hervorgerufen
werden. Nach Betätigen der Entertaste
kann der Rückgabewert von fgets() – also
die Usereingabe – wie gewohnt ausge-
wertet werden. Dieser enthält auch
das/die Steuerzeichen für den Zeilenum-
bruch!
Lesen aus der Standardeingabe über
das Pseudoprotokoll php:// ist sowohl un-
ter Windows, als auch unter Unix/Linux
möglich. Ein Beispiel:
#!/usr/local/bin/php
Auch mit PHP sind Shellskripts möglich, die Voraussetzung für PHP-Shellskripts ist <?php
gerne dazu verwendet werden, um automati- die CGI-Variante von PHP, die als Standa-
echo „Ihr Name: „;
lone-Binary im Programmpfad liegen
sierte Vorgänge abzuwickeln, oder um aufwen-
sollte. Es ist übrigens kein Problem, die
if ($fp = fopen(„php://stdin“,“r“)) {
dige Administrationsarbeiten zu erleichtern. CGI-Binary und PHP als Apache-Modul $line = fgets($fp,100);
Gerade bei letzteren kann es nützlich sein, auf einem Server parallel zu betreiben. fclose($fp);
wenn dort auch Usereingaben verarbeitet wer- PHP-Skripts können dann durch gemein- }
samen Aufruf mit der Binary (php script-
den kö[Link] kann zum einen eine einfache
[Link]) interpretiert und ausgeführt $name = ereg_replace(„[\n\r]“, ‘’, $line);
Nachfrage aus Sicherheitsgründen vor kriti- werden. Auf Unix/Linux-Systemen ist es
schen Operationen sein („Möchten Sie wirk- sogar möglich, solche Skripte durch An- echo „Hallo $name !“ ;
lich....? (j/n)“), zum anderen wäre es denkbar, gabe des Pfades zur Binary in der ersten
?>
Zeile (z.B. #!/usr/local/bin/php) nach Set-
bestimmte Informationen erst zur Laufzeit des
zen des Ausführungsrechts wie jedes an-
Skriptes abzufragen, die dann den weiteren dere Shellskript zu starten. Anmerkung: Ähnlich funktionieren
Verlauf des Skriptes beeinfl[Link] Menü- Während viele PHP-Shellskripts für php://stdout und php://stderr.
gesteuerte Abläufe sind auf diese Weise mög- wiederkehrende Aktionen mithilfe des
Dämons Cron eingesetzt werden, z.B. zur Funktion readline() und Verwandte
[Link] nützlich zum Schnelltest von
Datenbankbereinigung, ist es manchmal Ab PHP 4 >= 4.0b4 kann über die Funk-
PHP-Features ist außerdem ein Skript, das PHP- sinnvoll, solche Skripts direkt aufzuru- tion readline() von der Standardeingabe
Code aus der Standardeingabe entgegen fen, um administrative Jobs abzuwi- gelesen werden. Die Funktion ist Teil der
nimmt und diesen sofort ausführt. ckeln. Skripte, die über das Apache- PHP-Readline-Extension, die ein Inter-
Modul ausgeführt werden, sind in die- face zur GNU Readline Library darstellt
sem Fall oft nicht geeignet, da weiterge- und in voller Funktionalität nur auf
hende Rechte benötigt werden, als Unix/Linux-Systemen zur Verfügung
dem Apache-User zur Verfügung stehen. steht. Analog zu anderen Extensions muss
Gerade für solche PHP-Shellskripts ist PHP in diesem Fall mit der Option --with-
mehr als
True Type Fonts die FreeType Bibliothek
mittels --with-ttf eingebunden werden, die
Unterstützung für Adobe T1-Fonts wird
mittels der T1-Bibliothek und dem Para-
meter --with-t1lib eingebunden.
<?php
Header(„Content-type: image/png“);
Mittels PHP erhält der Webentwickler ein An dieser Stelle sind die Imaging Functions ImagePNG($im);
Werkzeug, das viele Möglichkeiten bietet. von PHP die richtige Wahl. Sie stellen eine ImageDestroy($im);
Schnittstelle zu GD dar. GD wiederum ist ?>
Durch die einfache Programmierung erhält ein eine Bibliothek, die Funktionen zur Erzeu-
Anfänger sehr schnell Erfolgserlebnisse, für ei- gung und Bearbeitung von Bitmapgrafiken Um ein Bild erzeugen zu können, muss
nen Profi bietet PHP genug [Link] Da- zur Verfügung stellt. An Bitmap Formaten zunächst eine entsprechende Datenstruk-
ten effektvoll und leicht verständlich darstellen werden JPEG, PNG und WBMP unter- tur angelegt werden. Der Aufruf Image-
stützt. Das GIF-Format wurde früher Create erwartet hierzu die Breite und Höhe
zu können, werden Möglichkeiten benötigt, unterstützt, dann aber zugunsten von der zu erzeugenden Grafik in Pixeln und
diese Daten grafisch [Link] die Da- PNG entfernt, unter anderem um mög- gibt bei Erfolg einen Handle zurück, der
ten jedoch dynamisch sind, sind vordefinierte lichen Lizenzforderungen von UNISYS, für alle nachfolgenden Aufrufe als Parame-
Bitmapgrafiken hier nicht mehr ausreichend. dem Inhaber eines Patentes auf den im ter zu verwenden ist. Der Ursprung des Ko-
GIF-Format verwendeten LZW-Kompres- ordinatensystems befindet sich in der lin-
sions-Algorithmus, entgegenzuwirken. ken oberen Ecke. In dem obigen Beispiel
werden dann jeweils durch Angabe von
Installation Rot-, Grün- und Blauanteil die Hinter-
Die Installation erfolgt analog zur Instal- grundfarbe weiß und als Textfarbe eine Art
lation aller anderen Schnittstellen von rot vereinbart und ein Text erzeugt. Dane-
PHP über einen Parameter beim ./configu- ben kann ein Bild auch von einem schon
re. Für GD ist dies der Parameter --with- vorhandenen Bild generiert werden. Hier-
gd. Damit wird die Schnittstelle zu GD in zu dienen die Funktionen ImageCreate-
PHP eingebunden. Wie in [ST01] be- FromJPEG und ImageCreateFromPNG,
schrieben, kann es nötig sein, den Pfad zu die ebenfalls einen Handle auf die erzeugte
GD mittels --with-gd=path_to_gd anzu- Datenstruktur zurückgeben. Zu beachten
geben, falls GD vom configure-Skript ist bei Verwendung der letzten beiden
nicht gefunden werden kann. Auch ist es Funktionen, dass zuerst das Bild von der
möglich, die Schnittstelle zu GD mittels externen Quelle angelegt wird, und erst
shared als dynamisch ladbare Bibliothek danach eigene Farben mittels ImageColor-
einzubinden. Auf die Installation von GD Allocate angefordert werden.
selbst soll hier nicht genauer eingegangen Um das erzeugte Bild vom Server an
werden, es sind jedoch mindestens folgen- den Client zu schicken, werden die letzten
Herausgeber:
Impressum Autoren dieser Ausgabe: Anzeigen © 2001 für alle Beiträge.
Software & Support Verlag GmbH Sebastian Bergmann,Uwe Debacher, MARKETING PROJEKT 2000 GMBH Alle Rechte, auch für Übersetzungen, sind vor-
Martin Drahorad, Jens Gräfe, Albrecht Hochstr. 3 behalten. Reproduktionen jeglicher Art (Foto-
Anschrift der Redaktion: Günther, Markus Hasenbein, Martin 86453 Dasing kopie, Nachdruck, Mikrofilm oder Erfassung
Linux Enterprise Jansen, Jörg Krause, Bernd Kretschmer, Tel. 08205 / 96 233 auf elektronischen Datenträgern) nur mit
Software & Support Verlag GmbH Dr. Nadja Rosmann, Christiane Schmidt- Fax 08205 / 96 23 - 45 schriftlicher Genehmigung des Verlags. Eine
Kennedyallee 87 Köster, Björn Schotte, Uwe Steinmann, eMail: info@[Link] Haftung für die Richtigkeit der Veröffentlichun-
60596 Frankfurt am Main Dr. Andreas Stübinger, Ulf Wendel, gen kann trotz Prüfung durch die Redaktion
Tel.: (069) 63 00 89 - 0 Christian Wenz Aboservice vom Herausgeber nicht übernommen werden.
Fax: (069) 63 00 89 - 89 Software & Support Verlag GmbH Honorierte Artikel gehen in das Verfügungs-
eMail: redaktion@[Link] Pressevertrieb: Tel. 069 / 630089 0 recht des Verlags über. Mit der Übergabe der
WWW: [Link] IPV Inland Presse Vertrieb GmbH Fax 069 / 630089 89 Manuskripte, Abbildungen eventueller Quell-
Postfach 10 32 46 eMail: abo@[Link] codes an den Verlag erteilt der Verfasser dem
Chefredaktion: Dr. Nadja Rosmann 20022 Hamburg Herausgeber das Exklusivitätsrecht zur Veröf-
eMail: nrosmann@[Link] Abonnementpreise ( Linux Enterprise ) fentlichung. Für unverlangt eingesandte Ma-
Redaktion: Sebastian Meyen, Erscheinungsweise: Inland 12 Ausgaben DM 54,50 nuskripte, Abbildungen oder Quellcodes keine
Andrea Streb monatlich Studentenpreis 12 Ausgaben DM 45,- Gewähr.
Redaktionsassistenz: Mark Hohe-Dorst, Europ. Ausland 12 Ausgaben DM 74,50
Meike Wulf Linux ist eingetragenes Warenzeichen von Li-
Herstellungsleitung: Jens Mainz Einzelverkaufspreis nus Torvalds. Alle weitere Markennamen sind in
Layout, Titel: Deutschland DM 5,- der Regel eingetragene Warenzeichen der ent-
Dominique Bergmann, Schweiz sfr 5,- sprechenden Hersteller oder Organisationen.
Tobias Friedberg, Melanie Hahn, Österreich öS 40
Jens Mainz, Maria Rudi Luxemburg lfr 122
PostgreSQL Datenbanken
Installation
Die Installation ist insbesondere unter Li-
nux einfach, selbst dann, wenn Sie die Da-
tenbank aus den Quellen übersetzen möch-
ten. In der Regel ist dies jedoch nicht
notwendig, da nahezu alle Linux-Distribu-
tionen fertige Pakete mitliefern. Gegebe-
nenfalls müssen Sie noch das Datenver-
zeichnis data unterhalb des PostgreSQL
Installationsverzeichnisses erstellen und
dort mit initdb die Datenbankstruktur initi-
alisieren. Eine Konfiguration der Daten-
bank erfolgt in der Datei pg_hba.conf. Dar-
in werden insbesondere die Zugriffsrechte
festgelegt. Ohne Modifikationen an dieser
Datei sollte ein Zugriff von Clients vom glei-
chen Rechner bereits möglich sein. Für eine
genaue Beschreibung der Datei sollten Sie
die ausführliche Dokumentation zu Rate
Open Source
ziehen.
PHP mit PostgreSQL-Unterstützung zu
installieren setzt voraus, dass zumindest die
PostgreSQL-Bibliotheken auf dem Zielsys-
tem installiert sind. Die Datenbank selbst
Alternative
kann natürlich auf einem anderen System
beherbergt sein. Sofern kein vorkompilier-
tes PHP mit PostgreSQL-Unterstützung
verwendet wird, werden noch die entspre-
chenden Header-Dateien und natürlich die
von Uwe Steinmann PHP-Quellen zum Übersetzen benötigt. Bei
der Konfiguration von PHP muss die Op-
tion --with-pgsql und dies gegebenenfalls
PostgreSQL als Alternative zu kommerziellen unter Angabe des Verzeichnisses, in das die
Datenbank installiert wurde, angegeben
Datenbanken und MySQL werden. Die PostgreSQL-Unterstützung
unterscheidet sich hier nicht von der vieler
anderer PHP-Erweiterungen, sodass auch
eine eigene Installation leicht fallen sollte.
Denkt man an PHP und Datenbanken, dann ist PostgreSQL verfügt bereits über eine lange
MySQL nicht [Link]ßlich kann MySQL- Geschichte, die mit dem Datenbanksystem Erste Schritte
Ingres an der University of California im Alle PostgreSQL-Kommandos, die PHP
Unterstützung ohne weitere Software in PHP Jahr 1977 begann. Nach ständiger Weiter- bereitstellt, beginnen mit dem Präfix pg_.
eingebunden [Link] es gibt Alternati- entwicklung wurde 1994/95 Unterstützung Für einen ersten Test ist bereits das fol-
ven, die ähnlich einfach wie MySQL eingesetzt für SQL implementiert und Postgres95 her- gende einfache Skript ausreichend. Es
werden können, kostenlos sind und darüber ausgebracht. Im Namen manifestiert wurde öffnet und schließt lediglich eine Daten-
diese Erweiterung erst etwas später, was zu bank mit dem Namen test auf dem Host
hinaus weitere Funktionen [Link] der heutigen Bezeichnung PostgreSQL localhost.
ist eine solche Alternative. führte. PostgreSQL in ihrer aktuellen Ver-
sion 7.1 ist eine leistungsfähige objekt-rela- <?php
Datenbanken PostgreSQL
gleichen Rechner läuft, auf dem das Skript entsprechendes PHP-Skript absetzen kön-
Listing1 ausgeführt wird und zum anderen eine Da- nen. Das dazu notwendige Kommando ist
[Link] tenbank mit dem Namen test existiert. Ei- pg_exec(). Mit pg_exec() können unter
<? ne solche Datenbank kann leicht in einer Angabe der Datenbankverbindung alle
include(„[Link]“); Shell mit den Kommando createdb test an- SQL-Anfragen ausgeführt werden. Die
?>
gelegt werden. Da nicht explizit der Rech- Funktion liefert false zurück, falls ein Feh-
<HTML>
<HEAD> nername angegeben wurde, auf dem die ler bei der Ausführung der Anweisung
<TITLE>Briefmarkenalbum</TITLE> Datenbank läuft, wird als Voreinstellung auftritt. Die genaue Fehlermeldung kann
</HEAD> localhost gewählt. Ohne Angabe des dann mit der Funktion pg_errormessage()
<BODY bgcolor=“white“> Rechnernamens ist es auch unwesentlich, erfragt werden. Es ist in jedem Fall sinn-
<CENTER>
ob der Datenbankserver mit der Option „- voll, Aufrufen von pg_exec() ein at-Zei-
<H1>Virtuelles Briefmarkenalbum</H1>
</CENTER> i“ oder ohne diese gestartet wurde. Post- chen voranzustellen, um eine mögliche
<? greSQL erlaubt es, mit der Option „-i“ so- Fehlerausgabe durch die Funktion zu
$conn = @pg_Connect(„user=$dbuser dbname=$dbname“);
wohl Verbindungen über TCP/IP, als auch unterdrücken. Stattdessen sollte eine eige-
if (!$conn) { über Unix-Domain-Sockets entgegen zu ne Fehlerbehandlung für die Ausgabe ei-
echo „Es ist ein Fehler aufgetreten: <B>\“„.pg_ nehmen. Wenn als Host explizit localhost ner für den Anwender verständlichen Feh-
errormessage($conn).“\“</B>\n“; angegeben wird, dann sollte auch die Op- lermeldung sorgen. Etwa in der folgenden
exit; tion „-i“ verwendet werden, ohne die das Form:
}
obige Skript keine Verbindung hätte auf-
$result = @pg_Exec($conn, „select * from briefmarken bauen können. Alternativ zu pg_connect() $result = @pg_exec($db, $sqlstmt);
order by jahr“); existiert eine Variante zur Öffnung einer if($result == FALSE) {
if (!$result) { echo „....“;
persistenten Datenbankverbindung durch
echo „Es ist ein Fehler aufgetreten: <B>\“„.pg_ } else {
errormessage($conn).“\“</B>\n“; pg_pconnect(). Sie verspricht eine Be-
}
pg_close($conn); schleunigung des Verbindungsaufbaus, da
exit; sie auf bestehende Verbindungen zurück- Wenn der Aufruf von pq_exec() erfolg-
} greift. reich das SQL-Kommando absetzen konnte
$num = pg_NumRows($result); Für weitere Experimente mit der Daten- und zudem Datensätze als Ergebnis erwar-
echo „ <CENTER><H3>Album beinhaltet $num bank muss zunächst eine Datenbanktabelle tet werden, dann werden diese in einem
Briefmarken</H3></CENTER>\n“;
angelegt werden. Am einfachsten erfolgt möglicherweise mehrzeiligen Ergebnisda-
?>
<HR WIDTH=40%> dies mit dem PostgreSQL Monitorpro- tensatz zurückgeliefert. Zugriff auf dieses
<CENTER> gramm psql. Verwenden Sie am besten ei- Ergebnis erhalten Sie mit den Kommandos
<A HREF=“[Link]“>LISTE DER BRIEFMARKEN</A> | nen Benutzernamen, den Sie vorher mit cre- pg_fetch_row(), pg_fetch_array() oder
<A HREF=“[Link]“>NEUE BRIEFMARKE</A> ateuser vergeben haben. Grundsätzlich pg_fetch_object(). Jede diese Funktionen
</CENTER>
bietet sich auch die Möglichkeit, als System- liefert eine Zeile des Ergebnisdatensatzes
<HR WIDTH=40%>
<UL> benutzer zu arbeiten. Es gilt jedoch auch zurück, entweder als assoziatives Array, als
<TABLE> hier der Grundsatz, dass man nur dann als indiziertes Array oder als Objekt. Für wel-
<? Systembenutzer arbeitet, wenn dies zwin- che der drei Funktionen man sich entschei-
for($i=0; $i<$num; $i++) { gend erforderlich ist. Lautet der Benutzer- det, ist eine Frage des Geschmacks. Wenn
$datensatz = pg_fetch_object($result, $i);
name gleich dem der Datenbank, dann man beispielsweise auf die obige Tabelle ei-
echo “ <TR><TD><A HREF=\“[Link]?id=
“.$datensatz->id.“\“>Löschen</A></TD><TD> reicht es aus, psql -U <name> aufzurufen. ne SELECT-Anweisung ausführte und alle
<A HREF=\“[Link]?oid=“.$datensatz->bild.“\“> Man meldet sich damit unter dem angege- Felder erfragte, dann erhielte man entweder
<IMG WIDTH=25% RC=\“[Link]?oid=“ benen Namen bei dem Datenbankserver an ein assoziatives Array mit den Feldnamen
.$datensatz->bild.“\“BORDER=0></A></TD> und wählt gleichzeitig die Datenbank mit als Schlüssel, ein indiziertes Array oder aber
<TD>$datensatz->titel, $datensatz->jahr,
dem gleichen Namen aus. ein Objekt mit den Feldnamen als Eigen-
$datensatz->nennwert Pfennig</TD></TR>\n“;
} Für eigene Experimente sollten Sie eine schaftsnamen. Es gibt sogar noch eine vierte
pg_FreeResult($result); einfache Datenbanktable anlegen, bei- Möglichkeit über die Funktion pg_result().
pg_Close($conn); spielsweise die folgende: Mit ihr kann man auf einzelne Felder eines
?> Datensatzes zugreifen. In der Regel bedeu-
</TABLE> CREATE TABLE adressen (id INTEGER, name char(50), tet dies jedoch mehr Aufwand, weil immer
</UL> strasse char(50), ort char(20));
</BODY> nur ein Feld erfragt werden kann.
</HTML> Die Anzahl der Zeilen im Ergebnisda-
Mit \d adressen können Sie sich die tensatz kann mit pg_numrows() erfragt
Struktur der neuen Tabelle im Monitor- werden. Ein übliches Konstrukt, um alle
programm anschauen. Diese SQL-Anwei- Zeilen einer Anfrage auszuwerten, ist das
sung hätte man auch ebenso gut über ein Folgende:
PostgreSQL Datenbanken
Abb. 1: Auflistung
der Briefmarken als
Tabelle
Listing 2
[Link]
<?php
include(„[Link]“);
header(„Content-Type: image/*“);
pg_exec($conn, „begin“);
$lobj = pg_loopen($conn, $oid, „r“);
do {
$l = pg_loread($lobj, 8192);
if($l)
echo $l;
Abb. 2: Einfügen } while($l != false);
neuer Marken pg_loclose($lobj);
durch das HTML- pg_exec($conn, „commit“);
Formular
pg_close($conn);
?>
Listing 3
[Link]
<HTML>
<HEAD>
<TITLE>Neue Briefmarke einfügen</TITLE>
</HEAD>
<BODY bgcolor=“white“>
$result = @pg_exec($db, „select * from adressen); existieren eine Reihe von Funktionen, die <CENTER>
if(!$result) sich auf die Felder eines Ergebnisdatensat- <H1>Neue Briefmarke einfügen</H1>
exit; </CENTER>
zes beziehen. So lässt sich mit pg_fieldna-
$c = pg_numrows($result); <HR WIDTH=40%>
me(), pg_fieldsize() und pg_fieldtype() der <FORM method=POST ENCTYPE=“multipart/form-data“
for($i=0; $i<$c; $i++) {
Name, die Größe in Byte und der Typ eines ACTION=“[Link]“>
$obj = pg_fetch_object($result, $i);
Feldes erfragen. pg_fieldnums() liefert die <TABLE>
// Verarbeitung der Daten
}
Anzahl der Felder. Mit diesen Funktionen <TR><TD>Titel der Briefmarke: </TD><TD>
lässt sich somit sehr leicht die Tabellen- <INPUT TYPE=“input“ NAME=“titel“></TD></TR>
Ebenso kann die tatsächliche Länge ei- struktur rekonstruieren. <TR><TD>Nennwert der Briefmarke: </TD><TD>
<INPUT TYPE=“input“
nes Feldes mit pg_fieldprtlen() festgestellt Das Einfügen neuer Datensätze kann
NAME=“nennwert“></TD></TR>
werden und mit pg_fieldisnull(), ob ein ebenfalls über die Funktion pg_exec() und <TR><TD>Erscheinungsjahr der Briefmarke:
Feld Null ist. Die beiden letzten Funktio- der entsprechenden SQL INSERT-Anwei- </TD><TD> <INPUT TYPE=“input“ NAME=“jahr“ SIZE=4
nen benötigen dazu wieder eine Nummer, sung erfolgen. Von Interesse ist in diesem MAXLENGTH=4></TD></TR>
die die Zeile im Ergebnisdatensatz aus- Zusammenhang eine Eigenschaft von <TR><TD>Dateiname der Briefmarke:
wählt. PostgreSQL, die es erlaubt über eine globa- </TD><TD> <INPUT TYPE=“file“
Sollte ein Ergebnisdatensatz nicht mehr le Objektkennung, den zuletzt eingefügten NAME=“briefmarke“></TD></TR>
<TR><TD></TD><TD><INPUT TYPE=“Submit“
benötigt werden, dann kann er mit pg_free- Datensatz zu ermitteln. pg_getlastoid() lie-
VALUE=“Einfügen“></TD></TR>
result() aus dem Speicher entfernt werden. fert diese Kennung, die wie eine versteckte </TABLE>
Falls dieses nicht geschieht, so sorgt mit Be- Spalte in jeder Tabelle verfügbar ist. Über </FORM>
enden des Skripts PHP selbst dafür. eine SELECT-Anweisung der Form </BODY>
Neben den Funktionen, um Daten aus SELECT * from tablename where </HTML>
dem Ergebnisdatensatz zu extrahieren, oid=’$oid´, wobei die Variable $oid zuvor
Datenbanken PostgreSQL
mit pg_getlastoid() gesetzt wurde, lässt sich und Applikationsserver auf getrennten kenablum realisiert. Die notwendige Da-
der zuletzt eingefügte Datensatz ermitteln. Rechnern betrieben werden. tenbanktabelle kann durch die SQL-An-
Dies kann immer dann sinnvoll sein, wenn Um beispielsweise die obige Tabelle weisung
Felder erst mit dem Einfügen des Datensat- um ein Foto der Person zu erweitern, ist le-
zes gesetzt werden, z.B. durch eine Sequenz diglich eine weiteres Feld, beispielsweise
oder die aktuelle Zeit. Man sollte jedoch mit dem Namen Foto und vom Typ oid
nicht den Fehler machen, diese Objektken- notwendig. Das Foto als BLOB kann mit
nung als Ersatz für Sequenzen oder gar als
Schlüssel zu verwenden. Schon das Über-
der Funktion pg_locreate(), pg_loopen()
und pg_lowrite() oder pg_loimport() er-
Listing 4
[Link]
tragen eines Datenbestandes auf einen an- stellt werden. Die von pg_locreate() zu- <?
deren Datenbankserver wird zum Pro- rückgelieferte Objektkennungen muss in include(„[Link]“);
blem, weil die OIDs nur dann vom dem Feld Foto der Tabelle adressen durch ?>
Anwender vorgegeben werden können, eine INSERT- oder UPDATE-Anweisung <HTML>
wenn sie auf dem Zielsystem nicht bereits eingetragen werden. <HEAD>
vergeben sind. <TITLE>Briefmarke einfügen</TITLE>
PostgreSQL unterstützt auch soge- Transaktionen </HEAD>
nannte Binary Large Objekts (BLOB). Alle Operationen auf BLOBs müssen <BODY bgcolor=“white“>
<CENTER>
BLOBs sind binäre Daten, die keine feste innerhalb einer Transaktion ausgeführt
<H1>Virtuelles Briefmarkenalbum</H1>
Struktur aufweisen und in der Regel deut- werden. Transaktionen werden mit
</CENTER>
lich größer sind, als dass sie von einem Ta- der SQL-Anweisung BEGIN begonnen <HR WIDTH=40%>
bellenfeld aufgenommen werden können. und mit COMMIT erfolgreich abge- <CENTER>
Häufig handelt es sich dabei um Videos, schlossen beziehungsweise mit ROLL- <A HREF=“[Link]“>LISTE DER BRIEFMARKEN</A> |
Bilder, Applets aber auch große Texte. BACK rückgängig gemacht. Diese Forde- <A HREF=“[Link]“>NEUE BRIEFMARKE</A>
Der Umgang mit BLOBs ist sehr daten- rung ist schon deshalb sinnvoll, weil </CENTER>
bankabhängig und wird bei PostgreSQL Operationen auf BLOBs häufig auch Än- <HR WIDTH=40%>
über die Funktionen mit dem Präfix pg_lo derungen an der Tabelle, die die Referenz <?php
realisiert. Die Funktionen erinnern sehr auf das BLOB enthält, notwendig ma- $fd = fopen($briefmarke, „r“ );
stark an herkömmliche Dateioperation chen. Es sind also mindestens zwei Daten- $blob = „“;
while($cont = fread( $fd, 1000))
und in der Tat legt PostgreSQL jedes bankoperationen notwendig, um bei-
$blob .= $cont;
BLOB als Datei auf der Festplatte ab und spielsweise ein BLOB abzulegen. Schlägt
fclose( $fd );
liefert lediglich die globale Objektken- eine der beiden Operationen fehl, sollte
nung zurück. Die Verwaltung der BLOBs auch die andere nicht ausgeführt werden. $conn = @pg_Connect(„user=$dbuser dbname=
obliegt damit zu einem Teil der Daten- Der Zugriff auf ein BLOB erfolgt $dbname“);
if (!$conn) {
bankanwendung und liegt somit in der durch die Funktionen pg_loopen(),
echo „Es ist ein Fehler aufgetreten: <B>
Verantwortung des Programmierers. Die pg_loread() und pg_loreadall(). Falls
\“„.pg_errormessage($conn).“\“</B>\n“;
Tatsache, dass auch hier OIDs verwendet ein BLOB gelöscht werden soll, dann ist exit;
werden, die möglicherweise als Referenz dies über pg_lounlink() möglich. Hierbei }
in Tabellenfeldern auftauchen, macht eine sollte beachtet werden, dass diese Opera-
@pg_exec($conn, „begin“);
Übertragung des Datenbestands auf einen tion möglicherweise eine entsprechende
if(FALSE == ($oid = pg_locreate ($conn))) {
anderen Server schwierig oder im Einzel- Änderung des Datensatzes mit der Refe- echo „Es ist ein Fehler aufgetreten: <B>
fall auch unmöglich. Nicht ganz unpro- renz des BLOBs zur Folge hat. Hierin \“„.pg_errormessage($conn).“\“</B>\n“;
blematisch ist auch die Tatsache, dass liegt auch die größte Gefahr bei der Ver- pg_close($conn);
Werkzeuge wie pg_dump nur bedingt bei wendung von BLOBs. Sie sollten immer exit;
der Übertragung des Datenbestands wei- bedenken, dass, sobald die Referenz auf }
ter helfen. Mit ihnen lassen sich Tabellen das BLOB verloren geht, keine Möglich- $handle = pg_loopen ($conn, $oid, „w“);
und ihre Daten aus einer Datenbank keit mehr besteht, darauf zuzugreifen. In pg_lowrite ($handle, $blob);
extrahieren, die BLOBs werden aller- so einem Fall hilft nur noch der SQL-Mo- pg_loclose ($handle);
dings nicht beachtet und müssen daher nitor psql, in dem man mit dem Kom- // Schritt 5: Eintrag des neuen Objekts in der Tabelle
durch Handarbeit übertragen werden. mando \lo_list zumindest alle Objekt- atom
Dennoch bieten die BLOBs in Post- kennungen der BLOBs auflisten kann, $query = „insert into briefmarken (titel, nennwert, jahr,
greSQL einen Vorteil gegenüber der ma- um sie dann mit \lo_unlink zu löschen. bild) values (‘„.$titel.“‘,“.$nennwert.“,“.$jahr.“,“.$oid.“)“;
nuellen Ablage im Dateisystem. Über das $result
Datenbankprotokoll ist der Zugriff auf Beispiel
die BLOBs auch dann noch unproblema- Die Listings 1 bis 6 zeigen ein einfaches
tisch möglich, wenn Datenbankserver Beispiel, welches ein virtuelles Briefmar-
PostgreSQL Datenbanken
CREATE TABLE briefmarken (
Listing 5 id serial,
titel varchar,
[Link]
nennwert int,
jahr int,
<?
bild oid
include(„[Link]“);
);
?>
<HTML>
erstellt werden.
<HEAD>
<TITLE>Briefmarke löschen</TITLE>
Es können Briefmarken eingefügt, aufgelistet und gelöscht
</HEAD>
<BODY bgcolor=“white“>
werden. In der Datenbanktabelle briefmarken wird neben dem
<CENTER> Titel, Nennwert und Erscheinungsjahr auch die Objekt-ID eines
<H1>Briefmarke loeschen</H1> BLOBs abgelegt. Dahinter verbirgt sich ein eingescanntes Bild
</CENTER> der Briefmarke. Die Datei [Link] listet alle Briefmarken im Al-
<HR WIDTH=40%> bum als Tabelle auf (siehe Abbildung 1 und Listing 1).
<CENTER> Die Ausgabe des gescannten Bildes übernimmt die Datei zei-
<A HREF=“[Link]“>LISTE DER BRIEFMARKEN</A> | [Link] (siehe Listing 2). Ihr wird als Parameter die Objekt-ID
<A HREF=“[Link]“>NEUE BRIEFMARKE</A> des BLOBs übergeben, welches aus der Datenbank gelesen und
</CENTER> direkt an den Browser geschickt wird.
<HR WIDTH=40%>
Das Einfügen neuer Marken erfolgt durch das recht einfa-
<?php
che HTML-Formular in [Link] (siehe Listing 3) und
$conn = @pg_Connect(„user=$dbuser dbname=$dbname“);
if (!$conn) {
das PHP-Skript in [Link] (siehe Abbildung 2 und Lis-
echo „Es ist ein Fehler aufgetreten: <B>\“„.pg_errormessage($conn).“\“</B>\n“; ting 4).
exit; Gelöscht werden kann eine Briefmarke über den Verweis Lö-
} schen in der Liste der Briefmarken. Hinter dem Verweis verbirgt
sich das Skript [Link], dem die eindeutige Kennung einer
$result = pg_exec($conn, „select bild from briefmarken where id=$id“); Briefmarke übergeben wird (siehe Listing 5). Der eigentliche
if (!$result) { Löschvorgang besteht aus dem Löschen des BLOBs und des Da-
echo „Es ist ein Fehler aufgetreten: <B>\“„.pg_errormessage($conn).“\“</B>\n“; tensatzes. Beides wird in einer Transaktion ausgeführt, sodass
pg_close($conn); ein Fehler bei einer der beiden Operationen keinen inkonsisten-
exit;
ten Zustand der Datenbank hinterlässt.
}
Das Beispiel enthält nur eine rudimentäre Fehlerbehandlung.
$num = pg_NumRows($result);
if($num == 1) {
Insbesondere wird nicht überprüft, ob die Eingabewerte sinnvoll
@pg_exec($conn, „begin“); und vom richtigen Typ sind und das Bild der Briefmarke auch
$oid = pg_result($result, „bild“, 0); wirklich ein Bild ist. Sie werden damit also kaum eine(n) erfah-
if(FALSE == pg_lounlink($conn, $oid)) { rende(n) PHP-Programmierer(in) beeindrucken können, viel-
echo „Es ist ein Fehler aufgetreten: <B>\“„.pg_errormessage($conn).“\“</B>\n“; leicht aber Ihre nächste nächtliche Bekanntschaft.
@pg_exec($conn, „rollback“);
pg_close($conn); Fazit
exit; PostgreSQL ist unter den Open-Source-Datenbanken sicherlich
} eine der Leistungsfähigsten, die in vielen Anwendungsfällen
auch im Vergleich zu den kommerziellen Systemen gut dasteht.
$result = pg_exec($conn, „delete from briefmarken where id=$id“);
Referenzielle Integrität und Transaktionsmanagement sind klare
if (!$result) {
echo „Es ist ein Fehler aufgetreten: <B>\“„.pg_errormessage($conn).“\“</B>\n“;
Pluspunkte für PostgreSQL im Vergleich zu MySQL. Entwickler,
@pg_exec($conn, „rollback“); die bisher nur mit MySQL gearbeitet haben, dürften nur wenige
pg_close($conn); Probleme haben, auf PostgreSQL umzusteigen, da die PHP-
exit; Schnittstelle ähnliche Funktionen aufweist. PostgreSQL unter-
} stützt BLOBs, allerdings in einer Weise, die eine Sicherung des
@pg_exec($conn, „commit“); Datenbestandes erschwert.
}
pg_close($conn);
?>
Datensatz erfolgreich gelöscht. Links [Link]
</BODY>
</HTML> [Link]
Version 7.0, die angegebene Version 4.2 auch schon getan – Ihr System unterstützt Sie sehen in obigem Beispiel, dass der
ist jedoch deutlich stabiler. nun den Zugriff auf eine MSSQL-Daten- Datenbankserver über seine IP-Adresse
Nach erfolgter Konfiguration instal- bank von PHP aus. angesprochen worden ist. Natürlich kön-
lieren Sie die Software wir gehabt über das nen Sie auch den Namen des Servers ver-
Makefile: PHP-Funktionen für MSSQL wenden, doch das DSN-Lookup funktio-
Unter [Link]/manual/en/[Link] niert nicht immer. Sie sollten deswegen
make .php finden Sie eine Übersicht über alle den Servernamen unter /etc/hosts eintra-
make install Funktionen, die PHP zum Zugriff auf eine gen, dann sollte der Verbindungsaufbau
Microsoft SQL Server Datenbank anbie- funktionieren.
Um die Installation abzuschließen, müs- tet. Wir stellen Ihnen im Folgenden die Nach Aufbau einer Verbindung müs-
sen Sie nun noch /usr/local/freetds/lib (oder wichtigsten davon vor. sen Sie angeben, auf welche Datenbank
den entsprechenden Pfad Ihrer FreeTDS-In- Der eigentliche Verbindungsaufbau Sie zugreifen möchten. Dazu dient die
stallation) in die Datei /etc/[Link] einfü- zu einer Datenbank geht mit der Funk- Funktion mssql_select_db, als Parameter
gen und diese Änderungen beim System an- tion mssql_connect vonstatten. Als übergeben Sie den Namen der Daten-
melden: ersten Parameter übergeben Sie den Na- bank:
men des Servers, als nächstes den Benut-
ldconfig zernamen und das Passwort. Die letzten mssql_select_db(„news“);
beiden Parameter sind optional, wenn Sie
Als nächstes muss noch der PHP-Inter- also einen anonymen Zugriff auf die Da- Eine SQL-Anfrage an die Datenbank
preter entsprechend konfiguriert werden. tenbank erlauben, sollten Sie vielleicht schicken Sie mit der Funktion mssql_que-
Ersetzen Sie zunächst in der Datei ext/sy- Ihre Einstellung zur Systemsicherheit ry. Diese Funktion liefert entweder im Er-
base/php_sybase_db.c alle Aufrufe von überdenken, PHP macht das aber nichts folgsfalle ein numerisches Handle zurück,
dbopen durch tdsdbopen. Dann können aus. ansonsten false. Dabei macht es keinen
Sie sich ans Kompilieren machen. Welche Unterschied, welche Art von Abfrage ver-
Schalter Sie genau verwenden, hängt von $conn = mssql_connect(„[Link]“,“guest“,“guest“); wendet wird:
Ihren speziellen Anforderungen ab. Wich-
tig ist auf jeden Fall der Schalter —with- Die Funktion mssql_connect hat als $result1 = mssql_query(„DELETE FROM NEWS WHERE
sybase=/usr/local/freetds, mit dem Sie Rückgabewert ein numerisches Handle für expiredate < getdate()“);
FreeDTS integrieren: die aktuelle Verbindung, dieses wird aber – $result2 = mssql_query(„SELECT * FROM news“);
im Gegensatz zum PHP-Zugriff auf
./configure —with-sybase=/usr/local/freetds \ MySQL-Datenbanken – nicht weiter ver- Bei INSERT-, UPDATE- und DELETE-
—enable-track-vars —enable-memory-limit=yes \ wendet. Wenn Sie die Funktion mssql_con- Abfragen wird der Rückgabeparameter
—enable-debug=no —with-apxs —with-mysql —with-gd nect mit identischen Parametern noch ein- nicht mehr weiter benötigt. Wenn Sie je-
make
mal aufrufen, wird keine neue Verbindung doch eine SELECT-Abfrage ausführen,
make install
geöffnet und die alte Verbindung weiter sind Sie sehr wohl am Rückgabewert
verwendet. Am Ende des PHP-Skripts wer- interessiert, denn Sie möchten ja auf die
Nun müssen Sie gegebenenfalls noch den alle offenen Verbindungen automa- Daten zugreifen, die Ihnen die Abfrage lie-
Ihren Webserver (i.d.R. Apache) für die tisch geschlossen; Sie müssen also die dazu- fert. Die Funktion mssql_fetch_array lie-
PHP-Unterstützung konfigurieren, und gehörige Funktion mssql_close nicht fert ein Array mit allen Spalten der Ergeb-
dann ist der schwierige Teil der Arbeit explizit aufrufen. nisliste zurück, das Sie dann in einer
Das Ergebnis ist das gleiche wie im obi- den erfahrenen Oracle-Anwender sollten INSERT INTO Namen VALUES (1, „M. Schmidt“);
gen Beispiel und steht ebenfalls in $obj. Zu sich dadurch keine Einschränkungen erge- SELECT Global_id_seq.currval as id from dual;
beachten ist allerdings, dass die Schlüssel ben. Listing 1 illustriert dies an einem ein-
des Arrays alle in Großbuchstaben ge- fachen Beispiel.
schrieben werden. Sollen alle Ergebnis-
Datensätze mit einer Funktion erfragt
werden, dann kann dies mit OCIFetch-
Die Sequenz Global_id_seq wird dazu
genutzt, beim Einfügen eines neuen Da-
Listing 2
Statement() erfolgen: tensatzes das Feld name_id mit der ak- $lob = OCINewDescriptor($db, OCI_D_LOB);
tuellen Sequenznummer zu füllen. Führt $stmt = OCIParse($db,“insert into mitarbeiter
$nrows = OCIFetchStatement($stmt, $result); man direkt im Anschluss daran die SE- (id, data, mimetype) values ($id, EMPTY_BLOB(),
LECT-Anweisung auf die Tabelle dual ‘$mimetype’) returning data into :the_blob“);
Die Variable $result enthält nach dem aus, erhält man die gerade vergebene OCIBindByName($stmt, ‘:the_blob’, &$lob, -1,
Aufruf ein zweidimensionales Array, des- Nummer. OCI_B_BLOB);
sen erste Dimension der Feldname und Doch es geht auch anders, wenn man if(OCIExecute($stmt, OCI_DEFAULT)) {
dessen zweite Dimension die Nummer die Möglichkeit von Oracle nutzt, PHP- if($lob->save($blob)){
OCICommit($db);
des Datensatzes ist. Auf das Feld id im Variablen an Platzhalter in SQL-Anwei-
OCIFreeDesc($lob);
dritten Datensatz kann man demgemäß sungen zu binden. Dabei kommt die Tren-
OCIFreeStatement($stmt);
mit $result[‘ID’][2] zugreifen. Zu beach- nung in OCIParse() und OCIExecute()
return TRUE;
ten ist hierbei, dass der Feldname durch- zum tragen. In der folgenden SQL-An- } else {
gängig groß geschrieben werden muss. weisung werden solche Platzhalter ver- OCIFreeDescriptor($lob);
Bei SELECT-Anfragen ist darauf zu ach- wendet und durch ein vorangestelltes „:“ OCIFreeStatement($stmt);
ten, dass alle Felder unterschiedliche Na- gekennzeichnet. Ausgangspunkt ist die return FALSE;
men haben, damit OCIFetchInto() und Tabelle aus Listing 1: }
OCIFetchStatement() eindeutige Schlüs- }
sel im assoziativen Array vergeben kön- INSERT INTO Namen (name) VALUES (:name)
nen. Ist dies nicht der Fall, werden frühe- RETURNING ROWID INTO :rid;
re Felder durch spätere überschrieben.
Natürlich lassen sich mit OCIParse() Über die Funktion OCIBindBy
und OCIExecute() auch alle anderen SQL-
Kommandos absetzen. Bei INSERT, UP-
Name() lassen sich diesen Platzhaltern
PHP-Variablen zuordnen, deren Inhalt bei
Listing 3
$id = 23; /* mögliche ID des Datensatzes */
DATE und DELETE sollte ein abschlie- der Ausführung der Anweisung die Platz- $stmt = OCIParse($db,“select * from mitarbeiter where
ßendes COMMIT oder ROLLBACK halter ersetzt. Von besonderer Bedeutung id=$id“);
nicht vergessen werden. Leider existieren ist dabei der Platzhalter :rid, hinter dem while(OCIFetchInto($stmt, $row, OCI_ASSOC) ) {
so praktische Funktionen wie mysql_in- sich ein abstrakter Datentyp unbestimm- $lob_data = $row[„DATA“]->load();
};
sert_id() nicht; sie lassen sich aber durch ter Länge verbirgt. Eine Variable, die an
Sequenzen und Trigger nachbilden. Für diesen Platzhalter gebunden wird, muss
$name = „Müller“;
OCIExecute($stmt);
OCICommit($db);
[Link]?name=Meier
Listing 1
<HTML><HEAD><TITLE>Gästebuch - Auswertung</TITLE>
Abb. 2: Das Formular im Browser </HEAD><BODY>
<CENTER><H1> Gästebuch - Auswertung</H1></CENTER>
<?
$fehler=“„;
if (!$name):
echo „Text: $kommentar“; if (Bedingung):
$fehler=$fehler . “Fehler: Bitte geben Sie Ihren
?> Befehle;
Namen an!<p>“;
endif;
endif;
</BODY></HTML>
Auch eine zweiseitige Auswahl ist if (!$kommentar):
möglich: $fehler=$fehler . “Fehler: Einen leeren Eintrag
PHP hat automatisch für jeden Feld- akzeptieren wir nicht.<p>“;
endif;
namen aus dem Formular eine gleichna- if (Bedingung):
Befehle; if (!$mail):
mige Variable angelegt und dieser Varia-
else: $fehler=$fehler . “Fehler: Bitte geben Sie Ihre
blen den Feldinhalt zugewiesen. Sie E-Mail Adresse an!<p>“;
Befehle
brauchen sich also nicht um diese Aus- else:
endif;
wertung der Formulare zu kümmern, die if (!strpos($mail, ‘@’)):
Daten stehen zu Ihrer Verfügung. $fehler=$fehler . “Die angegebene Mail-Adresse
Wenn Sie jetzt Ihr Formular erneut Wollen Sie mehr als zwei Fälle unter- kann nicht stimmen<p>“;
ausfüllen und auf „Absenden“ klicken, scheiden, so ist auch folgende Erweite- endif;
dann erstellt Apache die soeben definier- rung vorhanden: endif;
te Antwortseite, die Sie dann in Ihrem
Browser sehen. elseif (Bedingung): if ($fehler):
Befehle; echo “<b>Fehler:</b><p>$fehler“;
Um bei diesem Vorgang nicht alles
else:
mögliche zu speichern, sollte man im
echo “Sie haben folgende Daten eingegeben:<p>“;
Auswert-Programm alle Eingaben auf Bedingungen muss man immer in echo “Name: $name<br>“;
Plausibilität prüfen. Hier im Beispiel soll Klammern setzen. In der Bedingung kön- echo “E-Mail: $mail<p>“;
geprüft werden, ob alle drei Felder ausge- nen folgende Vergleichsoperatoren auf- echo “Text: $kommentar“;
füllt sind und ob die Mail-Adresse ein At- tauchen: endif;
Zeichen @ enthält. ?>
Für bedingte Anweisungen und Fal- • ==Gleich
lunterscheidungen besitzt PHP folgende • != Ungleich </BODY></HTML>
Syntax: • < Kleiner
mysql_setpermission
Die Datenbank MySQL verfügt über ein recht ausgefeiltes Berechtigungssystem, Für das Anlegen einer neuen Datenbank mit Benutzer-Rechten bietet sich der Menü-
das Erst-Nutzern anfangs oft Probleme bereitet. Seine Benutzerverwaltung ist na- punkt 2 an. In dem folgenden Dialog sind Benutzereingaben fett hervorgehoben.
hezu unabhängig von der des Linux-Systems.
Nach der Installation hat nur der Systemverwalter root Zugriff auf die Datenbank, Which database would you like to add: community
ein Passwort ist nicht gesetzt. The new database community will be created
Diese Rechteverwaltung arbeitet mit der Datenbank mysql, die die Installation an-
What username is to be created: wwwrun
legt. Innerhalb dieser Datenbank sind vor allem drei Tabellen wichtig:
Username = wwwrun
• db – die Datenbanken im System Would you like to set a password for wwwrun [y/n]: n
• host – die Rechner mit Rechten We won’t set a password so the user doesn’t have to use it
• user – die Benutzer We now need to know from what host(s) the user will connect.
Keep in mind that % means ‘from any host’ ...
Bitte entnehmen Sie Details dieser Tabellen der mitgelieferten Dokumentation. Für
The host please: localhost
den normalen Betrieb richten Sie die Rechte mit dem Tool mysql_setpermissions
Would you like to add another host [yes/no]: yes
ein:
Okay, give us the host please: %
/usr/bin/mysql_setpermission -u root
Would you like to add another host [yes/no]: no
Zunächst fragt Sie das Programm nach dem Passwort und dann ein zeichenorien- Okay we keep it with this ...
tiertes Menü nach Ihren Wünschen: The following host(s) will be used: localhost,%.
###########################################################
Password for user root to connect to MySQL:
################################################## That was it ... here is an overview of what you gave to me:
## Welcome to the permission setter 1.2 for MySQL. The database name : community
## made by Luuk de Boer The username : wwwrun
################################################## The host(s) : localhost,%
What would you like to do: ###########################################################
1. Set password for a user. Are you pretty sure you would like to implement this [yes/no]: yes
2. Add a database + user privilege for that database. Okay ... let’s go then ..
- user can do all except all admin functions
Everything is inserted and mysql privileges have been reloaded.
3. Add user privilege for an existing database.
- user can do all except all admin functions
4. Add user privilege for an existing database. Als Host sollten Sie immer localhost angeben, da Sie sonst nicht über den Webser-
- user can do all except all admin functions + no create/drop ver zugreifen können. Wollen Sie auch den Zugriff über einzelne Klienten ermög-
5. Add user privilege for an existing database. lichen, eventuell über einen ODBC-Treiber und Access, so müssen Sie alle Rechner
- user can do only selects (no update/delete/insert etc.) angeben, im einfachsten Fall über das Jokerzeichen %. Falls Ihr Server ständig vom
0. exit this program Internet aus erreichbar ist, schafft das Jokerzeichen Sicherheitsrisiken. In diesem
Make your choice [1,2,3,4,5,0]: Fall sollten Sie die Rechner besser konkret angeben.
Groupware Solutions
Teamarbeit
Die hier beschriebenen Applikationen
weisen alle einen beeindruckenden Funk-
tionsumfang auf. Auch nur eine davon
hier komplett zu beschreiben, würde den
Rahmen sprengen. Nachfolgend sind des-
im Netz
halb nur einzelne Aspekte beschrieben –
ein umfassendes Urteil lässt sich daraus
nicht ableiten.
Betrachtet wurden hier nur Groupwa-
re-Systeme, die unter einer Open-Source-
von Albrecht Günther Lizenz veröffentlicht werden. Die bekann-
teste dieser Art ist die General Public
Groupware-Tools in PHP Licence, kurz GPL (siehe hierzu die Web-
seite der GNU Foundation [Link].
org).
Außer Konkurrenz
Viele Open-Source-Applikationen suchen
die Nähe zum Begriff „Groupware“. Legt
man jedoch die oben genannten Kriterien
Aufgrund der mächtigen Funktionen zur Da- Was ist Groupware? zugrunde, dann wird deutlich, dass viele
tenbankanbindung eignet sich PHP hervorra- Auch wenn das Wort „Groupware“ häu- Applikationen diese Anforderungen nur
fig zitiert wird: Es ist nicht leicht, eine ver- zum kleinen Teil erfüllen. So gibt es bei-
gend für dynamische Applikationen, die über bindliche Definition dafür zu finden. Die spielsweise einige gute Kalender im Netz
das Internet bedient [Link] dem Be- zunächst wichtigste Eigenschaft von ([Link]/~cknudsen/webcalendar
reich der Content Management Systeme Groupware besteht darin, Informationen oder [Link]
nimmt auch die Groupware einen breiten und Daten für mehrere Anwender zu or- net), die allerdings weitergehende Funk-
ganisieren, darzustellen und zu verwalten. tionen vermissen lassen. Andere Soft-
Raum in der Anwendungspalette ein. Der große Vorteil einer Groupware unter ware-Programme bieten die gewünschten
PHP ist, dass sie sich auf verschiedene Be- Funktionen, ihnen mangelt es jedoch an
triebssysteme portieren lässt und in Bezug der Gruppenfähigkeit (z.B. Phorecast -
auf die Voraussetzungen beim User an- [Link]
spruchslos ist: Dieser benötigt nichts wei- Schließlich finden sich auch Beispiele
teres, als einen Browser. wie Eridu ([Link]) oder BHC-
Welche Anforderungen sind an eine Intranet ([Link]
Groupware zu stellen? Zu nennen ist hier net), die nach einem durchaus eindrucks-
zunächst eine Verwaltung der Anwender - vollen Start seit geraumer Zeit nichts mehr
möglichst in verschiedenen Hierarchiebe- veröffentlicht haben. Den Autoren scheint
nen. So können beispielsweise Mitarbei- schlichtweg die Puste ausgegangen zu sein.
ter, Vorgesetzte oder Systemadministrato- Andere Systeme bieten eine umfang-
ren jeweils verschiedene Rechte zu reiche Vorschau auf Ihrer Homepage. Die
Ansichten und Aktionen zugeteilt bekom- genannten Features sind jedoch zum größ-
men. Weitergehende Systeme bieten eine ten Teil in der Entwicklung und können
Rechtefreigabe pro Anwendung, Datei, hier nicht berücksichtigt werden. So hat
Termin oder Notiz an, je nachdem auch beispielsweise das Projekt Horde (www.
mit Lese- und/oder Schreibrechten. Eine [Link]) einen ansehnlichen Katalog
Groupware sollte neben einem gruppen- von geplanten Projekten in petto, von de-
basierten Terminkalender auch ein nen allerdings erst eines dem Entwick-
Adressbuch beinhalten und über eine ge- lungsstadium entwachsen ist – hierbei
meinsame Dateiablage sowie ein Informa- handelt es sich um einen komfortablen
tions- oder Planungssystem verfügen. Die- eMail-Client.
ses kann von einfachen To-do-Listen bis Eine weitere Kategorie von Tools
hin zum ausgeklügelten Aufgabensystem brachte den Autor in einen kleinen Gewis-
innerhalb eines Projektmanagements rei- senskonflikt: Dabei handelt es sich um
chen. Projektmanagementsysteme, die zum Teil
Solutions Groupware
werden, erst dann kann man in der Edit-
Maske die zusätzlichen Parameter editie-
ren. Einige der Twig-Module ließen sich
nur auf Gruppenebene bedienen, zum Bei-
spiel die Bookmarkverwaltung. Sehr
komfortabel angelegt ist die Übernahme
von Kontakten aus fremden Adressbü-
chern, hier existieren Importroutinen für
sechs Programme. Es fehlen jedoch die für
die Groupware wichtigen Module wie die
gemeinsame Dateiablage oder ein Projekt-
management. In letzter Zeit ist es etwas
still um die Entwicklung von Twig gewor-
den. Bei den letzten Releases handelt es
sich lediglich um Bugfixes.
Abb. 1: Zentrales Element von Twig ist ein umfangreicher Mail-Client
PHProjekt
Ein Newcomer unter den Groupware-Lö-
sungen ist PHProjekt aus deutschen Lan-
den. Obwohl erst vor einem halben Jahr
veröffentlicht, erfreut es sich reger Auf-
merksamkeit. Die Setup-Routine führt
den Anwender durch sämtliche Stationen
der Installation und verzichtet auf ein ma-
nuelles Editieren von Konfigurationsda-
teien. Das Prinzip der Anwendung, mög-
lichst viele Informationen auf einen Blick
zu bekommen, zeigt sich gleich beim ers-
ten Aufruf: Tagestermine, To-dos, Noti-
zen, Umfragen, aktuelle Projekte und of-
fene Anfragen durch den Request-Tracker
sind auf der Hauptseite aufgelistet. Unter-
halb der Menüleiste kann man seine
„Stempeluhr“ betätigen, um später die
angefallenen Stunden auf der Zeitkarte
einzelnen Projekten zuzuweisen.
Abb. 2: Mit PHProjekt erhält man viele Informationen auf einen Blick Einige Kleinigkeiten stören das sonst
positive Gesamtbild: so ist das Bemer-
kungsfeld des Kalenders etwas klein gera-
gute Gruppenfunktionen beinhalten. Twig bereits ein „alter Hase“: Schon 1998 ten. Eine Verknüpfung zu Kontakten und
Doch das Fehlen anderer Komponenten erschien die erste öffentliche Version von Projekten ist erst in Vorbereitung. Dafür
und die Tatsache, dass die vorgestellten Twig (= The Web Information Gateway), sind die Möglichkeiten, in den Terminka-
Groupware-Lösungen überwiegend ein der als einziger Kandidat auch für einen lendern von Kollegen und anderen Usern
Projektplanungsmodul besitzen, führte Teilbetrieb eine Installation ohne Daten- zu lesen und auch zu schreiben, sehr viel-
zur Einordnung in die Kategorie „außer bank erlaubt. Die Installation gestaltet fältig.
Konkurrenz“. Wer sich hier trotzdem um- sich jedoch recht langwierig: Laut Instal- Leider fehlt ein Modul zur Verwaltung
tun möchte, der sei beispielsweise auf lationsanweisung sind bis zu zehn ver- eingetroffener eMails (lediglich das Senden
Achievo ([Link]) und Double schiedene Konfigurationsdateien zu edi- ist möglich), so dass man hier auf seinen ge-
Choco Latte ([Link] tieren. Zentrales Element von Twig ist ein wohnten Mailreader zurückgreifen wird.
verwiesen. umfangreicher Mail-Client, und neben ei- Die Dateiablage bietet die Möglich-
nem Terminkalender und einem Kontakt- keit, Dokumente nur ausgewählten Usern
Twig Manager können auch Newsgroups gele- zugänglich zu machen und jeweils Bemer-
Gemessen am Alter anderer PHP-Tools sen werden. Etwas umständlich ist die kungen den Dateien hinzuzufügen.
(alle anderen hier vorgestellten Groupwa- Eingabe von wiederkehrenden Terminen: Das ausführliche Hilfesysstem liegt in
re-Versionen sind jünger als ein Jahr), ist Der Einzel-Termin muss zuerst angelegt Deutsch und drei weiteren Sprachen vor.
Groupware Solutions
lich mehr als die anderen Kandidaten.
Auch ein umfangreiches Fehlermanage-
ment ist enthalten.
Etwas irritierend ist die Möglichkeit,
beim Dateiupload den Autor manuell ein-
tragen zu können, anschließend wird
jedoch ein nicht vorhandener Eintrag zu-
rückgewiesen. Eine automatische Über-
nahme des Nutzers wäre hier einfacher ge-
wesen. Die englische Hilfefunktion ist
leider etwas dünn geraten. Eine Java-Ver-
sion der Anwendung ist seit längerer Zeit
in Vorbereitung. Tutos ist das richtige
Werkzeug für Teams, die die Organisation
Ihrer Arbeit über Projekte definieren.
Phpgroupware
Eine große Entwicklergemeinde steht hin-
Abb. 3: Im Projektmanagement ist Tutos anderen Groupware-Lösungen überlegen
ter Phpgroupware: Gleich 46 Entwickler
listet der Eintrag bei Sourceforge auf.
Phpgroupware versteht sich eher als „Ap-
Tutos Zu fast jedem Eintrag in einem Modul plication-Framework“, also als Contai-
Tutos steht für „The Ultimate Team Orga- gibt es einen Link, der zur Beschreibung ner für verschiedene Module einer Group-
nisation Software“. Das Programm rich- des Eintrags führt, so kann man sich ware-Anwendung. Die Zusammenarbeit
tet sich stark am Projektmanagement aus. schnell Zusatzinformationen verschaf- so vieler Entwickler bringt auch einen ver-
So können Notizen und Dokumente nur fen. Etwas gewöhnungsbedürftig ist die mehrten Abstimmungsbedarf mit sich:
über das ihnen zugewiesene Projekt Benutzerführung – so taucht die Linkleis- Zum Zeitpunkt der Artikelerstellung hat
erreicht werden, was eine gesammelte te zuweilen am unteren Rand der Seite der Projektmanager ein „Feature-Freeze“
Übersicht erschwert. Sehr praktisch ist auf, zu der man sich erst hinscrollen muss. verfügt, um vorhandene Bugs auszumer-
die Möglichkeit, gleich mehrere Re- Zu den Einträgen in den meisten Modu- zen.
ssourcen auf einen Termin buchen zu kön- len gelangt man erst mittels einer Such- Als einziger Kandidat verwendet
nen. Auf einen möglichen Konflikt in der maske. Ob Statistiken, Timelines, Ar- Phpgroupware Templates – deshalb kann
Terminplanung oder der Ressourcennut- beitspakete oder Historien: In Sachen das Aussehen der Anwendung je nach
zung wird man jedoch nicht hingewiesen. Projektmanagement bietet Tutos wesent- Gusto variiert werden. Der Terminkalen-
Sprachen 16 8 10 17
Unterstützte Mysql, Postgres, oracle, infor- MySQL, Postgres MySQL, Postgres Mysql, postgres, interbase, oracle, sybase,
mix mssql, dbase
Datenbanken
Hilfesystem de, en, fr, sp en en en
Solutions Groupware
der ist übersichtlich und bietet alle nöti-
gen Features. Allerdings werden bis auf
die Tagesansicht alle Termine in einer Lis-
tenform angeboten, eigene und fremde
Termine werden gemischt aufgeführt.
Der eMail-Reader ist durchdacht struk-
turiert und lässt kaum Wünsche offen.
Wie ebenfalls bei Twig können zusätzlich
zu einzelnen V-Cards Kontaktlisten frem-
der Adressbücher importiert werden. Im
Filemanager lassen sich ASCII-Dateien
direkt editieren. Einige der Module sind
eher für Entwickler gedacht (cvs, headli-
nes) oder bislang nur für das US-Gebiet
anwendbar, wie beispielsweise das Wet-
ter. Die übersichtliche Hilfefunktion ist
leider nur in Englisch verfügbar. Insge-
samt zählt Phpgroupware jedoch zu den
interessantesten Kandidaten und man
darf mit Recht auf die Version 1.0 ge-
spannt sein. Abb. 4: Phpgroupware versteht sich eher als „Application-Framework“
Fazit
Systemadministratoren sollten in Zu- PHProjekt Tutos Phpgroupware Twig
kunft den reflexartigen Griff zu den
allseits bekannten kommerziellen Stan- Terminplaner ja ja ja ja
Mit PHP
ner integrierten Entwicklungsumgebung,
die eine komplexe Basistechnologie zur
Entwicklung von Webapplikationen be-
reitstellt. Mit ihrem Kernprodukt Mag-
uma PHP4 Enterprise Edition zielt die
gut Wetter
Maguma AG genau auf diese Bedürfnisse
ab. Wie die meisten Open Source Projekte
läuft auch PHP besonders stabil. Mit der
am 22. Mai 2000 freigegebenen Version
PHP 4.0 wandelte sich PHP außerdem in
Zahlungsmodul Solutions
wurde, färben wir die Beschriftung des ent-
ben.
Ausgangspunkt ist ein HTML-Formu- if ((strlen($name) > 0) and
Wer mit Perl programmiert, wird sich
lar. In dieses Formular integrieren wir un- (eregi(„^[-a-z]+(\.[-a-z]+)*$“,$name))){ direkt zurechtfinden, da die Verwendung
sere Prüfroutinen. Die Eingaben des Users $ok = 1; von regulären Ausdrücken in PHP an den
werden so lange an dieses Formular über- } POSIX-Standard angelehnt ist. Eine ge-
geben, bis unsere definierten Prüfbedin- else {$cname = „<font color=red>“; nauere Hilfe bietet das PHP Manual im
gungen erfüllt sind. Für die Steuerung un- $ok = 0;} Kapitel LVI (Pattern Syntax). Der Downlo-
seres Formulares deklarieren wir zwei ad des PHP-Manuals ist unter www. php-
globale Variablen. Die Variable $check In dieser Bedingung prüfen wir das [Link]/manual/[Link] möglich.
verhindert, dass der User beim ersten Auf- Feld Name auf eine Zeichenlänge größer 0. Außerdem sind im Internet eine Vielzahl
ruf der Seite mit Fehlermeldungen über- Weiterhin gestatten wir nur die Eingabe an praktischen Beispielen und Hilfen ver-
häuft wird. Die Variable $ok ist unsere von Buchstaben, Bindestrich und Leerzei- fügbar (siehe Links am Ende des Artikels).
„Statusvariable“. Sie wird am Anfang der chen. Wenn alle Bedingungen erfüllt sind, Reguläre Ausdrücke sind ein mächtiges
Prüfroutine auf „1“ gesetzt und erhält den wird die Variable $ok auf 1 gesetzt. Anson- Werkzeug, dessen Grundlagen jeder Ent-
Wert „0“, wenn Eingaben nicht ordnungs- sten wird im Formular die Beschriftung des wickler in Ansätzen kenne sollte. Deshalb
gemäß ausgefüllt sind. Erst wenn die Vari- Formularfeldes rot eingefärbt und der Va- auch an dieser Stelle einige kurzgefasste
able am Ende der Prüfroutine noch auf „1“ riablen $ok der Wert 0 zugewiesen. Anstel- Hilfestellungen. Da reguläre Ausdrücke
steht, werden die übergebenen Daten le des rot eingefärbten Textes können auch ein sehr komplexes Thema sind, erheben
weiterverarbeitet. Die Verwendung von Grafiken oder andere Fehlerausgaben be- wir keinen Anspruch auf Vollständigkeit,
PHP ermöglicht es uns, dass sich das For- nutzt werden. da dies den Rahmen unseres Artikels
sprengen würde.
Reguläre Ausdrücke Folgende PHP-Funktionen unterstüt-
Quellcode Die Verwendung der Funktion eregi er-
spart uns die Unterscheidung zwischen
zen die Verwendung regulärer Ausdrücke:
Der Quellcode zum Groß-und Kleinschreibung. Im Formular- •preg_match (sucht einen regulären Aus-
Artikel befindet sich auf feld Name sind alle Buchstaben sowie der druck)
der beiliegenden CD. Bindestrich und der Punkt erlaubt. Sobald •preg_replace (sucht und ersetzt einen re-
ein anderes oder kein Zeichen gefunden gulären Ausdruck)
Solutions Zahlungsmodul
•preg_split (zerteilt einen String anhand ei- ren() (Siehe Listing auf der CD). Diese bank über Port 3306 anzusprechen und per
nes regulären Ausdrucks) Funktion erweitert unser Zahlungsmodul SELECT-Abfrage auszulesen. Nachdem
•preg_grep (liefert ein Array zurück auf um die Möglichkeit der Prüfung von Kre- wir nun eine gültige Verbindungs-ID erhal-
das der reguläre Ausdruck zutrifft) ditkartennummern. Weiterhin prüfen wir ten haben, speichern wir die Daten. Der
•ereg (sucht Übereinstimmung) mit der Funktion check_datum, ob das Einfachheit halber nutzen wir die Autoin-
•ereg_replace (ersetzt einen regulären Aus- Gültigkeitsdatum der Karte im zulässigen crement- Funktion der Datenbank. Der ge-
druck) Bereich liegt. Für kleinere Unternehmen nerierte Wert wird automatisch als Vor-
•split (zerlegt eine Zeichenkette anhand ei- bietet sich hier eine, wenn auch nicht hun- gangsnummer verwendet. Die Funktion
nes regulären Ausdrucks in ein Array) dertprozentig sichere Möglichkeit, Fakes mysql_query liefert im Erfolgsfall TRUE
mit Kreditkarten zu verhindern. Die Funk- zurück. Somit erhalten wir die gewünschte
Alle Funktionen, die mit preg anfangen, tionen erwarten als Parameter die Kredit- Vollzugsmeldung. Nun kommen wir zum
lehnen sich an die Perl-kompatiblen regulä- kartennummer, das Kreditkarteninstitut letzten Schritt, der Erstellung der Bestäti-
ren Ausdrücke an. Zu beachten ist, dass und das Gültigkeitsdatum der Kreditkarte. gungsmail.
diese mit Slashes ( /regulärer Ausdruck/ ) Anhand des Kreditinstituts validieren wir
begrenzt werden müssen. Nun einige Bei- die ersten Stellen der Kreditkartennummer, Bestätigungsmail generieren
spiele zur Verwendung regulärer Aus- um das Berechnungsverfahren ordnungs- Hier greifen wir auf die von PHP zur Verfü-
drücke. Mit dem Zeichen „^“ kennzeich- gemäß anwenden zu können. Die Prüfung gung gestellte Mail-Funktion zurück:
net man einen Wortbeginn. Das Wortende der Kreditkartennummer nutzt das bei
lässt sich durch das Zeichen „$“ festlegen. Kreditkarten verwendete Modulo 10 Ver- Mail($empfänger, $betreff, $nachricht,
preg_match /^[a-z]/ würde wahr zurücklie- fahren. Das heißt, dass die − nach einer be- „From: webmaster@$SERVER_NAME\nReply-To:
fern, wenn der Wert mit einem Kleinbuch- stimmten Berechnungsformel − ermittelte webmaster@$SERVER_NAME“);
staben beginnen würde. Falls eine Zahl Quersumme ohne Rest durch 10 teilbar
oder ein Sonderzeichen am Anfang stehen, sein muss. Das Datum lässt sich durch ei- Beim Aufruf der Mail-Funktion müs-
wäre die Bedingung nicht erfüllt. nen definierten Bereich von maximal 24 sen drei Parameter (Empfänger, Betreff,
Preg_Match würde demzufolge unwahr Monaten prüfen. Die Funktion bedient Nachricht) übergeben werden. Der vierte
zurückgeben. Mittels eines Bindestriches sich des aktuellen Systemdatums (mittels Parameter ist optional, aber sehr nützlich.
können Wertebereiche festgelegt werden. strftime) und prüft dieses gegen das angege- Hier können zusätzliche Angaben wie
Ein Ausdruck, der zum Beispiel auf die Ein- bene Gültigkeitsdatum. Ist das angegebene Standardantwortadresse oder Kopieem-
gabe von hexadezimalen Zahlen prüft, Datum kleiner als das aktuelle Datum oder fänger deklariert werden.
würde wie folgt aussehen: [a-f0-9]. Es dürf- größer als das aktuelle Datum plus 24 Mo- Der Nutzer erhält eine Bestätigung des
ten nur die Zahlen von 0 bis 9 und die Zei- nate, liefert die Funktion falsch zurück. Vorgangs, in der seine persönlichen Daten
chen a bis f auftreten, damit die Prüfung Sollte alles zu unserer Zufriedenheit ausge- enthalten sind. Die Zahlungsweise lassen
wahr zurückgibt. füllt sein, steht die Variable $ok auf 1, wie es wir außer acht, da eMails im Klartext über
Der folgende Ausdruck prüft auf Zif- am Anfang der Prüfroutine eingestellt wur- das Internet übertragen werden und somit
fern und Ziffernfolgen: ^[1-9][0-9]*$. Das de, und es wird eine Quittungsseite ausge- keinen Schutz bieten. Falls das Zahlungs-
erste Zeichen darf nicht 0 sein. Hier kom- geben, auf der der Nutzer alle seine Einga- modul in einem Warenshop Verwendung
men die oben genannten Wortanfangs- und ben noch einmal prüfen kann. Bestätigt der findet, könnte man ebenfalls die bestellten
-endezeichen zur Verwendung. Nachfol- User seine Eingaben, werden die übergebe- Positionen in der Mail bestätigen.
gende Symbole stehen für genau fünf belie- nen Werte in die Datenbank geschrieben.
bige Zeichen: ^.{5}$. Ein weiteres Beispiel Sollte die Datenbankabfrage erfolgreich Auswertung der Bestellungen
wäre ab*. Hier passen Zeichenketten, die ausgeführt werden, informieren wir den Der Betreiber des Systems kann nun auf die
ein a und eine beliebige Anzahl von b ent- Nutzer auf einer Antwortseite. Für die Da- in der Datenbank abgelegten Werte mit ei-
halten, also a, ab, abb, abbbbbbbb usw. tenbankoperation stellen wir mittels nem Administrationstool zugreifen. Über
mysql_connect eine gültige Verbindung zur dieses kann, je nach Bedarf, ein Arbeitsab-
...zurück zu unserem Formular Datenbank her. Auch hier eine Warnung: lauf erstellt werden, mit dem eine komfor-
Unser Formular ruft sich selbst auf, solange Sollte, aus welchen Gründen auch immer, table Bearbeitung der eingegangenen Be-
die Variable $ok am Ende der Prüfung den der Apache Webserver oder genauer gesagt stellung möglich wird. Hier sollte auf eine
Wert 1 besitzt. Wir bieten dem Nutzer die das PHP-Modul desselben ausfallen, wird geschützte Verbindung (Stichwort SSL)
Möglichkeit, aus verschiedenen Zahlungs- der PHP Quellcode ungeparst ausgegeben. zum Webserver geachtet werden.
wegen (Bankeinzug, Kreditkarte, Rech- Es empfiehlt sich daher, die Benutzerdaten Der Autor ist Geschäftsführer der sub-
nung) auszuwählen. Je nach Wahl des Nut- für den Datenbankconnect außerhalb des sist GmbH, Dresden, einem Anbieter von
zers erwarten wir dementsprechend für den Webserver erreichbaren Pfades eBusiness- und Intranetlösungen, mit
Eingaben in den relevanten Feldern. Unser (standardmäßig alles unter .../htdocs) ab- Schwerpunkt Datenbankentwicklung.
Script enthält als Besonderheit die einge- zulegen. Ansonsten ist es ein Leichtes, mit Jens Gräfe ist unter jensg@[Link] er-
bundene Funktion kreditkarten_validie- den Benutzerinformationen die Daten- reichbar.