(Komplex-)Praktikum Rechnernetze Komplex II Praktikumsversuch - WWW-Datenbankanbindung mittels PHP - Praktikumsdokumentation Betreuer: Dr. A.Luntovskyy Bearbeitung: U.Winkler, F.Pretzer Inhaltsverzeichnis 1. Einleitung ......................................................................................................................................... 3 2. Grundlagen ....................................................................................................................................... 3 2.1. Dynamische Webseiten ............................................................................................................. 3 2.1.1. clientseitige Verarbeitung .................................................................................................. 3 2.1.2. serverseitige Verarbeitung ................................................................................................. 3 2.2. CGI ............................................................................................................................................ 5 2.3. HTML ........................................................................................................................................ 7 2.3.1. Formulare ........................................................................................................................... 7 2.3.2. Eingabezeile ....................................................................................................................... 7 2.3.3. Auswahllisten ..................................................................................................................... 8 2.3.4. Radiobuttons und Checkboxes ........................................................................................... 8 2.3.5. Submit ................................................................................................................................ 9 2.4. SQL.......................................................................................................................................... 10 2.5. PHP ......................................................................................................................................... 12 2.6. Installationsanleitung.............................................................................................................. 17 2.6.1. Installation und Konfiguration des Apache Webservers.................................................. 17 2.6.2. Installation und Konfiguration von PHP 5 ....................................................................... 18 2.6.3. Access 2003 und ODBC .................................................................................................. 20 3. Der Versuch ................................................................................................................................... 23 3.1. Versuchsziel ............................................................................................................................ 23 3.2. Versuchsdurchführung ............................................................................................................ 23 3.3. Systemvoraussetzung ............................................................................................................... 24 3.4. Die Datenbank ........................................................................................................................ 25 3.5. Aufgabenstellung ..................................................................................................................... 28 4. Wichtige Hinweise ......................................................................................................................... 31 4.1. FAQ ......................................................................................................................................... 31 4.2. Test der Logins an den Rechnern des Komplexpraktikums .................................................... 32 Literatur .............................................................................................................................................. 35 2 1. Einleitung Wer heutzutage an einen professionellen Webauftritt denkt, sollte bei der Umsetzung vor allem auch an die dynamische Erzeugung von Webseiten denken. Unternehmensinterne Datenbanken und andere Informationsquellen lassen sich damit mehrfach und vor allem effektiver nutzen. Der Aufwand zur Pflege und Aktualisierung sinkt. Jedoch ist ihre Anbindung mit statischen HTML nur schwer zu realisieren. 2. Grundlagen 2.1. Dynamische Webseiten Dynamische Webseiten haben gegenüber statischen Webseiten den Vorteil, dass bei ihnen der Inhalt während des Aufrufs generiert wird. Sie reagieren auf Eingaben, werten diese aus und liefern danach ein Ergebnis zurück. Prinzipiell unterscheidet man hierbei eine clientseitige und eine serverseitige Verarbeitung der Daten. 2.1.1. clientseitige Verarbeitung Clientseitige Verarbeitung ist dadurch gekennzeichnet, dass nach Aufruf des Dokuments, mit Hilfe des Browsers das Skript ausgeführt wird. Es findet also keinerlei Verarbeitung auf der Serverseite statt. Vorteil dieser Technik ist, dass die Last der Abarbeitung auf der Clientseite liegt. Die Darstellung der Seite erfolgt dadurch meist schneller. Nachteile sind jedoch die Einsehbarkeit des Codes und das Fehlen von Erweiterungen zur Ansicht der Seite (Plugins etc.). 2.1.2. serverseitige Verarbeitung Serverseitige Verarbeitung hingegen vollzieht sich vollkommen ohne Mitwirken des Clients. Nach Aufruf des Dokuments bzw. des Skriptes wird dieses auf dem Server verarbeitet und nach Beendigung wird entweder eine Webseite generiert oder es werden nur die Ausgabeparameter übertragen. Vorteile dieser Technik sind die hohe Dynamik und die Unsichtbarkeit des Codes. Darüber hinaus ist die Unabhängigkeit von den Browsereinstellungen des Benutzers vorteilhaft. Nachteilig wirkt sich der Geschwindigkeitsverlust aus. Abbildung 1 und Abbildung 2 verdeutlichen die Arbeitsweise nochmals. 3 Abbildung 1: clientseitige Verarbeitung Abbildung 2: serverseitige Abarbeitung 4 2.2. CGI Die Kommunikation zwischen Browser und Server erfolgt über das HTTP-Protokoll. Der Aufruf eines serverseiteigen Programmes durch den Benutzer (Eingabe der URL), erfordert nun eine Schnittstelle, um die Programme mit Parametern (eingegebene Daten) zu versorgen. Diese Schnittstelle zwischen dem Webserver und dem Programm nennt man Common Gateway Interface CGI. Ein serverseitiges Programm – kurz CGI-Skript genannt - wird nun entweder durch die HTTPMethode GET oder POST aufgerufen. Die GET-Methode übermittelt dabei die Parameter durch Anfügen an die URL und so mit der Belegung der Umgebungsvariablen QUERY_STRING . Die Abtrennung der einzelnen Informationen erfolgt hierbei durch Fragezeichen. Die POST-Methode hingegen übermittelt die Informationen direkt an die Standardeingabe. Das CGI-Skript muss demzufolge die Standardeingabe abrufen können. Das Programm entpackt nun die empfangene Zeichenkette, nimmt sie als Parameter und steuert somit den Programmablauf. Die Standardausgabe des Skriptes wird als neue Webseite an den Browser gesendet. Die Skripte können auch Daten auf dem Server speichern oder Informationen von anderen Applikationen verwenden z.B. Datenbanken. Es wird deshalb vor der Beendigung des Skriptes ein Header erzeugt, damit der Server erkennt, was für eine Art Dokument generiert wird. Ein Beispiel für ein sehr einfaches CGI-Skript in C: 1: #include <stdio.h> 2: #include <stdlib.h> 3: 4: int main (void) { int ch; 5: int n, i; 6: char * cl; 7: 8: printf ("<html>\n<body>\n"); 9: 10: cl = getenv ("CONTENT_LENGTH"); 11: n = 0; if (cl) sscanf (cl, "%d", &n); 12: 13: printf ("<b>CONTENT_LENGTH = %d </b>\n", n); 14: for (i = 0; i < n; i++) 15: { 16: ch = getchar (); putchar (ch); 17: } 18: 19: printf("</body></html>"); 20: return 0; 21: } 5 Ein CGI-Script kann aus einer HTML-Datei heraus auf verschiedene Arten aufgerufen werden: a) über Formulare: Dabei steht im <form>-Tag der Aufruf des Skriptes Beispiel: ... <form name=“suche“ method=“post“ action=“flug.php“> <select name = „abflughafen“ size=1> ... </form> In diesem Beispiel wird der Parameter durch die Standardeingabe übergeben – zu erkennen an der POST-Methode. b) über Verweise: Bei der URL-Angabe des Verweises wird das Skript direkt angegeben. Beispiel: ... <a href=“flug.php?name=dre“> Info </a> ... Hierbei ist der Name des Skriptes flug.php und der zu übergebende Parameter heißt name=dre . c) über Grafikreferenzen: Auch hier genügt die Angabe der URL Beispiel: ... <img src=“flugchart.php?name=12“> ... Wichtig an diesem Beispiel ist, das das Skript auch eine Grafik produziert. Wie wir sehen kann die Programmierung eines CGI-Scriptes durchaus anspruchsvoll sein. In HTML-Code eingebettet Scripte wie PHP vereinfachen dies, da viele Anweisungen, die HTMLCode ausgeben, entfallen. 6 2.3. HTML Wir möchten an dieser Stelle nicht intensiv auf HTML eingehen. Wir empfehlen das Werk von Thomas Münze zum Selbststudium und als Nachschlagewerk [1]. 2.3.1. Formulare Formulare stellen in HTML eine Möglichkeit dar, mit der der Anwender Textfelder ausfüllen, aus Listen und Knöpfen Einträge auswählen und dieses ausgefüllte Formular mittels drücken einer Schaltfläche absenden kann. Alles was zwischen den Tags <form> und </form> steht gehört zu dem Formular. Darüber hinaus können Sie weitere Objekte, wie Textabsätze, Tabellen usw. platzieren, um die Form und Anordnung der Formularelemente zu erzwingen. Beispiel: ... <form name=“suche“ method=“post“ action=“flug.php“> ... </form> ... im einleitenden <form>-Tag gibt an, was mit den Formulardaten passieren soll, wenn der Anwender das Formular abschickt. action 2.3.2. Eingabezeile Eine Eingabezeile ist ein einzeiliges Eingabefeld, welches durch das <input>-Tag definiert wird. Dabei ist zu beachten, dass jede Eingabezeile über einen internen Namen ohne Umlaute und Sonderzeichen verfügt. Beispiel: ... <form name=“person“ method=“post“ action=“person.php“> <table> <tr><td> Vorname </td><td> <input name=“vorname“> </td></tr> <tr><td> Nachname </td><td> <input name=“nachname“> </td></tr> </table> </form> ... Neben diesem einzeiligem Eingabefeld bietet HTML noch weitere Möglichkeiten der Texteingabe, wie z.B. mehrzeilige Eingabefelder oder Eingabezeilen für Passwörter. Mehr Informationen dazu findet man wie oben genannt unter [1] 7 2.3.3. Auswahllisten <Select name=''auswahl'' size=1> Leitet eine Auswahlliste ein. Jede Auswahlliste muss einen eindeutigen internen Namen tragen, der ebenfalls keine Umlaute und Sonderzeichen enthalten darf. size gibt an, wie viele Einträge der Auswahlliste gezeigt werden. option value=''1'' definiert einen Eintrag in der Auswahlliste wobei die optionale Angabe value den Text festlegt, der abgesendet wird. Fehlt dieser Parameter so wird der String des selektierten Eintrages gesendet. Beispiel: <form name="flughafen" methode="post" action="flughafen.php"> <option>Flughafen Dresden <!-- sendet "Flughafen Dresden" --> <option value="101">Flughafen Berlin <!-- sendet "101" --> <option selected>Flughafen Breitenbrunn <!-- Vorauswahl --> </form> Der zusätzliche Parameter selected wählt diesen Eintrag als Voreinstellung aus. Auch hier wollen wir auf weiterführende Möglichkeiten auf [1] verweisen. 2.3.4. Radiobuttons und Checkboxes Radiobuttons sind eine Gruppe von beschrifteten Auswahlknöpfen, von denen immer nur einer markiert sein kann. Radiobuttons werden ähnlich einem Eingabefeld durch den Tag <input type=radio name=''smoker'' value=''yes''> definiert. Der value -Parameter bestimmt den übermittelten Wert. <form name="raucher" methode="post" action="buchung.php"> <input type="radio" name="smoker" value="1">Raucher <br> <input type="radio" name="smoker" value="0">Nichtraucher <br> </form> 8 2.3.5. Submit Um die Daten an den Server zu senden, bedarf es in dem Formular noch einer speziellen Schaltfläche – dem Submitknopf. Beispiel: ... <input type="submit" value="Formular absenden"> ... Der Parameter value beschriftet diese Schaltfläche mit dem angegebenen Text. Eine Eigenschaft des PHP -Interpreters ist es, die übergebenen Daten als globale Variable dem Programmierer bereitzustellen. So existiert die Variable smoker nach Absenden des Formulars vorinitialisiert mit dem Wert, den der Anwender ausgewählt hat. Bespiel: buchung.php <html> <body> <? if ( $smoker ) echo "Rauchen schadet Ihrer Gesundheit!"; ?> </body> </html> 9 2.4. SQL Structured Query Language SQL ist eine standardisierte Abfragesprache für relationale Datenbanken. Die Idee hinter SQL sollte sein, eine Abfragesprache für Nicht-Programmierer zu schaffen, die ohne mathematische Notationen(Quantoren usw.) auskommt. SQL wird von allen kommerziellen Datenbankmanagementsystemen unterstützt. Jedoch weicht SQL in einigen Aspekten auch vom relationalen Modell ab. Insbesondere wird dies auffällig bei Relationen. Hier ist es in SQL gestattet, das dies Multimengen sein können. Diese Tatsache ist darin begründet, dass dadurch Geschwindigkeitsvorteile erzielt werden. Mittels SQL ist es möglich Datenbanken zu erstellen, zu manipulieren und zu warten. Wir möchten auch hier auf einschlägige Literatur und vor allem auf die Vorlesung „Datenbanken“ aus dem Grundstudium und dem dortigen Skript von Herrn Prof. Lehner verweisen. Die Grundstruktur einer SQL-Anweisung zur Datenbankabfrage lautet: SELECT SELECT_Liste FROM Tabellenname(n) WHERE-Klauseln ORDER BY-Klausel Die in der SELECT_Liste aufgeführten Spaltennamen bestimmen, welche Spalten zur Anzeige der Abfrageergebnisse ausgewählt werden sollen. Nach dem Schlüsselwort anzugeben. FROM ist der Name der Tabelle[n] oder eines anderen Objektes (Sicht) Mit der WHERE-Klausel wird festgelegt, welche Reihen bei der Ausgabe der Abfrageergebnisse angezeigt werden sollen. Gesucht werden können Reihen • mittels Vergleichsoperatoren (= • in Bereichen (BETWEEN , NOT • in Listen (IN, > < >= <= <>) BETWEEN) NOT IN) • durch Zeichenfolgeübereinstimmung (LIKE • mit unbekannten Werten (IS , NOT LIKE) NULL, IS NOT NULL) • durch Kombination der genannten Typen (AND, • durch Negation (NOT) . 10 OR ) und In der ORDER BY-Klausel können bis zu 16 Spaltennamen angegeben werden. Entsprechend dieser Reihenfolge wird sortiert. Darüber hinaus existieren folgende Standardfunktionen: • SUM (Summe) • AVG (Durchschnittliches) • MIN (Minimum) • MAX (Maximum) • COUNT (Werteanzahl) und folgende Standardschlüsselwörter: • ASC/DESC • FOR UPDATE OFF • GROUP BY • HAVING • INTO • FROM • ORDER BY • SAVE TO TEMP • SELECT • UNION • WHERE Abschließend noch einige einfache Beispiele: SELECT DISTINCT Lieferant, Adresse FROM Waren SELECT COUNT (DISTINCT Lieferantencode) FROM Waren SELECT * FROM Personal WHERE Name LIKE `D%` SELECT * FROM Waren WHERE Stoffcode LIKE `M11_` SELECT Name, Vorname FROM Personal WHERE Adresse NOT LIKE `%Pirna` 11 2.5. PHP PHP Hypertext Preprozessor ist eine in HTML eingebettete, serverseitige Skriptsprache und eine Erweiterung für Internetserver. Mit PHP ist es möglich verhältnismäßig effizient dynamische Webseiten zu erstellen. Auf die serverseitige Verarbeitung von Webseiten sind wir bereits eingegangen. Zu beachten ist jedoch die Art, wie ein PHP-Skript interpretiert werden kann. Der Interpreter läuft dabei entweder direkt als Webservermodul (Erweiterung) oder eingebunden als ein CGI-Programm. Folgende Abbildung stellt den prinzipiellen Ablauf mit Anbindung einer Datenbank über die ODBC-Schnittstelle dar. Abbildung 3: Ablauf eines PHP-Scriptes Grundgerüst eines PHP-Skriptes Das Grundgerüst eines PHP-Skriptes sieht folgendermaßen aus. <html> <body> <? ------PHP-Skript------ ; ?> </body> 12 </html> Das PHP-Skript wird also wie schon erwähnt direkt in das HTML-Dokument integriert. Der Beginn und das Ende des PHP-Codes sind dabei speziell gekennzeichnet. Diese Kennzeichnung kann unterschiedlich ausfallen, alle Varianten werden vom Interpreter erkannt: <? <?PHP ... PHP-Code ... ?> <?php ... PHP-Code ... ?> ... PHP-Code ... ?> Kommentare Kommentare werden in PHP einleitend durch /* und beendend durch */ gekennzeichnet. Auch die aus der Programmiersprache C bekannte Form mittels // ist zulässig. Variablen Variable sind durch ein vorangestelltes $ gekennzeichnet. Ein Vorteil von PHP ist, dass es keine expliziten Typzuweisungen gibt. Vielmehr wird der Datentyp einer Variablen durch deren Inhalt bestimmt. Beispiel: eine Variable vom Typ Integer $num = 8; Formularauswertung in PHP Die Erstellung von Formularen mittels HTML wurde bereits gezeigt. Deren Auswertung und Verarbeitung mittels PHP ist relativ einfach. Aus jedem Formularelement, welches mittels name ein eindeutigen Namen zugeordnet bekommen hat, wird ein Variable. Diese Variablen stehen dem Anwender nun zur weiteren Bearbeitung zur Verfügung. Datenbankanbindung mittels ODBC Die Einrichtung einer ODBC-Datenquelle wird weiter unten noch erläutert. Sie stellt eine definierte Schnittstelle zu verschiedenen Datenbanken dar. An dieser Stelle möchten wir Ihnen auch nur die wichtigsten Befehle, um eine Verbindung zu einer ODBC-Datenquelle zu errichten, vorstellen: a) odbc_connect : Aufbau einer Verbindung zu einer ODBC-Datenquelle int odbc_connect (string dsn, string user, string password [, int cursor_type]) liefert eine ODBC-Verbindungskennung connection_id oder 0 (FALSE) bei Fehlfunktion zurück. 13 Die Verbindungskennung connection_id wird von den anderen ODBC-Funktionen benötigt. Es können mehrere ODBC-Verbindungen nebeneinander bestehen. Der optionale vierte Parameter cursor_type setzt die Art des Cursors, der für diese Verbindung genutzt werden soll. Normalerweise wird er nicht benötigt, kann aber bei manchen ODBC-Treiberproblemen nützlich sein. Es können Probleme bei der Ausführung von komplexen Prozeduren auftreten. Die Fehlermeldung lautet dann zum Beispiel ,,Cannot open a cursor on a stored procedure that has anything other than a single select statement in it'' . Dieser Fehler kann durch die Verwendung von SQL_CUR_USE_ODBC als cursor_type vermieden werden. Einige ODBC-Treiber unterstützen den optionalen Parameter row_number in der Funktion odbc_fetch_row() nicht. Auch in diesem Fall kann SQL_CUR_USE_ODBC helfen. Folgende Konstanten sind als Cursortyp definiert: SQL_CUR_USE_IF_NEEDED SQL_CUR_USE_ODBC SQL_CUR_USE_DRIVER SQL_CUR_DEFAULT Beispiel: <? // Verbindung zur ODBC-Datenquelle aufbauen if ( ! $odbc_handle = odbc_connect("flugbuchung","","") ) { echo "<h1> Hola! Fehler ! Konnte keine Verbindung zur "; echo "ODBC-Datenquelle aufbauen.</h1>"); echo "</body></html>"; exit; } ?> b) odbc_exec : Bereitet einen SQL-Befehl auf und führt ihn aus. int odbc_exec (int connection_id, string query_string) liefert bei 0 einem Fehler FALSE zurück, sonst eine ODBC-Ergebniskennung result_id. odbc_exec sendet einen SQL-Befehl zu dem Datenbankserver, der durch die Verbindungskennung connection_id bezeichnet wird. Dieser Parameter muss durch odbc_connect() oder odbc_pconnect() erzeugt worden sein. Siehe auch: odbc_prepare() und odbc_execute() für die gleichzeitige Ausführung von mehreren SQL-Befehlen. Beispiel: // Abfrage vorbereiten und durchführen $sql_query = "select id, name from airport"; 14 $res = odbc_exec( $odbc_handle , $sql_query); c) odbc_fetch_row : Liefert eine Datenzeile zurück. int odbc_fetch_row (int result_id [, int row_number]) Wenn odbc_fetch_row() erfolgreich durchgeführt wurde (also eine oder mehrere Datenzeilen gefunden wurden), dann wird TRUE zurückgeliefert. Wenn keine (weitere) Zeile vorhanden ist, wird FALSE zurückgegeben. odbc_fetch_row() stellt eine Zeile der von odbc_do()/odbc_exec() zurückgegeben Daten bereit. Nachdem odbc_fetch_row() aufgerufen wurde, können die Felder dieser Zeile mit odbc_result() genutzt werden. Wenn row_number nicht definiert ist, versucht odbc_fetch_row() die nächste Zeile aus dem Abfrageergebnis result_id zu holen. kann abwechselnd ohne und mit dem Parameter row_number genutzt werden. Um durch ein Abfrageergebnis mehrfach zu durchlaufen, kann man odbc_fetch_row() mit row_number gleich 1 aufrufen, um dann wie gewohnt mit odbc_fetch_row() ohne Zeilenparameter fortzufahren. Wenn der ODBC-Treiber die Herausgabe von bestimmten Zeilen nicht unterstützt, wird der Parameter ignoriert. odbc_fetch_row() Beispiel: while ( odbc_fetch_row($res) ) { // Solange wie Zeilen vorhanden sind wird // dieser Schleifenrumpf ausgeführt } d) odbc_result : Erlaubt den Zugriff auf die Ergebnisdaten. string odbc_result (int result_id, mixed field) Liefert den Inhalt eines bestimmtes Feldes zurück. Der Feldparameter field kann entweder der Integerwert der Spaltennummer oder ein String mit dem Spaltennamen sein. Als Beispiel: $produkt_3 = odbc_result ($Query_ID, 3 ); $produkt_wert = odbc_result ($Query_ID, "wert"); 15 Der erste Aufruf von odbc_result() liefert den Wert des drittes Feldes im aktuellen Datensatz im Abfrageergebnis zurück. Der zweite Funktionsaufruf gibt den Wert der Spalte ,,wert'' im aktuellen Datensatz zurück. Wenn die Spaltennummer kleiner als 1 oder größer als die Spaltenzahl ist, tritt ein Fehler auf. Gleiches gilt für einen Spaltennamen, der im Abfrageergebnis nicht vorkommt. Die Spaltennummern beginnen mit 1. Für die Nutzung von Binärdaten und LONG- Spalten schauen Sie bitte bei odbc_binmode() und odbc_longreadlen() nach. Beispiel: while ( odbc_fetch_row($res) ) { $id = odbc_result($res, 1); $abflughafenName = odbc_result($res, 2); echo ("$abflughafenName"); } } e) odbc_result_all: Gibt das aktuelle Abfrageergebnis als HTML-Tabelle aus. int odbc_result_all (int result_id [, string format]) Liefert die Anzahl Reihen im Abfrageergebnis FALSE. result_id zurück und wenn ein Fehler auftritt gibt alle Reihen eines SQL-Abfrageergebnisses result_id aus einem odbc_exec()-Aufruf als HTML-Tabelle aus. Mit dem optionalen Stringformat kann ein allgemeines Tabellenformat angegeben werden. odbc_result_all() Beispiel: <? $sql_query = "select id, name from airport"; $res = odbc_exec( $odbc_handle , $sql_query); odbc_result_all($res); ?> f) odbc_close: Beendet eine ODBC-Verbindung void odbc_close (int connection_id) odbc_close() beendete die Verbindung zum Datenbankserver, die durch die Verbindungskennung connection_id gekennzeichnet wurde. 16 2.6. Installationsanleitung 2.6.1. Installation und Konfiguration des Apache Webservers Um von zu Hause aus die Bearbeitung durchführen zu können ist es sinnvoll sich eine Testumgebung einzurichten. XAMPP hat sich dabei als sehr einfach zu installieren und zu warten herausgestellt. Es stellt ein Komplettpaket aus dem Webserver Apache, MySQL, PHP und diversen anderen Modulen dar. Der Vorteil bei dieser Installation liegt darin, dass bereits alle Einstellungen vorgenommen wurden. Man braucht keinerlei weitere Konfigurationen und Änderungen vornehmen. Nach dem Download des Pakets von [2] ist die Installation trivial. Folgende Abbildung zeigt XAMPP nach erfolgreicher Installation unter Windows 2000 und der Eingabe von http://localhost:8080 im Browser. Dies öffnet die Willkommensseite des Webservers. Abbildung 4: Willkommenseite nach erfolgreicher Installation Man sollte jedoch die Sicherheitseinstellungen ändern. Besonders sinnvoll ist dies beim Zugang zum Internet, da es sich bei XAMPP um einen vollwertigen Webserver handelt. 17 2.6.2. Installation und Konfiguration von PHP 5 Die Installation von PHP erfolgt im Rahmen der Installation von XAMPP und bedarf keinerlei weitere Einstellungen. Zu beachten ist vielmehr der Speicherort der Skripte im /htdocs-Ordner des Apacheverzeichnisses. Abbildung 5: Überblick der installierten Module Test der Konfiguration: Dazu erstellt man in 'C:\Program Datei mit folgendem Inhalt: Files\Apache Group\Apache\htdocs\Versuch9' <?PHP phpinfo() ?> 18 eine 'test.php' und betrachtet die URL http://localhost/Versuch9/test.php. Wenn alles in Ordnung ist sollte man Statusinformationen wie in Abbildung 3.3 des PHP-Interpreters zu sehen bekommen. Alternativ drückt man nach Eingabe von http://localhost:8080 im Browser auf phpinfo( ). Abbildung 6: Ausgabe von phpinfo() 19 2.6.3. Access 2003 und ODBC Die Installation von Access 2003 geschieht im Rahmen einer Microsoft Office Installation und wird an dieser Stelle nicht näher beschrieben. ODBC-Quelle Open Database Connectivity ODBC ist eine von Microsoft entwickeltes API mit dessen Hilfe man in einer Anwendung – mit Hilfe der Abfragesprache SQL - auf eine Datenquelle zugreifen kann. Dazu muss jedoch ein ODBC-kompatibler Treiber vorliegen. Dazu muss, bevor man auf die Datenquelle zugreift, die Datenquelle in ODBC eingebunden werden (sog. Systemdatenquelle einrichten). Dies geschieht mit Hilfe des ODBC Administrator. Vorgehensweise: in der Taskleiste Start - ControlPanel - Adminstrative Tools - Data Sources (ODBC) anklicken. Registerkarte USER - DSN wählen. (siehe Abbildung 3.4.) Knopf Add.. wählen. Microsoft Access Treiber wählen und den Knopf Finish drücken.(siehe Abbildung 3.5) Im anschließenden Dialogfenster im Textfeld Data Source Name einen symbolischen Namen vergeben, unter den die ODBC-Quelle angesprochen werden soll. In Abbildung 3.6 wurde der Name flugbuchung gewählt. Im gleichen Dialogfenster den Knopf Select wählen und die entsprechende Datenbankdatei auswählen. Sollte alles erfolgreich verlaufen sein, so müsste jetzt im Auswahlfeld des ODBC Data Source Administrator die ODBC Quelle flugbuchung erscheinen. 20 Abbildung 7: ODBC-Setup Abbildung 8: Auswahl des Microsoft Access-Treiber Abbildung 9: Dialog zur Auswahl der Datenquelle 21 Abbildung 10: Auswahl der Access-Datenbank Abbildung 11: Namensvergabe für ODBC-Datenquelle Abbildung 12: ODBC-Datenquelle für flugbuchung 22 3. Der Versuch 3.1. Versuchsziel Ziel des Praktikumversuches ist es, dass der Student Kenntnisse über die serverseitige Anbindung einer Datenbank an einen Webserver mittels einer in HTML eingebetteten Skriptsprache erlangt. Als Basis dient eine Datenbank, die auch in anderen Praktikumskomplexen Verwendung findet. 3.2. Versuchsdurchführung Jeder Praktikumsteilnehmer wählt eine der vorgestellten Aufgaben und löst diese individuell: mittels Zugriff auf den Praktikumsrechner über Remotedesktopverbindung zu Hause mittels einer Testumgebung (Einrichtung XAMPP s.o.) Auf den Praktikumsrechnern sind der Webserver, die Datenbank und die Skriptsprache entsprechend vorinstalliert und konfiguriert. Der Student erhält ein Login, mit dem er lesenden Zugriff mittels Remotedesktopverbindung auf die Datenbank hat und ein Ordner im Wurzelverzeichnis des Rechners, um seine Arbeit zu testen. Namenskonventionen: Skript: der Dateiname des Skriptes setzt sich aus dem FRZ-Login und der Endung „.php“ zusammen Beispiel: FRZ-Login „[email protected]“ → dg4.php Verzeichnis: C:\Program Files\Apache Group\Apache\htdocs\Versuch9\prakrn\“FRZ-Login“ Beispiel: FRZ-Login „[email protected]“ → C:\Program Files\Apache Group\Apache\htdocs\Versuch9\prakrn\gd4\ Rechner: (siehe auch Tabelle Abschnitt 4.2.) PRAKTIKUM-1.inf.tu-dresden.de 23 Login für das Praktikum: prak_“FRZ-Login“ Beispiel: FRZ-Login „[email protected]“ → prak_dg4 3.3. Systemvoraussetzung Die Ansprüche an die Hardware sind relativ gering: Pentium III - PC 128 MB Arbeitsspeicher Microsoft Access XAMPP als Testumgebung (optional) Internetzugang (für Remotedesktopverbindung) ca. 350 MB freien Festplattenplatz Kategorie Software Vendor Betriebsystem Windows 2000/ Windows XP Microsoft Datenbank Access (MS Office) Microsoft Skriptsprache PHP 5 Apache Group optionale Testumgebung XAMPP Apache Group 24 3.4. Die Datenbank Die in diesem Versuch zu verwendende Datenbank wird wie bereits erwähnt auch in anderen Komplexen des Praktikums verwendet. Der Diskursbereich modelliert den internationalen Flugbetrieb. Die Datenbank besteht aus diversen Tabellen : • Airline - beinhaltet den Namen und eine eindeutige ID der Fluggesellschaften • Airport - eine eindeutige Nummer, den Namen und der Stadt bzw. Ort in dem sich ein Flughafen befindet • Booking - in dieser Tabelle wird eine eindeutige Zuordnung eines Passagier zu einem bestimmten Flug und Sitz, welchen er gebucht hat, getroffen • Class - alle möglichen Klassen, in denen man fliegen kann • Flight - hier wird ein Flug eingetragen. Ein Flug hat eine eindeutige Nummer, einen Namen, ein Start- und einen Zielflughafen, und wird mit einem bestimmten Flugzeug in einer bekannten Zeit geflogen • Location - diese Tabelle ordne jede Stadt einem Land zu • Passenger - alle relevanten Informationen, wie Name, Vorname, Anschrift und Bankverbindung eines Passengers werden hier abgelegt • Plane - hier findet man Angaben zu einem Flugzeug wie Hersteller und Fluggesellschaft, die dieses Flugzeug unterhält • Planetype - Informationen über Flugzeugbauer und ihre Produkte • Seat - jeder Sitz erhält in diesem Diskursbereich eine eindeutige Nummer, wird einem Flugzeug zugeordnet, hat eine weitere Flugzeug- interne Nummer und Attribute, die beschreiben in welcher Klasse er steht und ob er ein Raucher- und Fensterplatz ist 25 Die nachstehenden Tabellen und die Abbildung 12 geben ein detaillierteres Bild. Natürlich kann man auch die Tabellen direkt in Microsoft Access erforschen. Abbildung 12: Die Datenbank in Tabellendarstellung 26 Anmerkungen: • AutoWert ist eine Zahl, die von Microsoft Access automatisch beim Hinzufügen eines neuen Datensatzes inkrementiert wird. Der Datentyp Datum/Uhrzeit wird an den PHP-Interpreter als Zeichenkette übergeben. • Auch wenn Microsoft Access beim betrachten der Datensätze der Tabellen den Inhalt der referenzierten Tabelleneinträge darstellt, so wird bei einer SQL-Anfrage der tatsächliche Wert (in den meisten Fällen die ID) übergeben. Zum Beispiel liefert ''SELECT * FROM booking'' folgende Datenreihe: 1,2,5,4 und nicht wie evtl. erwartet 1,''Damian'',''DREBZO'',4. 27 3.5. Aufgabenstellung Es soll ein Auskunftssystem für den Linienflugverkehr entwickelt werden, welches über einen Webbrowser bedient werden kann. Teilaufgabe 1 – Anzeigetafel Ziel dieser Aufgabe soll eine Seite sein, die ähnlich einer Anzeigetafel in den Wartehallen der Flughäfen ankommende und abgehende Flüge in der nächsten Stunde anzeigt. Dabei soll der Flughafen frei gewählt werden können. Teilaufgabe 2 – Personensuche Ziel soll eine Suchfunktion sein, die einem die Möglichkeit bietet, sich zu erkundigen, wann und wo eine bestimmte Person auf einen Flughafen ankommt oder abfliegt. Man wählt im Formular zunächst die Stadt, in welcher die gesuchte Person lebt und anschließend die Person aus. Teilaufgabe 3 – Reiseplan Mitunter fliegen Passagiere nicht direkt zu ihrem eigentlichen Ziel sondern sind gezwungen eine andere Route mit Umstiegen und Aufenthalten auf anderen Flughäfen zu wählen. Für diese Passagiere ist ein Reiseplan nützlich, der ihnen genau mitteilt, wann, wo und mit welcher Maschine sie abfliegen und wie lange der Aufenthalt auf den Flughäfen ist. Die Aufgabe sollte „vereinfacht“ gelöst werden, d.h. spezielle Sonderfälle sollte man nicht beachten. Teilaufgabe 4 – Auslastung Für Fluggesellschaften ist es sicherlich interessant wie stark bestimmte Linienflüge ausgelastet werden. Man sollte die Fluggesellschaft wählen könne und sich anzeigen lassen, welcher Flug mehr bzw. weniger als eine frei wählbare Prozentzahl belegt war. Teilaufgabe 5 – Logistik Aus logistischer Sicht ist es für eine Fluggesellschaft wichtig für ihre Flugzeuge einen Flugplan zu erstellen. Man sollte aus einem Formular eine Fluggesellschaft und ein Flugzeug dieser Fluggesellschaft wählen können. Der Flugplan dieses Flugzeuges soll in einer Tabelle angezeigt werden. Teilaufgabe 6 – Besucherzahl 28 Flughafenbetreiber wünschen sich eine einfache Statistik über ankommende und abfliegende Passgierzahlen in einer Monatsübersicht. In dem Formular soll der Flughafen gewählt werden können. Teilaufgabe 7 – Geheimdienst Der Geheimdienst möchte hin und wieder wissen, wo sich eine Person im Moment befindet. Entweder ist sie zu Hause oder auf den Weg in einer anderen Stadt. Der Geheimdienst geht davon aus, dass jeder ausschließlich mit dem Flugzeug reist, d.h. man befindet sich entweder „zu Hause“, in der Luft, auf den Weg in eine andere Stadt oder ist bereits dort angekommen. In dem Formular sollen die Mitarbeiter des Nachrichtendienstes die Stadt wählen können, in welcher die gesuchte Person wohnt und anschließend die Person selber. Die Antwort des Systems soll der momentane Aufenthaltsort sein. Teilaufgabe 9 – Demnid Das Meinungsforschungsinstitut DEMNID gibt jede Woche eine Top-Ten Liste heraus, auf der die 10. 'reiselustigsten' Städte aufgeführt sind, d.h. aus welchen Städten die meisten Bürger geflogen sind und wie viel. Teilaufgabe 10 – Catering Der Cateringservice einer Fluggesellschaft möchte wissen, wie viele Personen mit einem Flug reisen um entsprechende Anzahl Brötchen, Saftflaschen und Servietten zu bestellen. Zusätzlich muss für die Passagiere der gehobeneren Klassen Sekt bestellt werden. Das Interface soll die Menge bzw. Stückzahl der zu bestellenden Brötchen, Servietten, Saft –und Sektflaschen natürlich gleich errechnen. Die Arbeit sollte funktional, optisch ansprechend, leicht und intuitiv bedienbar sein. Ein mögliches Design zeigen die Abbildungen 13 und 14. 29 Abbildung 13 Abbildung 14 30 4. Wichtige Hinweise 4.1. FAQ • Aktuelles Datum Da die Datenbank nicht aktualisiert wird, beziehen sich alle fiktiven Datensätze auf einen Zeitraum im Oktober 2001. Für die Bearbeitung der Aufgaben kann ein sinnvolles beliebiges Datum als „aktueller“ Zeitpunkt frei gewählt werden. • Timestamp Zur Abfrage eines Microsoft ACCESS Datentyp eingeschlossen werden. Zum Beispiel: timestamp muss dieser Wert in # SELECT * FROM Flight WHERE time > “#2001-10-12 17:12:23#” • Spaltenname from in der Tabelle Flight Zur Unterscheidung des Feldnames from in der Tabelle Flight und dem Schlüsselwort aus der SQL-Sprache ist es notwendig, die vollständige Feldbezeichnug anzugeben: SELECT flight.from FROM Flight WHERE ... oder ein Alias zu verwenden: SELECT f.from FROM Flight AS f WHERE ... 31 FROM 4.2. Test der Logins an den Rechnern des Komplexpraktikums Für den Zugriff auf die Praktikums-Server am Lehrstuhl Rechnernetze stehen im FRZ folgende Tools zur Verfügung: 1. Windows XP: Remotdesktopverbindung 2. Windows 2000: Terminaldienstclient a) Zum Aufbau der Verbindung ist der gewünschte Servername anzugeben und die Verbindung herzustellen (Abb.15). Abbildung 15 Der Alias für den Server des Databaseversuches lautet: „PRAKTIKUM-1.inf.tu-dresden.de“. Jedoch wird in der Einführungsveranstaltung die genaue Adresse nochmals bekannt gegeben. b) Eingabe des Nutzernamen und des vorläufigen Passwortes (Abb.16): Abbildung 16 Der Nutzername wird gebildet aus: „prak_“ und dem FRZ-Login {s1234567} und lautet 32 demzufolge prak_s1234567. Das Passwort wird bei der Einführungsveranstaltung bekannt gegeben. c) Bei dem ersten Login kommt die Aufforderung das gesetzte Passwort zu ändern (Abb.17). Abbildung 17 d) Danach sollte getestet werden, ob Schreibrechte für das Verzeichnis bestehen, z.B. durch Anlegen des Ordners „Lösungen“ mit den Unterordnern für die Lösungen der gewählten Praktikumsversuche. e) WICHTIG ! Beenden Sie eine Sitzung niemals nur durch ein Disconnect. Dadurch werden die laufenden Programme nicht beendet, sondern die Sitzung nur unterbrochen. Wenn das mehrere Nutzer machen, führt das zu vielen parallelen Sitzungen und damit zu einer hohen Last auf den Rechnern. Dadurch wird die Arbeit aller Nutzer behindert (Abb.18). 33 Abbildung 18 f) Aus diesem Grund immer mittels Start / Beenden / Abmelden eine Sitzung schließen. Nach 24 Stunden Laufzeit werden Sitzungen vom Administrator ohne Ankündigung beendet (Abb.19). Abbildung 19 34 Literatur [1] Thomas Münze. Lehrbuch Selfhtml http://www.teamone.de/selfhtml [2] Die Webseite von XAMPP http://www.apachefriends.org [3] Eine Einführung in SQL http://www.sql-und-xml.de/sql-tutorial/index.html [4] Die Webseite von MySQL http://dev.mysql.com [5] Eine Einführung in PHP und MySQL http://www.schattenbaum.net/php/ [6] Die Webseite des Lehrstuhl Rechnernetze an der TU-Dresden [7] Die Webseite des Komplexpraktikum Rechnernetze 35