Inhaltsverzeichnis INHALTSVERZEICHNIS 2

Werbung
Seminar Datenbanken & WWW
SS 2001
Datenbankenanbindung: CGI & PHP
Universität Zürich
Institut für Informatik
Fachgebiet Datenbankentechnik
Prof. K. R. Dittrich
Autor: Marcel Schleinkofer
Betreuerin: Daniela Damm
Inhaltsverzeichnis
Seite 2 von 13
Inhaltsverzeichnis
INHALTSVERZEICHNIS
2
ZUSAMMENFASSUNG
3
1
EINLEITUNG
3
2
KONZEPTE VON DATENBANK-ANBINDUNGEN
4
2.1
2.2
2.3
3
DIE CGI- SCHNITTSTELLE
3.1
3.2
3.3
3.4
4
SCHICHTEN-ARCHITEKTUR
EINGEBETTETE SKRIPTSPRACHE ODER EIGENSTÄNDIGE PROGRAMME?
EIN RECHNER-PROZESS PRO ANFRAGE?
CGI- DAS KONZEPT
DATENBANKANBINDUNGEN MIT CGI
PERSISTENTE DATENBANKVERBINDUNG
CGI-AUFRUFE UND ÜBERGABE VON PARAMETERN AUS HTML
DATENBANK-ANBINDUNGEN MIT PHP
4.1
4.2
4.3
4.4
ENTWICKLUNG VON PHP
EIGENSCHAFTEN UND EINSATZ VON PHP
DATENBANKANBINDUNGEN MIT PHP
PERSISTENTE DATENBANK-VERBINDUNGEN
4
5
6
6
6
7
7
8
9
9
9
9
11
5
VERGLEICH
11
6
FAZIT
12
7
QUELLVERZEICHNIS
13
Seminar Datenbanken, SS 2001
Datenbankenanbindung mit CGI & PHP
Zusammenfassung
Seite 3 von 13
Zusammenfassung
Die vorliegende Arbeit befasst sich mit der Frage, wie Datenbankanbindungen an das World Wide Web realisiert
werden können. Dabei wird der Schwerpunkt insbesondere auf zwei der möglichen Techniken gelegt: CGI und
PHP.
Die Arbeit zeigt nach einer Einleitung ins Thema im zweiten Kapitel auf, welche Konzepte zur Anwendung
gelangen, wenn eine Web-Applikation Zugriff auf eine Datenbank erhalten soll. Zuerst gilt es die Architektur der
Applikation zu bestimmen. Die drei Funktionsbereiche Datenhaltung, Applikationslogik und BenutzerSchnittstelle können auf verschiedenen Ebene verteilt werden. Entscheidend ist jedoch auch, welche Art von
Programmiersprache man verwenden will.
Im dritten und vierten Kapitel werden die konkreten Ansätze von CGI’s und PHP näher beleuchtet um sie im
fünften Kapitel miteinander zu vergleichen. Während CGI eine Schnittstelle für die Übergabe von Parametern an
Programme in irgendeiner Programmiersprache darstellt, ist PHP ein Skriptsprache, welche in normale HTMLDokumente eingebettet wird. Im Gegensatz zu z.B. Java Script wird dieser Code jedoch serverseitig ausgeführt.
Dies ermöglicht ebenso, wie bei CGI-Programmen, die Anbindung von Datenbanken.
Ein direkter Vergleich der beiden Ansätze fällt nicht einfach, zumal PHP teilweise als CGI-Interpreter implementiert ist. Andererseits sind beide Konzepte mittlerweile ziemlich ausgereift, so dass anfängliche Schwächen durch
neuere Lösungen aufgefangen wurden.
1 Einleitung
Das World Wide Web ist in den letzten Jahren explosionsartig gewachsen. Dies sowohl in quantitativer, wie auch
qualitativer Hinsicht. Einfache, statische Seiten, welche mit der Seitensprache HTML gestaltet werden, genügen
den Ansprüchen der Surfergemeinde und auch der Geschäftswelt längst nicht mehr. Abhilfe schaffen mittlerweile
dynamisch generierte Seiten, welche an den aktuellen Benutzer angepasst werden können. Dynamische Seiten
werden bei jedem Aufruf in Abhängigkeit von verschiedenen Parametern, wie z.B. dem Usernamen oder einem
Stichwort, generiert. Sie bieten damit ganz andere und mächtigere Möglichkeiten an: Bekannte Funktionalitäten
wie Zugriffszähler, News-Verwaltungen, Shops oder ganze Web-Applikationen können verwirklicht werden.
Hinter komplexeren Anwendungen stecken oft eine Menge von Daten, welche in einer Datenbank gespeichert
werden. Dazu ist eine sogenannte Datenbankanbindung nötig, welche es ermöglicht, die Resultate von Datenbankanfragen auf eine Web-Seite zu bringen.
Ebenso wie es mittlerweile verschiedenste Technologien für die Erstellung von dynamischen Seiten gibt, lassen
sich ganz unterschiedliche Ansätze für die Nutzung einer Datenbank über das Web aufzählen. In dieser Arbeit
sollen zwei Ansätze vorgestellt werden: Datenbankanbindungen mit CGI oder PHP. Dabei werden in einem ersten Teil die Grundkonzepte für Datenbankenanbindungen an HTML-Seiten vorgestellt. In den weiteren Kapiteln
sollen die jeweiligen Ansätze von CGI und PHP erläutert werden. Dabei wird nicht vorausgesetzt, dass der Leser
CGI und PHP kennt, wohl aber dass HTML und die Grundfunktionsweise eines World Wide Web nicht gänzlich
unbekannt ist.
Schliesslich seien, am Ende dieser Einleitung in das zu behandelnde Thema, noch zwei, drei Worte zum Autor
und zur Arbeit erwähnt. Die vorliegende Arbeit wurde im Rahmen des Seminars Datenbanken im Sommersemester 2001 verfasst. Der Autor studiert im 6. Semester Wirtschaftsinformatik an der Universität Zürich und hat sich
im Laufe dieser Arbeit erstmals mit den beiden Konzepten zur Datenbankanbindung befasst.
Hegnau, Juni 2001
Seminar Datenbanken, SS 2001
Marcel Schleinkofer
Datenbankenanbindung mit CGI & PHP
Konzepte von Datenbank-Anbindungen
Seite 4 von 13
2 Konzepte von Datenbank-Anbindungen
Wie kann eine Web-Seite auf eine Datenbank zugreifen? Um diese Frage zu beantworten, sollen hier einige
grundsätzliche Überlegungen angestellt werden. Dies vorerst unabhängig von den konkreten Lösungen, welche
CGI und PHP anbieten.
Das Erstellen einer Applikation, welche aus dem World Wide Web auf eine Datenbank zugreifen kann, erfordert
Überlegungen in dreierlei Hinsicht, die sich auf die Architektur der Lösung auswirken. Die drei Aspekte sind in
den folgenden Fragestellungen formuliert und sollen anschliessend erläutert werden:
Welche Schichten-Architektur soll zur Anwendung gelangen?
Soll eine eingebettete Skriptsprache verwendet werden?
Soll jede Datenbank-Anfrage in einem eigenen Rechner-Prozess stattfinden?
Diese drei Aspekte tangieren einander sehr stark und sollen hier nur der Übersichtlichkeit halber nacheinander
behandelt werden.
2.1 Schichten-Architektur
Verteilte Anwendungen mit Zugriff auf eine Datenbank, lassen sich in drei funktionale Bereiche aufteilen:
Dies sind einmal die Daten, welche im Datenbank-Server gehalten werden.
Auf diese muss vom Benutzer über eine Benutzer-Schnittstelle zugegriffen werden können. Heute ist dies
meistens eine grafische Oberfläche.
Für die Abfrage und deren Handling ist dazwischen die Applikationslogik zuständig.
Diese drei funktionalen Bereiche lassen sich nun mehr oder weniger genau auftrennen. Die Abbildung 1 gibt
einen Überblick über die Architekturen mit jeweils unterschiedlicher Verteilung der drei funktionalen Bereiche.
2-Tier-Architektur
n-Tier-Architektur
User Interface
User Interface
Tier 4
Tier 3
Client
Web-Server
Client
Web(http)-Server
Applikationslogik
DatenbankServer
Web-Server
Web(http)-Server
ApplicationServer
Applikationslogik
Tier 1
Tier 1
Tier 1
Tier 2
Tier 2
Client
Tier 3
Tier 2
User Interface
Applikationslogik
3-Tier-Architektur
DatenbankServer
DatenbankServer
Abb. (1) Schichten-Architekturen im Überblick
In einer Zweischichten-Architektur (2-Tier Architektur) sind die Bereiche Benutzerschnittstelle und Applikationslogik nicht getrennt, sondern alles ist in einer Schicht vereint. Diese Architektur ist für Web-Applikation, wo
der Client einem Internet-Browser entspricht, nicht geeignet. Zwar liesse sich über Java-Applets eine direkte
Verbindung zu einem Datenbank-Server herstellen. Voraussetzung dafür ist jedoch eine sehr gelockerte Sicherheitskonfiguration für das Applet. Dies ist neben weiteren Nachteilen dieser Architektur, der wichtigste Hinderungsgrund für die Umsetzung. Zweischichten-Architekturen werden deshalb hier auch nicht weiter behandelt.
Seminar Datenbanken, SS 2001
Datenbankenanbindung mit CGI & PHP
Konzepte von Datenbank-Anbindungen
Seite 5 von 13
HTML-Seiten werden vom Browser, der als Client funktioniert, bei einem Web-Server angefordert. In einer
Dreischichten-Architektur (3-Tier-Architektur) übernimmt der Web-Server, d.h. eigentlich zusätzliche Funktionalitäten des Web-Servers, die Applikationslogik, welche die Kommunikation mit dem Datenbank-Server übernimmt.
Heute werden die drei Schichten allerdings immer häufiger durch mindestens eine weitere Schicht ergänzt, weshalb man von n-Tier-Applikationen spricht. Der Grund dafür liegt darin, dass einem Applikationsserver die gesamte Applikationslogik übergeben werden kann. Diese kann sehr umfassend sein und viel weiter gehen, als nur
eine Datenbank-Abfrage realisieren. Der Applikationsserver kann z.B. die User-Verwaltung oder das LoadBalancing übernehmen.
Die Trennung zwischen 3-Tier und n-Tier-Architekturen ist nicht immer ganz scharf, da es dieselben Mittel sind,
mit denen in beiden Architekturen die Applikationslogik realisiert wird. Als Unterscheidungskriterium gilt jedoch, inwieweit die Applikationslogik tatsächlich vom Web-Server getrennt ist. Wenn der Applikationsserver
physisch auf einer anderen Maschine läuft, ist dies darum als n-Tier Architektur einzustufen.
2.2 Eingebettete Skriptsprache oder eigenständige Programme?
In einer Drei- oder Mehrschichten-Architektur ist es möglich, die Applikationslogik, welche die Kommunikation
mit dem Datenbank-Server erledigt, in zwei Kategorien aufzuteilen:
2.2.1
Eingebettete Skriptsprachen
Zur ersten Kategorie zählen sogenannte Skriptsprachen, welche innerhalb eines HTML-Dokumentes eingebettet
werden. Dieser Code wird serverseitig ausgeführt. Der Web-Browser fordert also beim Web-Server eine spezielle
Datei an. Diese Datei kann sowohl HTML-Tags enthalten, als auch Programmcode in einer Skriptsprache. Diese
Teile werden von den HTML-Tags durch verschiedene öffnende und schliessende Tags abgetrennt (z.B. <? ....
?>, <% .... %>). Dateien mit eingebetteten Skripten werden dem Web-Server ebenfalls durch die Verwendung
von speziellen Dateiendungen, wie ASP, JSP, PHP, usw. kenntlich gemacht. Der Server sorgt dafür, dass die
Skripte durch einen Interpreter ausgeführt werden. Das Skript erfüllt irgendeine Aufgabe und generiert HTMLCode, welcher anstelle des Codes in die HTML-Datei eingebettet wird. Im Falle einer Datenbankanwendung
findet hier eine Datenbankabfrage statt. Der Browser erhält in der Folge ein reines HTML-Dokument zurückgesandt. Skriptsprachen werden wie schon angedeutet, bei jeder Ausführung interpretiert. Beispiele für eingebettete
Skriptsprachen sind: Java Server Pages, Active Server Pages oder PHP.
Vorteilhaft bei der Entwicklung von Web-Applikation mit Hilfe von eingebetteten Skriptsprachen ist, dass sie
nicht bei jeder Änderung neu kompiliert werden müssen. Dies zieht jedoch gleichzeitig einen PerformanceVerlust mit sich, da das Programm zur Laufzeit interpretiert wird.
2.2.2
Eigenständige Programme
Die zweite Kategorie sind Programme, welche vom Webserver gestartet werden und in der Regel irgendwelche
Aufgaben ausführen und entsprechend den Resultaten eine HTML-Seite generieren. Sie werden hier eigenständige Programme genannt, weil sie im Gegensatz zu eingebetteten Skriptsprachen unabhängig ausgeführt werden
können. Diese Programme können in kompilierter Form vorliegen oder sie werden von einem Interpreter, resp.
einer Virtual Machine im Falle von Servlets ausgeführt. Der Server erkennt sie durch die Kennzeichnung mit
einer speziellen Dateiendung (z.B. pl für Perl-Programme), sowie der Angabe eines speziellen Verzeichnisses auf
dem Server (bspw. CGI-bin). CGI-Programme, Servererweiterung oder Servlets sind Beispiele für solche
Programme.
CGI’s werden später noch eingehender behandelt. Hier sei deshalb erst erwähnt, dass es sich dabei um keine
Programmiersprache handelt, sondern um eine Schnittstelle, welche es dem Web-Server erlaubt, mit Programmen zu kommunizieren [Gund96, S.1]. Der Browser sendet nun z.B. ein ausgefülltes Formular an den Server.
Mit Hilfe des CGI kann dieser die vom Benutzer in Form des Formulars übergebenen Parameter in einer definierten Weise an ein Programm weitergegeben. Oft wird solch ein Programm als CGI-Programm bezeichnet.
Diese Bezeichnung könnte zur irrtümlichen Annahme verleiten, dass CGI eine Programmiersprache sei. Wie
schon erwähnt, ist dem aber nicht so.
2.2.3 2-Tier oder n-Tier-Architektur?
Bei in HTML eingebetteten Skriptsprachen ist es möglich, dass der Web-Server selbst ein Modul eingebaut hat,
das die Ausführung dieses Skriptes übernimmt. In diesem Fall würde es sich um eine 3-Tier-Architektur handeln.
Der Web-Server kann solche Skripts jedoch auch an einen Application-Server weiterreichen, welcher es seinerseits durch einen Interpreter ausführen lässt. So gesehen handelt es sich dann um eine n-Tier-Architektur.
Seminar Datenbanken, SS 2001
Datenbankenanbindung mit CGI & PHP
Die CGI- Schnittstelle
Seite 6 von 13
Unscharf ist die Unterscheidung auch bei eigenständigen Programmen. Eine mögliche Meinung ist die, dass z.B.
ein CGI-Programm als kleinster Teil eines Application-Servers anzusehen ist. Demnach würde es sich um eine nTier-Architektur handeln [NeTh01, Folie 23].
2.3 Ein Rechner-Prozess pro Anfrage?
Der Erfolg von Web-Datenbank-Applikationen wie Online-Shops ist häufig davon abhängig, welche Anzahl von
gleichzeitigen Benutzern bewältigt werden kann. Da die Applikationslogik in einer solchen Anwendung aus
einem Programm besteht das für jede Datenbankoperation aktiv werden muss, ist es entscheidend, dass dies
ressourcenschonend vonstatten geht. Deshalb ist es wichtig zu wissen, ob für jeden Aufruf dieses Programms ein
eigener Rechner-Prozess gestartet werden muss. Alle Aufrufe in einem Server-Prozess abzuwickeln, ist dagegen
schneller und speichersparender.
Die Tatsache, dass bei jedem Aufruf eines CGI-Programms ein separater Prozess gestartet werden muss, kostet
Ressourcen und damit auch Performance. Für stark performante Anwendungen ist dies ein Nachteil, der dazu
geführt hat, dass die Entwickler von Web-Servern nach anderen Wegen gesucht haben [Loes, S.7]. Sogenannte
Server-Erweiterungen umgehen nun den Prozessaufruf für jeden Start eines Programmes, indem sie ein proprietäres API (Application Programming Interface) zur Verfügung stellen. Damit kann auf eine Programmbibliothek
des Servers zugegriffen werden, welche allerdings beim Start des Servers geladen werden muss. In Bezug auf
Datenbankanbindungen haben diese Server-Erweiterungen den Vorteil, dass sie einmal geöffnete Datenbankverbindungen weiterverwenden können (z.B. in einem Pool von zur Verfügung stehenden Verbindungen) [Loes,
S.7]. Dies stellt einen weiteren Performance-Vorteil gegenüber klassischen CGI-Programmen dar. Anderseits
kann ein Absturz bei einem Aufruf einer Server-Erweiterung den gesamten Server in Mitleidenschaft ziehen, was
bei CGI’s durch die Verwendung von unterschiedlichen Prozessen nicht der Fall ist. Ähnlich den ServerErweiterungen funktioniert Fast-CGI. Bei dieser Weiterentwicklung von CGI wird ein Server-externer Prozess
gestartet, welcher danach allen CGI-Programmen zur Verfügung steht [roxen01].
3 Die CGI- Schnittstelle
Nachdem nun aufgezeigt wurde, welche prinzipiellen Ansätze verfolgt werden können, um eine Datenbankanbindung zu verwirklichen, soll in diesem Kapitel näher auf CGI eingegangen werden.
3.1 CGI- das Konzept
Das Common Gateway Interface (CGI) stellte die erste Möglichkeit dar, dynamische generierte HTML-Seiten
im World Wide Web zu publizieren [Gund96, Vorwort]. Einem Webbrowser wird es damit ermöglicht, über einen
Webserver Programme ausführen zu lassen, welche z.B. Daten aus Formularen verarbeiten, Daten speichern oder
aus einer Datenbank auslesen. Das auszuführende Programm liest über eine definierte Schnittstelle, eben das
CGI, die Eingabedaten, verarbeitet diese und generiert dann meistens eine HTML-Seite, welche dem Web-Server
zurückgeliefert wird. Dieser sendet die damit generierte Seite seinerseits an den Browser des Benutzers zurück.
Allerdings ist es grundsätzlich auch möglich, andere Formate wie PDF, Postscript, reine Grafikformate u.a. zu
generieren [Gross01]. Im Prinzip ist es ein einfaches Modell, das dem CGI zu Grunde liegt. Abbildung 2 zeigt
dieses Modell auf.
1
Aufruf des CGI2 Programmes
Request, z.B.
Formular
Web-Server
Browser (Client)
3
CGI-Programm
Antwort des CGIProgramms in Form von
z.B. HTML
Abb. (2) Modell eines CGI-Programmaufrufes nach [Gund96, S.2]
Wie bereits angedeutet, beschreibt CGI dabei lediglich die Art der Übergabe von Eingabe-Parametern. Aus diesem Grunde können CGI-Programme in einer beliebigen Sprache geschrieben sein. Die einzige Voraussetzung,
Seminar Datenbanken, SS 2001
Datenbankenanbindung mit CGI & PHP
Die CGI- Schnittstelle
Seite 7 von 13
welche die Sprache erfüllen muss, besteht darin, dass sie die CGI-Schnittstelle ansprechen kann [Gross01, S.4].
Etabliert hat sich als CGI-Sprache jedoch insbesondere Perl. Der Grund dafür liegt in den von Perl zur Verfügung gestellten mächtigen Funktionen für Zeichenoperationen oder das Lesen und Schreiben von Daten.
3.2 Datenbankanbindungen mit CGI
Aus dem oben veranschaulichten Modell von CGI-Programmen geht auch hervor, wie mit CGI-Programmen ein
Datenbankanbindung zu bewerkstelligen ist. In diesem Falle nimmt das CGI-Programm die Funktion eines Gateways ein. Da aus einer HTML-Seite nicht direkt mit einer Datenbank kommuniziert werden kann, muss die
HTML-Seite eine Anforderung an ein CGI-Programm senden, welches seinerseits die Anfrage z.B. in Form einer
SQL-Anweisung an die Datenbank sendet und die vom DB-Server zurückgesendete Resultatmenge auswertet
und daraus ein HTML-Dokument generiert. Diesen Sachverhalt zeigt Abbildung 3 auf.
„weitergereicht“
von Web-Server
z.B. Formular
Senden
Konvertieren nach
SQL
Empfangen
SQL-Anfrage
Verarbeiten
Formatierte Ergebnisse
Browser
HTMLDatei
Konvertieren nach
HTML
Ergebnisse
Antworten
Datenbank
CGI-Programm
Abb. (3) Interaktion Browser- Datenbank via CGI-Programm. Nach [Gund96, S.247]
Schematisch ist nun aufgezeigt, wie eine Datenbank-Verbindung mit CGI-Programmen vonstatten geht. Im konkreten Fall ist es natürlich, wie so oft in der Informatik, auch hier so, dass jeder Datenbankenhersteller ein eigenes API zur Ansteuerung der Datenbank zur Verfügung stellt. Dies ist aufwendig und nicht sehr komfortabel.
Aufgrund dieser Tatsache wurde für die Programmiersprache Perl das sogenannte DBI (DataBase Interface)
entwickelt, welches ein Modul zur Herstellerunabhängigen Datenbankanbindung darstellt. Die Architektur dieser
Lösung sieht wie folgt aus: Das DBI abstrahiert die proprietären Hersteller-API’s und
bietet die Möglichkeit SQL-Anfragen abzusetzen und die Resultatmenge verarbeiten zu
können. Das DBI kommuniziert dabei nicht
direkt mit der Datenbank, es verwendet dazu
immer einen entsprechenden Database Driver
(DBD). Diese DBD’s stellen Driver für die
entsprechenden Datenbanken dar [Arkadia].
Abbildung 4 veranschaulicht diese Architektur.
Abb. (4) Database Interface (DBI) und Database Driver (DBD), Quelle [Arkadia]
3.3 Persistente Datenbankverbindung
In Kapitel 2 wurde festgestellt, dass CGI-Programme einen eigenen Prozess beanspruchen. Historisch gesehen
stimmt dies auch. Das Starten des Perl-Interpreters als externes Programm und der Aufbau der DatenbankVerbindung sind „teure“ Operationen, die bei jedem HTTP-Request erneut ausgeführt werden. Dieser Nachteil
der CGI-Schnittstelle kann mittlerweile z.B. mit dem Einsatz des Web-Servers Apache, sowie den Modulen
„ModPerl“ und „Apache::DBI“ eliminiert werden. ModPerl ist ein Built-In Perl Interpreter und Apache::DBI ist
das Apache-Modul von DBI. Mit ModPerl entfällt der Aufruf des externen Perl-Interpreters. Der Perl-Interpreter
läuft damit in einem Prozess des Web-Servers und es ist somit unnötig bei jedem Aufruf eines Perl-Programmes
einen neuen Prozess zu starten.
Seminar Datenbanken, SS 2001
Datenbankenanbindung mit CGI & PHP
Die CGI- Schnittstelle
Seite 8 von 13
Ausser dem Geschwindigkeitsvorteil eröffnet sich mit diesem Ansatz für den Programmierer eine weitere ressourcenschonende Möglichkeit: Sogenannte persistente Datenbank Verbindungen können erstellt werden. Was ist
damit gemeint? Nun, wird in einem Programm eine Datenbank-Abfrage durchgeführt, muss zuerst eine Datenbank-Verbindung eröffnet werden. Ist das Programm beendet, wird die Verbindung wieder geschlossen. Von
einer persistenten Verbindung spricht man, wenn zum Einen beim Öffnen der Verbindung versucht wird, eine
vom gleichen Benutzer bereits einmal benutzte Verbindung wiederzuverwenden. Zum Anderen wird die Verbindung nach Beendigung des Programmes nicht geschlossen. Sie bleibt eine gewisse Zeit bestehen für einen zukünftigen Zugriff des gleichen Benutzers. Gerade bei häufiger Interaktion ist dieses Verfahren natürlich sehr
ressourcenschonend [Akad01].
3.4 CGI-Aufrufe und Übergabe von Parametern aus HTML
Es stellt sich nun die Frage, wie ein CGI-Programm aus einem HTML-Dokument heraus gestartet werden kann
und wie die Schnittstelle für die Parameterübergabe konkret aussieht.
CGI-Programme sind auf dem Web-Server üblicherweise in einem Verzeichnis „CGI-bin“ zu finden, welches
Ausführungsrechte besitzt. Der Aufruf der Programme geschieht auf verschiedene Weise [Gross01, S.6-7]:
Das Perl-Programm News.pl wird durch einen Hyperlink aufgerufen:
<a href=“/cgi-bin/news.pl“>NEWS anzeigen</a>
Server Side Includes: Dies sind HTML-Dateien mit den Dateiendungen .shtml oder .shtm, welche u.a. Anweisungen zur Ausführung eines CGI-Programmes enthalten. Ein Beispiel für die Verwendung von Server
Side Includes ist das Einfügen des aktuellen Datums. Nicht alle Web-Server unterstützen diese Server Side
Includes.
Die von einem Formular abgeschickten Daten können durch ein CGI-Programm verarbeitet werden. Dafür
muss ein Programm auf dem Server zu gestartet werden, das dies übernimmt. Im Form-Tag eines Formulars
wird das auszuführende Programm angegeben: <form action=“cgi-bin/script.pl“>
Es bleibt nun die Frage, wie Parameter von einer HTML-Seite an ein CGI-Programm übergeben werden können.
Hier kommt das eigentliche CGI, also die standardisierte Schnittstelle zum Tragen. Wenn ein CGI-Programm
aufgerufen wird, erhält es Zugriff auf die sogenannten Umgebungsvariablen. Da CGI aus der UNIX-Welt
stammt, ist der Begriff dort entlehnt. Normalerweise werden einem Programm Parameter über die Standardeingabe übergeben. Da dies im Falle von CGI-Programmen nicht funktioniert, wird dort der Umgebungsmechanismus des Webservers verwendet. Die Parameter werden in ein Array gepackt, das als „Umgebungsvariable“
bezeichnet wird. Dabei handelt es sich grob gesagt um
Informationen über den Client, den Server und den Benutzer
vom Benutzer übergebene Formulardaten
Auf diese Umgebungsvariablen kann aus jeder CGI-unterstützenden Programmiersprache zugegriffen werden. In
Perl würde dies z.B. etwa so aussehen:
$browserName = $ENV(’HTTP_USER_AGENT’);
Hiermit wird der Variable browserName der Name des aufrufenden Browsers, welcher in der Umgebungsvariablen HTTP_USER_AGENT, gespeichert ist, zugewiesen.
Das Lesen von Formulardaten geschieht genau gleich über das Lesen der Umgebungsvariablen QUERY_STRING oder CONTENT_LENGTH. Welche der beiden Variablen zum Einsatz gelangt, ist abhängig von
der Übermittlungsart. HTML-Formulare können Daten per GET- oder POST-Methode übermitteln. Für Details
hierzu sei auf die entsprechende Literatur verwiesen (z.B. [Gund96, S. 30ff]) Die Verwendung des PostVerfahrens ist etwas komplizierter, da hier über die Variable CONTENT_LENGTH nur die Länge der Angaben
übermittelt werden.
Seminar Datenbanken, SS 2001
Datenbankenanbindung mit CGI & PHP
Datenbank-Anbindungen mit PHP
Seite 9 von 13
4 Datenbank-Anbindungen mit PHP
In der Architektur-Übersicht wurde festgehalten, dass es neben der direkten Verbindung zu einem DatenbankServer und der Verwendung eines Programms, das als DB-Client funktioniert, noch eine dritte Möglichkeit gibt.
Anstelle eines vom HTML-Code getrennten Programms, werden häufig Skriptsprachen eingesetzt, die direkt im
HTML-Code eingefügt werden. Eine der verschiedenen in diesem Bereich ist PHP. Diese Skriptsprache und
deren Einsatz für Datenbankanbindungen im Web soll nun kurz besprochen werden.
4.1 Entwicklung von PHP
Bei PHP handelt es sich um eine im Laufe des Jahres 1994 von Rasmus Lerdorf entwickelte serverseitig ausgeführte Skriptsprache, welche in HTML-Code eingebettet wird. Auf seiner Homepage wurde die Sprache als
Personal Home Page Tools veröffentlicht. Daher stammt dies Abkürzung PHP, welche heute offiziell PHP:
Hypertext Preprocessor heisst [PHPM01]. Im Rahmen eines Universitätsprojektes wurde die Sprache dann in die
heutige, stark an C und Java angelehnte Form gebracht [Köhn01]. Mittlerweile ist die Sprache bei Version 4
angelangt und wird von der Open Source Gemeinde weiterentwickelt. Heute wird der PHP-Interpreter für alle
gängigen Web-Server angeboten.
4.2 Eigenschaften und Einsatz von PHP
Der PHP-Code wird innerhalb von normalen HTML-Dokumenten geschrieben und dort durch die Zeichen
<?.....?> eingeschlossen. Für den Web-Server werden die Dateien durch die Dateiendung .php gekennzeichnet.
Der Webserver lässt in so gekennzeichneten Dateien, die PHP-Teile durch einen PHP-Interpreter ausführen. Die
Aufgabe des Programms ist es, HTML Code zu generieren, welcher an die Stelle des Codes im HTMLDokument eingefügt wird.
Der PHP-Interpreter kann einerseits als CGI-Modul auf einem CGI-fähigen Web-Server eingesetzt werden. Diese Version bringt den bei CGI’s üblichen Nachteil mit sich: Für jedes PHP-Dokument wird ein eigener Prozess
gestartet. Andrerseits kann diesen Nachteilen durch die Installation einer Server-Erweiterung entgegengewirkt
werden. Diese lässt den PHP-Interpreter in einem Server-internen Prozess laufen und stellt diesen allen PHPProgrammen zur Verfügung.
PHP ist sehr einfach zu erlernen und anzuwenden. Dies und vermutlich der zunehmende Einsatz von Linux als
Betriebssystem, dem Apache Web-Server, MySql als Datenbank und dazu als ideale Ergänzung PHP (sog.
LAMP-Konfiguration) haben in den letzten zwei, drei Jahren wohl dazu geführt, dass die PHP-Gemeinde stark
wächst. Im Internet lassen sich so zum Beispiel ausgezeichnete und aktuelle Dokumentation finden. Bei CGI ist
dies schon eher schwierig.
Grundsätzlich lässt sich mit PHP alles machen, was auch mit CGI-Skripts möglich ist. Die Stärke von PHP liegt
jedoch in der sehr umfangreichen Funktionalität und hier insbesondere in der breiten Unterstützung von Datenbanken. Von PHP4 werden die folgenden Datenbanken unterstützt:
Adabas D
InterBase
ODBC
IBM DB2
PostgreSQL
Dbase
FrontBase
Oracle (OCI7 und OCI8)
MySQL
Solid
Empress
MSQL
Informix
Velocis
Ingres
Unix dbm
Sybase
FilePro (nur Lesezugriff) MS SQL
Abb. (5) Von PHP4 unterstützte Datenbanken
PHP bietet des weiteren gewisse Konzepte aus der objektorientierten Welt an: Klassen und Objekte stehen zur
Verfügung und können auch abgeleitet werden.
4.3 Datenbankanbindungen mit PHP
PHP unterstützt die verschiedenen Datenbanken, indem für die Ansteuerung jeder dieser Datenbanken entsprechende Funktionen zur Verfügung gestellt werden. Dies soll im Folgenden am Beispiel einer Verbindung zu einer
MySQL-Datenbank aufgezeigt werden. Das Beispielskript fragt den Inhalt einer Tabelle ab, welche in einer
Datenbank auf dem mySQL-Server liegt. Das Resultat der Abfrage wird anschliessend in einer HTML-Tabelle
dargestellt. Für das Verständnis dieses PHP-Skripts ist ein minimales Wissen über SQL und HTML vorausgesetzt.
Seminar Datenbanken, SS 2001
Datenbankenanbindung mit CGI & PHP
Datenbank-Anbindungen mit PHP
Seite 10 von 13
<html>
<title>Datenbankanbindung</title>
<body>
Dies sind ganz normale HTML-Tags. Das einführende Tag <html> zeigt an, dass nun HTML-Tags folgen werden. Im <title> - Tag findet der Browser den Titel der Seite, welcher im Titelbalken des Fenster angezeigt wird.
Nach dem öffnenden <body> - Tag folgt normalerweise der Inhalt der HTML-Seite.
<?php
In diesem Beispiel setzt nun hier der PHP-Code ein, was dem Web-Server durch das einleitende <?php – Tag
angezeigt wird. Aller Code, der bis zum schliessenden ?> steht, wird vom PHP-Interpreter interpretiert.
Als erstes soll eine Verbindung zu einer MySQL-Datenbank geöffnet werden:
$db = mysql_connect("DB-Servername", "username", "password") or die ("Could not connect");
Die Funktion mysql_connect kann mit verschiedenen Parametern aufgerufen werden. Im Beispiel wird der Servername des MySQL-Servers angegeben und da der Zugriff auf den DB-Server per Benutzername und entsprechendes Passwort geschieht, werden diese angegeben. PHP kennzeichnet Variablen mit dem Dollarzeichen $. In
der Variablen $db werden nun sämtliche intern gebrauchten Angaben zur Datenbank-Verbindung gespeichert.
Falls die Verbindung aus irgendeinem Grund nicht gelingt, wird die Meldung „Could not connect“ ausgegeben
und das Skript verlassen.
mysql_select_db("DatenbankName",$db);
Die zu benutzende Datenbank wird mit der mysql_select_db Funktion ausgewählt. Dabei muss die eröffnete
Verbindung als Parameter mit übergeben werden.
$result=mysql_query ("select * from members",$db);
Nun geht es darum, eine SQL-Anweisung an den Datenbankserver zu senden. Im Beispiel werden alle Felder der
Tabelle members in der gewählten Datenbank zurückgeliefert und im Array $result gespeichert.
echo "<table ><tr>";
echo "<th>Vorname</th><th>Nachname</th><th>Adresse</th><th>PLZ</th><th>Ort</th>";
echo "</tr>";
Damit das Resultat der Abfrage im Browser adäquat dargestellt werden kann, wird mit den echo-Befehlen die
HTML-Tags für den Kopf einer Tabelle ausgegeben. Die SQL-Abfrage ist jetzt durchgeführt und die Daten sind
in der Variable $result gespeichert. Die einzelnen Datensätze müssen nun noch ausgelesen und dargestellt werden.
while ($items=mysql_fetch_array($result))
Solange im Array $result noch weitere Datensätze gespeichert sind, werden diese wie folgt ausgelesen:
{
echo "<tr>";
echo "<td>" .$items['firstName'] ."</td>";
echo "<td>" .$items['lastName'] ."</td>";
echo "<td>" .$items['Address'] ."</td>";
echo "<td>" .$items['ZIP'] ."</td>";
echo "<td>" .$items['Location']."</td>";
echo "</tr>";
}
Jedes Feld des Datensatzes wird mit der $items-Funktion ausgelesen und per echo-Befehl angezeigt. Die PunktNotation steht in PHP für das Aneinanderhängen eines Strings.
echo "</table>";
Die HTML-Tabelle wird mit diesem Echo-Befehl beendet.
mysql_close($db);
Zum Abschluss des Skriptes wird die Verbindung mit der Datenbank geschlossen. Diese hätte im Übrigen auch
vor dem Auslesen des Arrays geschlossen werden können.
Seminar Datenbanken, SS 2001
Datenbankenanbindung mit CGI & PHP
Vergleich
Seite 11 von 13
?>
<!-- weiterer HTML-Code -->
</body>
Mit dem schliessenden ?> - Tag wird dem Server angezeigt, dass der PHP-Bereich beendet ist. Nun könnte noch
weiterer HTML-Code angefügt werden.
Das Beispiel zeigt auf, dass sich MySQL-Datenbankanbindungen mit PHP aus zwei Elementen zusammensetzen:
Funktionen, welche für die eigentliche Datenbankverbindung besorgt sind: öffnen, schliessen der Verbindung, Wahl der Datenbank u.a.
Funktionen zum Absetzen von SQL-Befehlen
Dieses Prinzip bleibt sich für die Anbindung von anderen Datenbanken, welche SQL unterstützen, in etwa
gleich. Allerdings bietet PHP für jede unterstützte Datenbank eigene und angepasste Funktionen an, welche die
jeweiligen Eigenheiten berücksichtigen.
Was geschieht nun beim Aufruf dieser PHP-Datei durch einen Browser? Der Webserver erkennt durch die Dateiendung .PHP, dass es sich um ein HTML-Dokument mit eingebettetem PHP-Skript handelt. Er lässt deshalb den
zwischen den Tags <!PHP und ?> eingebetteten Code durch den PHP-Interpreter ausführen. Die im Skript
durch die Echo-Befehle ausgegebenen HTML-Tags und Daten werden nun in die HTML-Datei eingebettet uns
so an den Browser gesandt.
Der folgende HTML-Code würde im Beispiel an den Browser zurückgeliefert:
<html>
<title>Datenbankanbindung</title>
<body>
<table >
<tr>
<th>Vorname</th><th>Nachname</th><th>Adresse</th><th>PLZ</th><th>Ort</th>
</tr>
<tr>
<td>Hans</td><td>Muster</td><td>Musterstrasse</td><td>8000</td><td>Zuerich</td>
</tr>
<tr>
<td><!-- weitere Datensätze -->....</td>
</tr>
</table>
<!-- weiterer HTML-Code -->
</body>
Man sieht also, die von der Datenbank zurückgelieferten Informationen wurden anstelle des PHP-Skripts in den
HTML-Code eingebettet. Der Browser sieht den PHP-Code dabei nie!
4.4 Persistente Datenbank-Verbindungen
Mit PHP sind persistente Datenbank-Verbindungen sehr einfach zu realisieren [Merl01]. Zur Repetition: Persistente Datenbank-Verbindungen werden nach Abschluss eines Programms nicht geschlossen. Dies mit dem
Ziel, dass die Verbindung für weitere Kommunikation mit dem Datenbanken-Server benutzt werden kann. Damit
werden Ressourcen gespart. Der Versuch eine persistente Verbindung zu öffnen, geschieht beispielsweise für den
MySql-Server einfach durch die Funktion mySQL-pConnect(„Host“,“User“,“Password“). Die einzige
Änderung erfährt der Befehl durch das p, das eingefügt wird. Ansonsten bleibt sich alles gleich – auch die
anderen SQL-Funktionen.
5 Vergleich
Mit welcher der beiden Datenbankenanbindungsmöglichkeiten eine Web-Applikation entwickelt werden soll,
hängt von einigen Faktoren ab. Die Tabelle in Abbildung 6 zeigt einige auf:
Seminar Datenbanken, SS 2001
Datenbankenanbindung mit CGI & PHP
Fazit
Seite 12 von 13
Eigenschaft
CGI-Programme
PHP
Erlernbarkeit
CGI einfach
einfach
Programmiersprachen je nachdem
Performance
Abhängig von Implementierung: ein Prozess pro Programm
ressourcenfressender als Prozess für alle Programme.
Abhängig von Implementierung: ein Prozess
pro Programm ressourcenfressender als
Prozess für alle Programme.
Abhängig von Programmiersprache: Skriptsprache langsamer als
kompilierte Sprache
Skriptsprache, welche zur Laufzeit interpretiert wird.
Trennung Programmlogik
und GUI
Zum Teil. Im HTML-Teil ist das GUI angelegt und im CGIProgramm die Logik, aber auch gewissermassen der AntwortTeil des GUI’s
i.d.R. nein, da PHP im HTML-Code eingebettet ist. PHP kann aber in Logik und GUI
aufgeteilt werden – es besteht aber die
gleiche Problematik wie bei CGI’s
Datenbankanbindungen
Verbindungen zu sehr vielen Datenbanken.
Vorteil der Abstrahierung durch DBI
Verbindungen zu sehr vielen Datenbanken.
Nachteil, dass in der offiziellen Version kein
DBI-ähnliches Modul besteht. Dies wurde
mittlerweile allerdings bereits entwickelt
Persistente Datenbankanbindungen
Ja
Ja
Zukünftige Entwicklung
und Verbreitung
Vermutlich eher etwas rückläufig.
Im Trend
Dokumentationen
Viele, aber z.T. etwas veraltet
Hervorragend und aktuell
Abb. (6) Vergleich von CGI-Programmen und PHP
Aus der Tabelle ist ersichtlich, dass beide Konzepte in den entscheidenden Fragen sehr ähnlich liegen. Zum Teil
wurden gewisse, ursprüngliche Schwächen durch Neuentwicklungen ausgemerzt, was die Entscheidung nicht
einfacher macht. Schlussendlich ist es wohl die Frage, was die Applikation können muss, resp. welches dafür die
geeignete Programmiersprache sein dürfte. Im Falle von umfangreichen Zeichenoperationen dürfte die Wahl
daher vermutlich auf Perl fallen – und damit auf die Verwendung des CGI. Andrerseits gibt es viele einfachere
Anforderungen, welche sowohl in irgendeiner CGI-Programmiersprache, als auch in PHP problemlos gemeistert
werden können. Da ist die Entscheidung wohl zu einem grossen Teil eine Frage der persönlichen Sympathie.
6 Fazit
Ein direkter Vergleich von CGI-Programmen und PHP-Skripten ist schwierig zu ziehen, zumal viele PHPInterpreter als CGI’s entwickelt wurden.
Der grösste Unterschied ist jedoch darin zu sehen, dass PHP eine in HTML Code eingebettete Sprache darstellt.
Dies hat den Vorteil, dass der Entwickler den Code nicht bei jeder Änderung neu kompilieren muss. Allerdings
ist auch dieses Argument nicht ganz durchgängig, da es auch CGI-Sprachen gibt, welche interpretiert werden
(z.B. Perl). Die saubere Trennung von GUI-Code, der bei Web-Applikationen vom Web-Designer geschrieben
wird und der Business-Logik, welche vom Programmierer beherrscht werden muss, ist bei beiden Ansätzen
schwierig realisierbar. PHP bietet hier vermutlich jedoch die besseren Möglichkeiten, da insbesondere zurückgelieferte Daten vom Programmierer in Variablen bereitgestellt werden können, die der Designer nur noch einzusetzen braucht.
In Bezug auf Datenbankanbindungen lassen sich keine direkten Schlüsse ziehen, da PHP und CGI’s insgesamt
etwa gleichwertige Lösungen anbieten – mindestens für einfachere Anwendungen. Geht es um extrem performante Lösungen, ist kompilierbaren Programmiersprachen, also CGI’s, der Vorzug zu geben. Exakte Performance-Vergleichsdaten konnten jedoch nirgends gefunden werden, so dass dies auch nur eine theoretische Überlegung darstellt.
Für viele Anwendungen wird die Entscheidung deswegen eher einer persönlichen Sympathiekundgebung entsprechen. In meinem Falle würde ich, falls nicht durch die obengenannten Fakten beeinflusst, eindeutig PHP
wählen. Ich könnte mir vorstellen, dass die zunehmende Verbreitung von Linux-Servern, in dessen Umfeld PHP
vorwiegend eingesetzt wird (sog. LAMP Konfiguration bestehend aus Linux, Apache Web-Server, MySql und
PHP), die Verbreitung und Entwicklung im PHP-Bereich verstärken könnte.
Seminar Datenbanken, SS 2001
Datenbankenanbindung mit CGI & PHP
Quellverzeichnis
Seite 13 von 13
7 Quellverzeichnis
Die Quellangaben erfolgen unter Angabe von: Autor; Titel, Band; Verlag; Erscheinungsort; Erscheinungsjahr,
[Datum der Abfrage].
Falls Angaben fehlen, werden anstelle der obigen Angaben die folgenden Abkürzung benutzt: o. A; o.T.; o. V.; o.
O; o. J.
Im Falle von Dokumenten, welche im Internet publiziert wurden, wird als Erscheinungsort die Internetadresse
angegeben und sofern publiziert, der Ort der Abfassung. Als Ersatz für den Verlag wird die Institution angegeben, unter deren Namen das Dokument publiziert ist. Das Erscheinungsjahr ist hierbei oft nicht angegeben, weshalb das Datum der letzten Änderung der Seite angegeben wird und zusätzlich das Datum der Abfrage.
Literatur
[Gund96]
Shishir Gundavaram; CGI Programmierung im World Wide Web, 2. Auflage;
O’Reilly/International Thomson Verlag GmbH Co KG; Bonn; 1996
[Loes]
Henrik Loeser; Technik für Web-basierte Datenbankanwendungen: Anforderungen, Ansätze,
Architekturen; Universität Kaiserslautern; o. J.
Elektronisch abrufbare Dokumente
[Akad01]
o.A. ; Information Technology, Datenbankapplikationen mit Perl, DBI , Oracle 8i; Arkadia AG;
http://www.akadia.com/dbi/soug/html/main.html, Bern; o. J, Stand 16.6.01
[Gross01]
Grossmann Alex; Datenbankanbindung an das WWW: CGI-Common Gateway Interface; Universität Zürich; http://www.ifi.unizh.ch/dbtg/Classes/376SS2001/Ausarbeitungen/cgi.PDF; 2001,
29.6.01
[Köhn01]
Köhntopp Kristian; Data Driven Web Sites mit PHP Teil 1; o.V. ;
http://www.koehntopp.de/kris/artikel/data-driven/; 2000, 16.6.01
[Merl01]
Merl Edgar, PHP vertiefen; Fernuniversität Hagen; http://www.stud.fernunihagen.de/q4181824/php-db.html; 2001, 16.6.01
[NeTh01]
Neumann Thomas, Thorn Matthias; Application Servers; Systor;
http://www.systor.com/know/campus/lecture/unizh/ifi_enabl_sw_archit_ec/docs/thema_appl_ser
ver_EJB.pdf; 2000, 29.6.01
[PHPM01]
Diverse Autoren; PHP-Manual; The PHP-Group; http://www.php.net/manual/de/; 2001, 16.6.01
[roxen01]
o.V.; o. T. ; Roxen Platform
http://www.dimi.uniud.it/labs/documentazione/roxen/parsed/Challenger1.2/Administrator/scripti
ng/fastcgi.html; o. J., 19.6.01
Weitere Links zum Thema
Dynamische Webseiten-Generierung und Erklärung der Datenbankanbindung; PHP-Center:
http://www.php-center.de/tutorial/teil4.htm
Perl-Ressourcen: http://www.perl.com/pub
PHP-Einführung: http://www.pl-berichte.de/work/php/print/phpws_1.html
Datenbankanbindungen für dynamische Web-Seiten; http://www.torsten-horn.de/techdocs/db-web.htm
Kleines Web-Datenbank-Kompendium; http://www.simsy.ch/intranet/db.htm
PHP3 – Ein Überblick: http://www-cgi.uni-regensburg.de/WWW_Server/Dokumentation/PHP/Einfuehrung/
Seminar Datenbanken, SS 2001
Datenbankenanbindung mit CGI & PHP
Herunterladen