Kostenlos oder kommerziell ? das ist hier die Frage Halbjahresarbeit Thema: Vergleich der serverseitigen Skriptsprachen ASP und PHP von Johannes Borgwardt Inhaltsverzeichnis 1. Einleitung 2. Geschichte 2.1. Geschichte der Skriptsprache PHP 2.2. Geschichte der Skriptsprache ASP 3. Nutzen und Anwendungsmöglichkeiten 4. Vergleiche 4.1. Formularauswertung 4.2. Schleifen 4.2.1. if – else – Schleife 4.2.2. while – Schleife 4.2.3. for – Schleife 4.2.4. case – Schleife 4.2.5. Zusammenfassung - Schleifen 4.3. Verbindung zu Datenbanken 4.4. Funktionen und Prozeduren 4.5. Zusammenarbeit zwischen Dateien 4.6. Vergleich bei einer komplexeren Anwendung 5. Zusammenfassung 6. Anhang 7. Quellen -2- 1. Einleitung Im 2. Halbjahr des Schuljahres 2000/2001 habe ich am Wahlfach „Informatik & Astronomie“ teilgenommen. In diesem Halbjahr habe ich HTML1 erlernt. Seitdem interessiere ich mich für Webdesign und das Erstellen von Webseiten und Webinhalten. Vor cirka einem Jahr, Ende 2. Halbjahr des Schuljahres 2001/2002, habe ich mich der Homepage-AG angeschlossen die die Schulhomepage verwaltet und seit diesem Schuljahr leite ich diese AG. Die Idee zu dieser Arbeit entstand Im Dezember 2003 als eine AG gegründet wurde die sich mit dem Programmieren dynamischer Webinhalte beschäftigt. Dank der Teilnahme an dieser AG habe ich ASP2 erlernt. Seitdem stelle ich mir die Frage wo der Unterschied zwischen ASP und PHP3 liegt. Um dies zu ergründen schreibe ich diese Arbeit. In folgenden Texten möchte ich die Unterschiede zwischen PHP und ASP herausfiltern und mehrer direkte Vergleiche ziehen. Ich werde mich mit der Entwicklungsgeschichte beider Skriptsprachen beschäftigen, mit dem Nutzen und den Anwendungsbereichen beider Sprachen und mit einer Menge Vergleiche auseinandersetzen. Um alle Vergleiche selbst zu skripten habe ich mir im Rahmen dieser Arbeit zusätzlich PHP beigebracht, denn ich bin der Meinung das man Vergleiche nur dann anführen kann wenn man sich in den zu vergleichenden Kategorien auskennt. 2. Geschichte Als das World Wide Web (WWW) 1991 gegründet wurde war jeglicher Inhalt auf Webseiten statisch, er konnte also nicht dynamisch verändert werden. Der einzige der den Inhalt verändern konnte war der Verwalter der Webseite, der Webmaster. Der durch das World Wide Web gegebenen Versuchung auf eine schier unendliche Anzahl von Information zugreifen zu können konnten viele nicht widerstehen. Da die NutzerGemeinschaft des World Wide Web stetig größer wurde mussten neue Technologien entwickelt werden um Informationen darzustellen. Unternehmen wollten sich im Web präsentieren und dazu musste der Inhalt an den Nutzer angepasst werden, der Inhalt von Webseiten musste dynamisch werden. 1 Hypertext Marked Language Active Server Pages 3 PHP: Hypertext Preprocessor 2 -3- 1993 wurde CGI (Common Gateway Interface) veröffentlicht. Mit Hilfe von CGI konnten Webseiten dynamische Inhalte vermitteln, man konnte abhängig von festlegbaren Faktoren steuern was für Informationen ausgegeben werden. Das war ein großer Fortschritt, nur gab es ein kleines Problem mit CGI. CGI Skripte mussten in einer Programmiersprache geschrieben werden, die beiden Populärsten Programmiersprachen zu dieser Zeit waren C und Perl. Da diese Programmiersprachen sehr komplex sind war es nicht sehr einfach CGI Skripte zu erstellen. Nur wenige Administratoren beherrschten C oder Perl, und sie waren auch nicht bereit eine so komplexe Programmiersprache zu erlernen nur um beispielsweise das Datum auf ihren Seiten ausgeben zu können. Mit der Zeit wurden neue Technologien und Möglichkeiten zur dynamischen Ausgabe von Daten und Informationen gesucht und gefunden. 2.1. Geschichte der Skriptsprache PHP 1995 entwickelte der 17jährige Däne Rasmus Lerdorf eine Sammlung von Perlskripten mit der man Zugriffe auf Webseiten erfassen konnte, diese Sammlung nannte er PHP/FI, das steht für „Personal Home Page (Tools) / Forms Interpreter“ oder für „Professional Homepage“ (es gibt unterschiedliche Angaben). Lerdorf entschied sich PHP/FI im Sinne der Debian Free Software Guidelines4 freizugeben. Damit war der Grundstein für die Weltweite Verbreitung dynamisch generierter Webseiten gelegt. Schon bald musste die Funktionalität von PHP/FI erweitert werden, so musste zum Beispiel die Kommunikation mit Datenbanken ermöglicht werden, da Perl dies nicht leisten konnte entwickelte Lerdorf eine neue Version die mit der Programmiersprache C erstellt wurde. Die neue Version besaß eine Perl ähnliche Syntax und war in der Lage mit Datenbanken zu kommunizieren und Formulare auszuwerten, sie war leider relativ instabil. Im November 1997 wurde PHP/FI 2.0 offiziell veröffentlicht, die Software wurde auf rund 50.000 Webseiten eingesetzt. Obwohl PHP/FI 2.0 schon von mehreren Programmierern erstellt wurde leistete Lerdorf immer noch den größten Teil. Schon kurz nach der Veröffentlichung von PHP/FI 2.0 wurde die erste Alpha Version von PHP3 ausgearbeitet. 4 siehe http://www.de.debian.org/social_contract.de.html#guidelines -4- Ebenfalls 1997 begannen Andi Gutmans und Zeev Suraski in Kooperation mit Rasmus Lerdorf PHP/FI 2.0 umzubauen, das Ergebnis mit dem Namen PHP3 wurde als offizieller Nachfolger angekündigt. Das Projekt sollte unter einem neuen Namen veröffentlicht werden Als neuer Name wurde PHP gewählt, das für "Hypertext Preprocessor" steht. Nach einer neunmonatigen öffentlichen Testphase wurde PHP 3.0 im Juni 1998 veröffentlicht. Ende 1998 wurde PHP3 von mehreren Zehntausend genutzt, cirka 10% aller Webseiten nutzen PHP3, dieser Erfolg lässt sich durch die gute Infrastruktur und Erweiterbarkeit erklären, viele Nutzer trugen mit eigenen Modulen zur Verbreitung bei, aber auch die gute Anbindung an eine Vielzahl von Datenbanken trug zum Erfolg von PHP3 bei. Kurz nach der Veröffentlichung begannen Gutmans und Suraski mit der Weiterentwicklung von PHP3. Ziel war es den PHP-Kern umzuschreiben um die Leistungsfähigkeit zu erhöhen und einen modulareren Quelltext zu erhalten. Die neue PHP-Version sollte auf einer neuen Engine aufbauen, der „Zend“-Engine, der Name setzt sich aus den Vornamen Zeev und Andi zusammen. 1999 wurde die neue Engine das erste mal eingesetzt, ein Jahr später wurde PHP4 veröffentlicht. PHP4 wird von mehreren Hunderttausend Entwicklern genutzt und kommt auf mehreren Millionen Webseiten zum Einsatz, schätzungsweise 20% aller Webseiten. An der neuen Engine „Zend2“ und an PHP5 wird bereits gearbeitet. Da PHP konstant von einer großen Menge Entwicklern weiter entwickelt wurde und wird gehört es heute zu einem der größten Durchbrüche im Bereich der dynamischen Webseitenentwicklung. 2.2. Geschichte der Skriptsprache ASP In Redmond, Washington, USA wurde 1996 von Microsoft ein neues Projekt mit dem Namen „Denali“ vorgestellt. Benannt nach einem Nationalpark in Alaska stellte Denali einen riesigen Durchbruch in der dynamischen Webseiten Generierung dar. So war es zum ersten mal möglich Inline-code zu verwenden, also Skriptcode in die bestehende HTML-Datei zu implementieren. -5- Denali stellte keine eigene Skriptsprache dar, es basierte auch nicht auf Perl oder C sondern auf Microsofts Skriptsprache Visual Basic Script (VBScript). VBScript ist der englischen Sprache nachempfunden und soll so die Anwenderfreundlichkeit erhöhen. Die Denali – Tester freundeten sich schnell mit der neuen Technologie an und noch im selben Jahr wurde Denali unter dem Namen Active Server Pages (ASP) veröffentlicht. Innerhalb von vier Jahren erschienen vier Versionen. In ASP 2.0 wurde es vereinfacht externe Objekte einzubinden. In ASP 3.0 wurde der Debugger verbessert um eine verbesserte Fehlerkontrolle zu gewährleisten. Außerdem wurde das Buffer-System verbessert wodurch ASP Seiten schneller geladen wurden. ASP wird mit dem Server Produkt von Microsoft vertrieben, dem „Internet Information System“ (IIS) auch dieses Produkt wurde in den 4 Jahren oft verändert und ASP blieb von diesen Veränderungen nicht verschont. Zusätzlich gab es eine Vielzahl an kleineren Veränderungen die hier nicht aufgezählt werden, da sie nicht weiter wichtig sind. Die neueste Version heißt ASP.NET, da sie von der breiten Masse noch nicht genutzt wird beziehe ich mich weiterhin auf ASP 3.0. 3. Nutzen und Anwendungsmöglichkeiten In Bezug auf den Nutzen und die Anwendungsmöglichkeiten der Skriptsprachen PHP und ASP stellt sich nicht die Frage ob beide Skriptsprachen genutzt werden sondern wie sie genutzt werden, also wo die besten Anwendungsmöglichkeiten liegen. Da beide Skriptsprachen für die gleichen Bereiche genutzt werden lohnt es nicht hier eine Unterscheidung zu treffen, nach eigenen Beobachtungen bin ich jedoch zu dem Schluss gekommen das ASP eher von Firmen beziehungsweise Webseiten mit einem kommerziellen Interesse und PHP von Webseiten genutzt wird deren Betreiber kein oder geringeres Eigenkapital haben. Der hauptsächliche Zweck der Skripte ist die Erstellung dynamischer Inhalte, das schließt ein riesiges Anwendungsspektrum ein. Zu diesem Spektrum gehört ein personalisiertes Webangebot also zum Beispiel an den Leser angepasste News, Newsgroups, Termine und sonstige Informationen aber auch an den Nutzer angepasste Werbung gemeint. -6- Eine sehr gute Anbindung an Datenbanken ist die am meisten genutzte Anwendungsmöglichkeit da man somit ganze Einkaufsysteme mit Artikellisten und Lagerbeständen anfertigen kann. Ein Anwendungsbereich der mehr unbeäugt bleibt und doch sehr wichtig ist, ist die Auswertung und das senden von Formularen. Aber auch der Versand von eMails oder die Kontrolle falscher Datenausgaben ist ein Anwendungsschwerpunkt. 4. Vergleiche Im folgenden Kapitel möchte ich anhand von konkreten Anwendungsbeispielen direkte Vergleiche ziehen. Zu erst werde ich ein einfaches Formular auswerten, dann möchte ich verschiedene Schleifenarten vergleichen und schließlich mit dem wichtigsten Anwendungsbereich, der Arbeit mit einer Datenbank und der Funktionsweise zwischen Dateien. Mit einer schwierigeren Problemstellung, der Funktionsweise eines dynamischen Loginscript möchte ich das Gebiet der Komplexität der Sprachen und damit die direkten Vergleiche abschließen. 4.1. Formularauswertung Mit dem Formular soll man raus finden ob ein Suchtext in einer angegebenen Suchmenge vorhanden ist, die Suchmenge lege ich hier in einem Array 5 fest, im Normalfall würde man die Suchmenge in einer Datenbank speichern aber das würde dieses Beispiel zu sehr koplizieren. Um ein Formular auswerten zu können wird zuerst ein Formular benötigt, dazu benötigt man nur HTML, jedoch muss man festlegen mit welcher Skriptsprache man das Formular bearbeiten möchte, ich beginne mit PHP: formular.html: (1) (2) (3) (4) (5) 5 <html> <head> <title> Formular </title> </head> <body> Ein Array ist eine Art Container in der man einer Variable mehrere Werte zuweisen kann. -7- (6) (7) (8) (9) (10) (11) (12) <form action=’formauswert.php’ method=’post’> Suchtext: <input type=’text’name=’suchtext’> <br> <input type=’submit’ name=’submit’ value=’Suche starten’> </form> </body> </html> Dieses Formular hat mit dynamischem Inhalt natürlich noch nichts zu tun. es werden lediglich die eingetragenen Werte an die in Zeile 6 mit dem Attribut ACTION angegebene Datei geschickt. Graphisch sieht dieses Formular so aus: Damit gewinnt man zwar keinen Designerwettbewerb aber es erfüllt genau den Zweck den ich hier verdeutlichen will. Ich komme nun zur formauswert.php an die der angegebene Suchtext übermittelt wird: (1) <?php (2) $suchmenge = array('Heinz', 'Klaus', 'Alfred', 'Karl', 'Hannes'); (3) for($i = 0; $i<5; $i++) (4) { (5) if($suchmenge[$i] == $_POST['suchtext']) (6) { (7) echo($_POST['suchtext'] . "ist Bestandteil der Suchmenge und (8) steht an" . $i . "ter Stelle"); (9) } (10) else (11) { (12) echo($_POST['suchtext'] . "ist nicht Bestandteil der (13) Suchmenge"); (14) } (15) } (16) ?> Zuerst wird mit der Funktion array() ein Feld erstellt in dem 5 Vornamen gespeichert werden. Dann wird mit einer for – Schleife (siehe Abschnitt 4.1.2.3.) für jedes Element des Arrays geprüft ob das gerade gewählte Element mit dem gesuchten Text übereinstimmt, diese Überprüfung geschieht mittels einer if – Schleife (siehe Abschnitt 4.1.2.1.). Die Variable $_POST[´suchtext´] ist ein automatisch generiertes Array das erstellt wird wenn ein Formular abgeschickt wird, es beinhaltet alle Informationen die das Formular übermittelt. Die Variable $i ist eine einfache Laufvariable. Per echo Befehl wird -8- in Form von Text ausgegeben ob der gesuchte Text Teil des Arrays ist oder nicht. Der Punkt im echo Befehl dient als Verbindung zwischen Strings (Stringconnector). Nun im Vergleich dazu die ASP-Variante, die HTML muss dazu nur geringfügig verändert werden. Die einzige Veränderung die Vorgenommen werden muss ist die Änderung der Dateiendung im ACTION Attribut von „.php“ in „.asp“. Hier nun die formauswert.asp (1) <% (2) Dim suchmenge(4) (3) Dim suchtxt (4) Dim i (5) suchtxt = request.form("suchtext") (6) suchmenge = Array('Heinz', 'Klaus', 'Alfred', 'Karl', 'Hannes') (7) for i = 0 to i = 4 (8) if suchmenge[i] = suchtxt (9) response.write(suchtxt & " ist Bestandteil der Suchmenge und" &_ (10) "steht an " & i & "ter Stelle") (11) else (12) response.write(suchtxt & " ist nicht Bestandteil der Suchmenge") (13) end if (14) next (15) %> Am Anfang werden hier die Variablen definiert, dies geschieht mit dem Befehl Dim. Die Variablendeklaration ist zwar nicht zwingend notwendig bietet sich jedoch an da es ohne zu Fehlern kommen kann. Das Array wird in Zeile 2 deklariert und es werden 5 mögliche Array-Werte reserviert (0 bis 4), in Zeile 6 wird das Array mit Datensätzen gefüllt. In Zeile 5 wird das Ergebnis aus dem Formular in einer Variable gespeichert, dies geschieht nicht wie bei PHP automatisch. Ansonsten funktioniert alles wie bei PHP, nur die Befehle sehen etwas anders aus, so wird eine Schleife nicht mit geschweiften Klammern sondern mit direkten Schleifentyp spezifischen Befehlen eingeleitet und beendet. Als Strtingconnector dient hier ein &-Zeichen. Ein Nachteil von ASP ist das wenn ein Befehl über eine Zeile geht beide Teile mit einer &_-Zeichenkombination verbunden werden müssen. Ein Vorteil gegenüber PHP ist das ein Befehl nicht mit einem Semikolon beendet werden muss, welches man erfahrungsgemäß oft vergisst. -9- 4.2. Schleifen 4.2.1. if – else – Schleife Die if – else – Schleifen beider Sprachen wurden zwar schon in Abschnitt 4.1.1. gezeigt sollen hier aber noch mal erläutert werden. Eine if – else – Schleife ist in Wirklichkeit keine Schleife da sie nur einmal durchlaufen wird, sie ist vielmehr eine Art Kreuzung, eine Entscheidungsfrage der Form „Wenn der gewählte Parameter zutrifft dann tue das andernfalls tue jenes“. Dabei ist zu beachten das der zweite Teil (andernfalls tue jenes) beziehungsweise else optional ist. In PHP sieht eine if – else – Schleife wie folgt aus: (1) (2) (3) (4) (5) (6) (7) (8) if(Parameter) { tu irgendetwas } else { tu etwas anderes } Parameter steht hier für die Bedingung von der die if – else – Schleife abhängt. Das Semikolon am Ende der if – else – Schleife ist optional, es kann jedoch zu schweren Fehlern kommen wenn man das Semikolon setzt und die if – else – Schleife sich in einer anderen Schleife befindet. Die Anweisungen in Zeile 3 beziehungsweise 7 sind natürlich nur symbolisch und erfüllen keinerlei Zweck. Die Anweisungen was getan werden soll wenn eine Bedingung greift oder gegebenenfalls nicht stehen geschweiften Klammern, das hat den Nachteil das wenn mehrere Schleifen in einander verschachtelt sind man schnell die Übersicht verliert. Vor allem da der PHPParser keine Fehlermeldung der Art Ende der Anweisung nicht gefunden sondern das ihm eine Variable fehlt. Dazu der ASP Vergleich: (1) if Parameter then (2) tu irgendetwas (3) else - 10 - (4) tu etwas anderes (5) end if Abgesehen von den Befehlen der if – else – Schleife ist hier alles gleich. Es ist zu beachten das diese Befehle vom Typ der Schleife abhängig sind, jeder Schleifentyp hat eigene Befehle, das hat den Vorteil das man die Schleifen nicht verwechseln kann wenn man sie in einander verschachtelt, nicht wie bei PHP wo jede Schleifenanweisung in geschweiften Klammern steht. 4.2.2. while – Schleife while – Schleife mit PHP umgesetzt: (1) while(Parameter) (2) { (3) tu etwas (4) } Da wo Parameter steht kommt dann eine Bedingung hin, dies bestimmt wann die while – Schleife ausgeführt werden soll. Wenn die Bedingung true ergibt, wird der Schleifen-Teil ausgeführt, wenn die Bedingung false ergibt, wird der Schleifen-Teil logischerweise nicht ausgeführt. Wenn PHP am Ende angekommen ist springt es wieder zu while(Parameter) und prüft die Bedingung nach. Wenn diese wieder true ist wird wieder der Schleifen-Teil ausgeführt. Nach dem Ende des Schleifenteils prüft PHP wieder die Bedingung. Wenn diese true ist wird wieder der Schleifenteil ausgeführt. PHP führt also solange den Schleifenteil aus solange die Bedingung true ergibt. While ist Englisch und bedeutet während, in der Programmiersprache eher solange. "Solange die Bedingung wahr/true ist, führe den Schleifen-Teil aus". Die Bedingung sollte kein konstanter Ausdruck sein, sondern ein Ausdruck mit Variablen, deren Inhalt sich in der while – Schleife ändert. Denn sonst kann es passieren dass eine Endlosschleife entsteht, die nicht aufhört, bis der Webserver das Script nach 30 Sekunden automatisch beendet. PHP kennt zusätzlich noch eine do – while – Schleife: (1) do - 11 - (2) { (3) tu irgendetwas (4) } (5) while(Parameter); Das Semikolon hinter dem while ist notwendig, bei der normalen while – Schleife ist es, wie bei der if – Schleife, unerwünscht. Der Unterschied der do – while – Schleife zur while – Schleife ist der, dass die do – while – Schleife mindestens 1 mal ausgeführt wird, da die Überprüfung der Bedingung erst am Schleifenende erfolgt. Wenn in der Bedingung false steht, wird diese Schleife genau 1 mal durchgeführt. Die Benutzung einer do – while – Schleife kommt in einem PHP-Projekt nicht so häufig vor, wenn nicht sogar gar nicht. Bei der while – Schleife spricht man von einer Kopfgesteuerten – while – Schleife und bei einer do – while – Schleife von einer Fußgesteuerten – while – Schleife. Bei ASP beziehungsweise VBScript heißt die while – Schleife do – loop – Schleife. Wieder gibt es eine Kopf- und eine Fußgesteuerte Variante. Wichtig im Vergleich zu PHP ist das es hier nicht nur die Möglichkeit while (solange etwas gilt) sondern auch die Möglichkeit until (bis etwas nicht mehr gilt) gibt, dabei muss man einfach das while durch ein until ersetzen und den Parameter, die Bedingung, anpassen. Ich beginne mit der Kopfgesteuerten – do – loop – Schleife: (1) do while Parameter (2) tu irgendetwas (3) exit do (4) tu wieder etwas (5) loop Die „exit do“ Anweisung ist optional, sie wird ausgeführt wenn der Parameter ein false ergibt. Nun die Fußgesteuerte – do – loop – Schleife: (1) do (2) tu irgendetwas (3) exit do (4) tu wieder etwas (5) loop while Parameter Hier steht die Überprüfung wieder am Ende, also wird die Schleife mindestens einmal ausgeführt. - 12 - Die Möglichkeit statt while ein until zu nutzen hat gegenüber PHP durchaus Vorteile da PHP hierzu noch mehr Schleifen benötigt die sich auf die Ausführgeschwindigkeit auswirken. 4.2.3. for – Schleife Die for – Schleife benutzt man sehr häufig wenn man einen Programmcode genau x – mal ausführen lassen möchte. Der Aufbau der for – Schleife ist wie folgt: (1) for(Startanweisung; Bedingung; Durchlaufanweisung) (2) { (3) tu etwas (4) } Diese Schleife wird auch wieder nur solange ausgeführt solange die Bedingung erfüllt ist. Dies ist also wie eine while – Schleife. Sie hat aber noch ein paar extra Felder, in die man Anweisungen hinein schreiben kann. In das Feld Startanweisung kommt eine Anweisung die 1 mal ausgeführt wird, nämlich beim starten der for – Schleife. Diese Anweisung wird auch ausgeführt, wenn die Bedingung schon vor dem Schleifeneintritt false ist. An der Stelle Durchlaufanweisung kommt eine Anweisung die bei jedem Schleifendurchlauf ausgeführt wird. Diese Anweisung wird immer vor einem nächsten Schleifendurchlauf ausgeführt (außer beim 1. Durchlauf). Eine Typische Anwendung für eine for – Schleife ist diese hier: (1)<?php (2) for($i=0; $i<5; $i++) (3) { (4) echo("Die Zahl ist ".$i."<br>"); (5) } (6)?> Dieser Code gibt folgendes aus: Die Zahl ist 0 Die Zahl ist 1 Die Zahl ist 2 Die Zahl ist 3 Die Zahl ist 4 - 13 - Hier wird zuerst die Startanweisung ausgeführt, die Variable $i wird initialisiert und auf 0 gesetzt. Dies ist die so genannte Laufvariable für die for – Schleife. Mit ASP umgesetzt sieht das so aus: (1) for Startanweisung to Bedingung (2) tu etwas (3) next Für obiges Beispiel sieht die ASP – Variante so aus: (1) (2) (3) (4) (5) <% for i = 0 to i = 4 response.write("Die Zahl ist " & i & "<br>") next %> Die Ausgabe in Browser ist exakt dieselbe. Im Vergleich zu PHP fehlt hier die Eingabe der Durchlaufanweisung, diese funktioniert automatisch, das heißt das bei jedem Schleifendurchlauf die Variable i um eins erhöht wird. 4.2.4. case – Schleife Die case – Schleife ist eine Kontrollstruktur wie die if – Schleife. Sie führt nur bestimmte Programmteile aus, wenn bestimmte Bedingungen erfüllt sind. Doch eine case – Schleife macht nur bei Vergleichen von Ausdrücken und Variablen Sinn. Wenn der Ausdruck oder die Variable den Wert xy hat, dann wird der Teil abc ausgeführt, wenn der Wert ghj ist, wird ein anderer Teil ausgeführt. Mit if – Schleifen würde das so aussehen: (1) <?php (2) $name = 3; (3) if($name = = 0) (4) echo("Der Wert der Variable ist 0"); (5) if($name = = 1) (6) echo("Der Wert der Variable ist 1"); (7) if($name = = "hi") (8) echo("Der Wert der Variable ist hi"); - 14 - (9) if($name = = 3) (10) echo("Der Wert der Variable ist 3"); (11)?> Eine case – Schleife ist etwas anders aufgebaut als mehrere if – Schleifen, hat aber auch Vorteile gegenüber if – Schleifen denn bei einer case – Schleife steckt alles in einer Schleife, das erhöht die Übersicht. Eine case – Schleife ist wie folgt aufgebaut: (1) switch(Variable) (2) { (3) case Ausdruck: (4) tu etwas (5) case Ausdruck: (6) tu etwas anderes (7) }; Variable steht hier für die Variable die man überprüfen möchte, In den geschweiften Klammern kommen dann die Zeilen „case Ausdruck:“. Der PHP-Interpreter durchläuft dann jedes case und springt dort hin wo der Inhalt der Variable gleich dem Ausdruck hinter case ist und arbeitet dort stehenden Code ab. Wenn eine Übereinstimmung gefunden wurde werden alle nachstehenden case – Befehle mit abgearbeitet, dies kann man verhindern indem man vor jedes case, mit Ausnahme des ersten, ein „break;“ schreibt, mit diesem Befehl wird die Schleife vorzeitig abgebrochen. Das war die case – Schleife für PHP nun das ASP äquivalent: (1) select case Variable (2) case Ausdruck (3) tu etwas (4) case Ausdruck (5) tu etwas anderes (6) end select Hier wird kein break oder ähnliches benötigt, bei VBScript beziehungsweise ASP wird automatisch nur das case ausgeführt bei dem der Ausdruck übereinstimmt. - 15 - 4.2.5. Zusammenfassung – Schleifen In Bezug auf Schleifenn und Kontrollstrukturen kann man zusammenfassend sagen das Schleifen mit ASP etwas komfortabler umsetzbar sind während man mit PHP mehr selbst definieren kann und muss. Wer also schnell etwas unkompliziertes skripten will der sollte auf ASP zurückgreifen, wer selbst viel selbst definieren will oder sehr komplexe Schleifen brauch der wird PHP bevorzugen. 4.3. Verbindung zu Datenbanken Das wichtigste was Skriptsprachen zu leisten haben ist das auslesen von Informationen aus Datenbanken. Wegen Softwareproblemen muss ich die Vergleichsbedingungen leicht verändern, als Server mit PHP Unterstützung nutze ich die Software easyPHP, in diesem Softwarepaket ist ein Apache Server sowie MySQL-Datenbank Unterstützung integriert. Für die ASP Unterstützung benutze ich den in Windows integrierten IIS (Internet Information System), dieser beinhaltet keine MySQL Unterstützung. Deshalb nutze ich hier eine Microsoft Access Datenbank. Ich beginne wieder mit PHP (und MySQL): (1) (2) (3) (4) (5) $dbhost="localhost"; $dblogin="root"; $dbpwd=""; $dbname="halbjahresarbeit"; mysql_connect($dbhost, $dblogin, $dbpwd); mysql_select_db($dbname) or die("Verbindung zur Datenbank ist fehlgeschlagen"); Die Variablen $dbhost, $dblogin und $dbpwd definieren die Logindaten für den MySQL Server. $dbname definiert die Datenbank auf dem Server zu der die Verbindung aufgebaut werden soll. In Zeile 3 wird die Verbindung zum MySQL Server aufgebaut, man könnte statt den Variablen auch direkt die Daten in Form von Strings eintragen. In Zeile 4 wird die Datenbank ausgewählt, falls die Datenbank nicht existiert oder keine Verbindung hergestellt wurde wird die Verbindung zum MySQL Server beendet und die Fehlermeldung „Verbindung zur Datenbank ist fehlgeschlagen“ ausgegeben. Anschließend kann man sich die aus der Datenbank auslesen lassen: - 16 - (1) $sql = "SELECT (2) kleidung, (3) farbe (4) FROM (5) beispiel_db;"; (6) $result = mysql_query($sql); (7) while($row = mysql_fetch_assoc($result)) (8) { (9) echo($row['kleidung'] . " --> " . $row['farbe'] . "<br>"); (10) } Die Ausgabe sieht dann so aus(abhängig von den Daten in der Datenbank): Kleid --> blau Hose --> rot Hemd --> grün Die Funktionsweise ist sehr einfach, in der Variable $sql wird ein String gespeichert der die Anweisungen an die Datenbank enthält, mit der Funktion mysql_query, an die wir den String übergeben der dann als Befehl interpretiert wird, wird der Inhalt der Spalten „kleidung“ und „farbe“ aus der Tabelle „beispiel_db“ in ein Array geschrieben das ich $result nenne. In dem Array sind die Daten zwar gespeichert jedoch noch nicht nutzbar, mit der Funktion mysql_fetch_assoc wird das Array „aufbereitet“, mit einer while – Schleife gebe ich das Array einfach aus. Das gleiche nun für ASP: (1) strAccessDB = "beispiel" (2) Set adoCon = Server.CreateObject("ADODB.Connection") (3) strCon = "DRIVER={Microsoft Access Driver (*.mdb)};uid=;pwd=; DBQ=" &_ (4) & Server.MapPath(strAccessDB) (5) adoCon.Open strCon (6) strSQL = "SELECT tblbeispiel.id, tblbeispiel.kleidung, tblbeispiel.farbe" &_ (7) "FROM tblbeispiel" (8) Set rsquery = Server.CreateObject("ADODB.Recordset") (9) rsquery.Open strSQL, strCon (10) for rsquery("id") = 1 to rsquery.EOF (11) response.write(rsquery("kleidung") & " --> " & rsquery("farbe") &_ (12) & "<br>") (13) next Das sieht erstmal kompliziert aus, ist es auch ! - 17 - Zu erst speichere ich den Namen der MS Access Datenbank als String. Danach kreiere ich ein Objekt mit dem Namen adoCon6, in die Variable strCon speichere ich alle Daten die benötigt werden um eine Datenbankverbindung zu erstellen. Anschließend wird die Verbindung zur Datenbank aufgebaut. In der Variablen strSQL steht wieder in Form eines Strings alle Informationen für die Datenbankabfrage. In Zeile 8 wird noch eine ADO Komponente erstellt Mit der ich in Zeile 9 die relevanten Daten aus der Datenbank auslese. Die Ausgabe erfolgt hier mit einer for – Schleife die alle Zeilen von der ersten bis zum Ende der Datei (EOF = end of file) ausgibt. Die Verbindung zu Datenbanken ist wohl das wichtigste bei der Arbeit mit dynamischen Webseiten, PHP hat dies sehr einfach und übersichtlich gelöst. Die ASP Variante ist sehr schwierig, das mag zwar auch daran liegen das es sich hierbei nicht um eine Datenbankverbindung zu einem Datenbankdienst handelt aber trotzdem ist es doch sehr umständlich. PHP bietet hier eher eine Art Komplettpaket während ASP nur die Infrastruktur bietet in die man alles einarbeiten muss. 4.4. Funktionen und Prozeduren Im letzten Abschnitt tauchten bereits ein paar Funktionen auf, beide Scriptsprachen geben die Möglichkeiz Funktionen zu schreiben, ASP gibt darüber hinaus noch die Möglichkeit Prozeduren zu schreiben. Der Unterschied zwischen einer Funktion und einer Prozedur ist folgender: An eine Funktion werden Variablen übermittelt mit denen etwas getan wird und ein Ergebnis zurück kommt. Eine Prozedur ist eher eine Art Unterprogramm, Prozeduren sind praktisch um die Übersichtlichkeit in größeren Dateien zu gewährleisten. PHP besitzt keine Prozeduren, das Problem der Übersichtlichkeit wird anders gelöst, wie wird im nächsten Abschnitt erklärt. Hier ein Beispiel für eine PHP Funktion: (1) function addition($var1, $var2) 6 In ASP können kleinere Komponenten mit ADO(Active Data Objects) erstellt werden. Somit kann man zu jeder OLE-DB kompatiblen Datenquelle eine Verbindung aufbauen. - 18 - (2) (3) (4) (5) { $ergeb = $var1 + $var2; return $ergeb; }; Dies ist eine ganz einfache Funktion, sie addiert die Variablen $var1 und $var2 und gibt das ergebnis in einer neuen Variable zurück. Aufgerufen kann die Funktion mit nur einer Zeile werden: (1) $ergeb = addition($var1, $var2); Mit ASP funktionieren Funktionen ganz ähnlich: (1) function addition (var1, var2) (2) ergeb = var1 + var2 (3) addition = ergeb (4) end function Der einzige nennenswerte Unterschied ist der das der Rückgabewert nicht per return oder vergleichbarem definiert wird sondern damit das der Funktion der Wert zugewiesen wird. Das aufrufen funktioniert wie bei PHP. Des Weiteren bietet ASP noch Prozeduren oder Unterprogramme(Subprograms) diese funktionieren ähnlich: (1) sub gruss (username) (2) response.write("Hallo " & username) (3) end sub Wenn die Variable username beispielsweise Klaus ist würde die Prozedur „Hallo Klaus“ ausgeben. Aufgerufen wird die Prozedur so: (1) gruss(username) Prozeduren und Funktionen sind sehr praktisch, da sie den Schreibaufwand verringern und die Übersichtlichkeit fördern. PHP besitzt keine Prozeduren braucht diese jedoch nicht wie der nächste Abschnitt zeigt. - 19 - 4.5. Zusammenarbeit zwischen Dateien Bei großen Projekten ist es immer wichtig zu wissen wie Dateien zusammen agieren. PHP bietet hier ein sehr einfaches Prinzip, mit einem Befehl namens include kann man den Quelltext einer anderen Datei einfach in die aktuelle Datei einbinden. Der include Befehl ist ein äquivalent zu ASP Prozeduren. Der include Befehl wird wie folgt genutzt: (1) include("functions.php"); Hier würde der Quelltext der functions.php beim ausführen des Skriptes eingefügt. ASP hat nichts Vergleichbares zum include Befehl, es gibt allerdings die Möglichkeit direkt zu einer anderen Datei zu springen: (1) response.redirect("part2.asp") Mit diesem Befehl würde man zur part2.asp „weiter geschickt“ werden. 4.6. Vergleich bei einer komplexeren Anwendung Als komplexeres Anwendungsbeispiel beschreibe ich ein Loginscript mit Passwortkontrolle, für die PHP Variante nutze ich wieder eine MySQL Datenbank, für ASP eine Microsoft Access Datenbank Zu erst wird wieder ein HTML Formular als Eingabemaske benötigt: <html><head></head><body> <form action='login_check.php' method='post'> <table> <th> <td colspan='2'> <h2>login</h2> </td>\n"); </th>\n"); <tr>\n"); <td>\n"); Name: </td> <td> <input type='text' name='loginname'> - 20 - </td>; </tr> <tr> <td> Passwort: </td> <td>\n"); <input type='password' name='loginpasswort'> </td> </tr> <tr> <td colspan='2'> <input type='submit' name='submit' value='login'> </td> </tr> </table> </form> </body></html> Nun die PHP die das Passwort überprüft und falls es richtig ist zur login_index.php verlinkt: (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) <?php mysql_connect("localhost", "root", ""); mysql_select_db("halbjahresarbeit") or die("Verbindung zur Datenbank ist fehlgeschlagen"); $loginname = $_POST['loginname']; $loginpass = $_POST['loginpasswort']; $sql = "SELECT name, passwort FROM halbjahresarbeit_pwd WHERE name = '".$loginname."' AND passwort = MD5('".$loginpass."');"; $result = mysql_query($sql) OR die(mysql_error()); $row = mysql_fetch_assoc($result); if(isset($row)) { include("login_index.php"); } else { echo("falsche Logindaten <a href='login.html'>zur&uuml;ck</a>"); } ?> - 21 - Am Anfang, Zeile 2 bis 4, wird eine Verbindung zur Datenbank hergestellt (siehe 4.3.), in Zeile 5 und 6 werden die Variablen $loginname und $loginpass aus dem automatisch generiertem Array extrahiert, denn MySQL kann nicht mit Arrays arbeiten. In den Zeilen 7 bis 16 wird die Datenbank abgefragt, in der Tabelle wird nach einer Übereinstimmung zwischen dem Namen und dem Passwort gesucht, es ist zu beachten das das Passwort mit einem Algorithmus mit dem Namen MD5 verschlüsselt gespeichert wird, dies ist ein Einwegverschlüsselungs-Algorithmus, er kann nicht dekodiert werden, um aber das Passwort abzufragen wird die Eingabe aus dem Formular kodiert und dann werden beide Strings verglichen (Zeile 14). Für die ASP-Variante muss im HTML Formular nur die Dateiendung des ACTION Attributes von .php auf .asp geändert werden. Hier die ASP Variante: (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) <% loginname = Request.Form("loginname") strAccessDB = "halbjahresarbeit" Set adoCon = Server.CreateObject("ADODB.Connection") strCon = "DRIVER={Microsoft Access Driver (*.mdb)}; "&_ "uid=;pwd=; DBQ=" & Server.MapPath(strAccessDB) adoCon.Open strCon Set rsCheckUser = Server.CreateObject("ADODB.Recordset") strSQL = "SELECT tblpwd.Passwort FROM tblpwd"&_ "WHERE tblpwd.name ='" & loginname & "'" rsCheckUser.Open strSQL, strCon If NOT rsCheckUser.EOF Then If (Request.Form("loginpasswort")) = rsCheckUser("Passwort") Then response.redirect("login_index.asp") Else response.write("ungültiges Passwort<a href="&_ "login.html>zurück</a>") End If else response.write("ungültiger Name<a href= login.html>zurück</a>") End If %> Zu Beginn wird der loginname aus den Formulardaten extrahiert, die Zeilen 3 bis 11 stellen eine Datenbankverbindung her (siehe 4.3.) es wird das Passwort ausgefiltert das zum Namen des im Formular eingetragenen Namen gehört. Wenn eine Übereinstimmung gefunden wurde wird das Passwort mit dem aus dem Formular verglichen und der Browser bekommt die Anweisung zur login_index.asp zu springen. - 22 - Beide Skripte ähneln sich stark, doch haben Tests ergeben das das PHP Skript ca. 1 Sekunde und bei stark belastetem Arbeitsspeicher des Servers ca. 3 Sekunden schneller ist. Ein Nachteil am ASP Skript ist das man das Passwort nicht so einfach verschlüsseln kann wie bei PHP. 5. Zusammenfassung ASP und PHP sind zwei serverseitige Skriptsprachen die dynamische Webinhalte generieren. Beide Sprachen entstanden als die Technologie und die Entwicklung des World Wide Web noch in den Kinderschuhen steckte, beide Sprachen ähneln sich stark und werden auf den selben Gebieten benutzt. Doch es gibt auch eine große Zahl an Unterschieden. Die Vergleiche in Kapitel 4 haben gezeigt das es in wichtigen Details wichtige Unterschiede gibt, so funktionieren Schleifen zwar ähnlich, jedoch sind die Schleifen in PHP etwas komplexer während die ASP-Schleifen komfortabler, anwenderfreundlicher und automatisierter sind. Des Weiteren haben alle Vergleiche gezeigt das ASP eigentlich nur eine Art Infrastruktur ist, es bietet grundlegende Funktionen, aber schwierigere Operationen muss man in Form von Modulen selbst einbinden. PHP dagegen ist ein Komplettpaket es enthält viele Funktionen die man nur sehr selten brauchen wird und obwohl PHP modular aufgebaut ist, ist es nicht so leicht zu erweitern wie ASP. Man muss aber auch festhalten das PHP eine eigenständige Skriptsprache ist während ASP nur eine Visual Basic Version für das Internet ist, nämlich Visual Basic Script (oder VBScript). Im Nachhinein muss ich zugeben das dieses Thema für eine Halbjahresarbeit zu dünner Stoff ist, es bietet nicht genügend Tiefe und es gibt nur wenige Quellen und gute noch weniger. Als ich das erkannte war es leider schon zu spät um auf ein anderes Thema umzusatteln. Zu guter letzt möchte ich noch dem Projekt Memoria Myrana danken das mir die Möglichkeit gab mein frisch gewonnenes PHP Wissen umzusetzen. Mehrere Teile der Skripte und viele Erkenntnisse flossen in diese Arbeit ein. - 23 -