1. Plattformunabhängige PS: Java und PHP Kaffee aus Java Wie die Programmiersprache ihren Namen bekam ist umstritten. Die Legende sagt, dass die Firma Sun Mircosystems dabei an die armen Programmierer dachten, die sich nur mit jeder Menge Kaffee (= Java im amerkanischen Slang) bei der anstrengenden Arbeit wach halten können........... Unbestritten ist, dass Java bereits 1991 das „Licht der Welt“ erblickte. (Hier kann man übrigens sehen, dass die Grafik S.73 recht ungenau ist!). Somit ist die Sprache etwas jünger als Sie! Und da man Schüler des Gymnasiums mit Fug und Recht „jung“ nennen darf, gilt dies auch für Java. Denkt man. Aber alles ist relativ: Verglichen mit Pascal (1960) ist Java tatsächlich eine junge Sprache, - verglichen mit C# (2000) ist Java ein Methusalem! Der Anfang von Java war dornig. Die Firma Sun hatte eigentlich die Absicht, mit dem Projekt „Green“, eine Hochsprache für den Elektro-Consumer-Bereich (Fernsehn, Telefon, Kühlschrank !! ) zu entwickeln. Da waren sie wohl etwas zu früh dran, denn damals flopte der Markt in diesem Segment und man konnte nur auf bessere Zeiten hoffen. Die kamen. Allerdings anders als erwartet: Das Internet wurde von Sun als DIE Möglichkeit erkannt, ihre Programmiersprache nun doch noch einer sinnvollen Verwendung zuführen zu können und prompt bekam Green den neuen Namen Java. Die Ironie der Geschichte will, dass Java heute sehr wohl in dem anfangs geplanten Bereich zum Einsatz kommt. Und wenn Sie eines Tages einen Kühlschrank kaufen werden, der selbständig Milch beim Diskounter bestellt, dann können Sie fast sicher sein, dass er durch Java so intelligent ist. Was macht Java so erfolgreich? Im letzten Kapitel haben wir einige Eigenschaften von Java genannt, die da sind: • • • • • portabel und plattformunabhängig (weitestgehende) objektorientiert multithreaded sicher negativ: relativ langsam durch den Interpreter Diese Begriffe wollen wir etwas eingehender betrachten. Ein in C geschriebenes Programm für Windows läuft auch nach einer Neukompilierung des Quelltextes sehr wahrscheinlich nicht auf einem Betriebssystem, wie Linux. Es ist nicht portabel. Portabilität ist zwar keine Eigenschaft der Programmiersprache sondern des erstellten Programms. Im Ergebnis bleibt die Sache gleich: Ein 90 mit C geschriebenes Programm ist meist nicht portabel, - und damit bekommt C den schwarzen Peter. Um nicht unfair zu sein, sollte man erwähnen, dass C-Programme, die weder hardwareabhängige noch betriebssystemtypische Routinen aufrufen, vielleicht portabel sind....... Ein Javaprogramm ist im Gegensatz dazu nicht nur portabel sondern auch plattformunabhängig. Man benötigt auf dem Zielrechner keinen Compiler, lediglich eine virtuelle Maschine (VM) muss verfügbar sein. Dass die verfügbar ist, dafür sorgt Sun: Man bekommt sie kostenlos und sie ist für viele Seiten im Internet, aber auch für sehr viel Freeware unverzichtbar. Das „Javaprogramm“ liegt als Bytecode vor und die VM muss diese lediglich noch „interpretieren“. „Sicher“ ist Java, weil Java-Anwendungen nicht vom Betriebssystem gestartet werden, sondern in einer Art geschützten Umgebung (sand-box) laufen. Wir haben im letzten Kaptil schon angedeutet, dass eine Programmiersprache für komplexe Programme unbedingt objektorientiert sein soll. Auch diese Bedingung erfüllt Java. (Im Kapitel 4 werden wir uns mit diesem Begriff näher auseinander setzten.) Multithreaded bedeutet bei einem Prozessor, dass mehrere Programmzweige abwechselnd auf den Prozessor zugreifen können. Dies kann sinnvoll sein, wenn beispielsweise ein Ergebnis aus dem ersten Zweig ein Ergebnis aus dem zweiten Zweig benötigt. Der Vorteil von „multithreaded“ kommt aber erst bei dann richtig zur Geltung, wenn mehrere Prozessoren die Zweige gleichzeitig abarbeiten können. Hier ist aber von Seiten der Firma Sun noch einige Entwicklungsarbeit erforderlich. Den letzten Punkt, dass Java „relativ langsam“ ist, übersehen wir geflissentlich und schauen uns lieber diese Java-Fan-Seite an: http://java.seite.net/wasisjava.html Aufgabe 1 Auf dieser, wie auf anderen Java-Fan-Seiten, ist ein Bezeichungsfehler zu finden. Genauer: Es wird Java eine Technik zugeschrieben, die es sicherlich nicht hat. Wer findet den Fehler? Auf der Seite http://www.saar.de/~awa/javaeinf.htm sind zwei Bilder zu finden, die den Sinn von Java-Programmen im Internet verdeutlichen: 91 Zunächst die Situation ohne Java: Und jetzt mit Java: Hat man den IE auf ein mittleres Sicherheitsniveau gestellt, so akzeptiert er JavaCode. In diesem Fall würde beim Drücken auf den kleinen Lautsprecher rechts unten eine Ansage zu hören sein. Dieses einfache Beispiel macht aber auch die Problematik sichtbar, die die Verwendung von aktiven Inhalten mit sich bringt. Aufgabe 2 Recherchiere im Internet, ob von Java-Anwendungen (Applets) auf html-Seiten eine Gefahr für den Benutzer ausgehen kann. 92 Installation Muss man Java denn installieren? Der Browser zeigt mir Java-Applets an, also habe ich Java schon auf dem Rechner! Ist leider nicht richtig! Wer Java-Applets abspielen kann, hat zunächst mal nur das JRE (Java Runtime Environment) installiert. Damit kann man zwar Java-Code ausführen, - aber eben nicht selbst erzeugen. Die JRE besteht aus der JVM (Java Virtual Maschine) und dem Plugin für den Browser. Will man in Java progammieren, so braucht man das JDK (Java SE-Development Kit – zur Zeit in Version 6 . Achtung: Statt JDK ist auch der Begriff SDK : Software Developement Kit gebräuchlich. Also JDK = SDK!!). Herunterladen kann man das JDK hier: http://java.sun.com/javase/downloads/index.jsp (Im Tauschverzeichnis ist die nötige Datei auch vorhanden: jdk-6-windows-i586.exe Man darf jetzt nicht erwarten, dass sich nach der Installation und dem Aufruf des Programms ein Fenster wie bei Delphi öffnet, in dem man sich die zukünftige Anwendung graphisch zusammenklickt und eventuell noch etwas Code hinzufügt. (Sorry, - das war vielleicht ein wenig gehässig!) Außer der Eingabeaufforderung und beispielsweise dem Notepad-Editor, die zuvor schon da waren, gibt es keine weitere Interaktion mit dem JDK! Damit die Eingabeaufforderung auf einigermaßen bequeme Weise mit Java funktioniert, muss man noch die Umgebungsvariablen setzen. (Damit ist gemeint, dass die Befehle java und javac eingegeben werden können, ohne dass man jedes mal den Pfad zum Programm mit eingibt.) Das geht so: 93 Rechtsklick auf den Arbeitsplatz / Eigenschaften / Erweitert / Umgebungsvariablen. Im unteren Fenster „Path“ suchen und doppelklicken. Im sich öffnenden Fenster wird C:\Java\jdk\bin in das untere Editfeld hinzugefügt. Haben Sie einen anderen Installationsort festgelegt, so muss der Pfad entsprechend angepasst werden. Natürlich kann man für das Schreiben des Programmcodes den einfachsten Editor von Microsoft verwenden, - nur: Bequem und Bentzerfreundlich ist dies sicher nicht. Es gibt aber erfreulicherweise sehr brauchbare Freeware-Editoren, die noch viel mehr können, als nur Java-Code anschaulich darzustellen. Am bekanntesten ist sicherlich Eclipse: http://www.eclipse.org/ Eine IDE (Integrated Development Environment) vom Feinsten! Hier kann man auch noch ein GUI (= Graphic User Interface) per Addon einbinden. Außerdem kann man mit Eclipse auch C++ und anderen Programmiersprachen editieren. Vorteil: Eclipse ist Freeware. Nachteil: Eclipse ist für Programmieranfänger ungeeignet, da man von der Menge der Erweiterungsmöglichkeiten und deren Handhabung nahezu erschlagen wird. Verwendet man die reine IDE wie sie nach der Installation vorliegt, so sind immer noch die vielen Einstellungs-Entscheidungen zu treffen. Mit einem geeigneten Tutorial sollte man dann aber zurechtkommen. Aufgabe 3 Informieren Sie sich bei Wikipedia über Eclipse : http://de.wikipedia.org/wiki/Eclipse_(IDE) Welche Programmiersprachen kann man mit Eclipse editieren? 94 Wer schon mit Visual C# oder mit Delphi gearbeitet hat, wird von Eclipse + Visual Editor (Bild oben) wegen der umständlichen Handhabung des GUI enttäuscht sein. Aber natürlich gibt es auch hier eine eingeschworene Gemeinde, die Eclipse auch im grafischen Bereich für unschlagbar hält........ Aber: Hier im Unterricht werden wir zunächst auf den graphischen Schnickschnack verzichten und Java nur auf Befehlszeilen-Ebene (Eingabeaufforderung) behandlen. Eine reine IDE ohne graphische Element kann man kostenlos hier bekommen: http://www.jcreator.com/download.htm Der JCreator LE in der Version 4 ist ein ausgezeichnetes Tool zum Verfassen von Java-Code. Die nötige Datei JavaCreaterLE_jcrea400.zip befindet sich auch im Tauschverzeichnis. Im Unterricht werden wir den Editor EditPlus verwenden, weil er deutlich universeller nutzbar ist. Man kann so ziemlich alle bekannteren Programmiersprachen damit editieren. Leider ist das Programm nur Shareware (30 Tage lang nutzbar). Auch dieses Programm epp230_en.exe ist im Tauschverzeichnis zu finden. 95 Aufgabe 4 Installieren Sie probeweise JDK und setzen Sie die Umgebungsvariablen (Anleitung siehe oben). Installieren Sie JCreator auf Ihrer Arbeitsstation und vergleichen Sie mit dem im Netz installierten EditPlus (NAL: Informatik). Versuchen Sie einen ungefähren Überblick über die beiden Editoren zu bekommen. Weshalb verwenden wir einen extra Editor, wenn doch auch der einfache Texteditor von Microsoft benutzt werden kann? Dafür gibt es mehrere Gründe: • Ein guter Editor unterstützt durch farbliche Mittel den Programmierer. • Der Editor kann erraten, wie ein angefangenes Wort weitergehen wird und man muss mit der Entertaste den Vorschlag gegebenenfalls nur bestätigen. • Mit solchen Editoren können schon vor der Compilierung einige Fehler (besonders Syntaxfehler) gefunden werden. Öffne in EditPro einen Javaeditor: Ohne auch nur eine Zeile geschrieben zu haben, wird beim Start gleich der Quelltext für das typische „Hallo Welt“-Programm angezeigt. (Leider waren Schlamper am Werk, die nur ein Minimum an Text eingetragen haben. Ergänzen Sie daher wie unten angegeben.) Im Windows-Editor müsst man auch die immer wiederkehrenden Zeilen selbst schreiben. Und das sähe dann so aus (ohne Fettdruck): public class HalloWelt //Diese Klasse gibt einen Text aus { public static void main(String[] args) { System.out.println("Hallo Welt!"); } } Obwohl der Quelltext (ohne die geschweiften Klammern) nur aus drei Zeilen besteht, ist ein genaueres Verständnis, insbesondere der zweiten Zeile, nur möglich, wenn man etwas tiefer in die Theorie die objektorientierte Programmierung einsteigt. Wir 96 werden uns allerdings erst in Kapitel 4 damit auseinandersetzen. Also müssen wir versuchen, auch so klar zu kommen. Wer mit C gearbeitet hat, wird die geschweiften Klammern, mit denen der auszuführende Code zusammengefasst wird, kennen. Delphi-Freunde werden erkennen, dass sie etwa die Aufgabe von begin und end haben. Ebenfalls aus Delphi sind die zwei Frontslashs (//) bekannt: Sie werden vom Compiler nicht beachtet und so kann man Kommentar dahinter notieren. Für die Neugierigen sei gesagt, dass eine öffentliche Klasse „Hallo Welt“ erzeugt wird. Alle Klassen leiten sich von der obersten Klasse OBJECT ab Die MAIN-Methode wird bei Ausführung der Anwendung HalloWelt aufgerufen. Void bedeutet, dass von Main kein Rückgabewert erwartet wird. Ganz wichtig: • Klassenname und Dateiname müssen gleich sein! • Java ist Case-Sensitiv ( a ungleich A) Aufgabe 5 Speichern Sie Ihren Quelltext unter HalloWelt.java auf D: ab. Wenn Ihnen die Installation von Java vorhin gelungen ist, dann öffnen Sie die Eingabeaufforderung (Start / Ausführen cmd eingeben – Enter) Gehen Sie zu D: Mit javac wird der Quelltext compiliert und als HalloWelt.class am gleichen Ort abgelegt. (Kontrollieren!) Nun muss nur noch HalloWelt.class von java interpretiert werden. Erscheint auch bei Ihnen die Ausgabe „Hallo Welt“? Wann wird beim Entstehungsprozess eines Programms in Java compiliert,wann interpretiert? Was dabei alles schief gehen kann: • • • Sollten die Befehle javac oder java nicht erkannt werden, so starten Sie Java aus dem NAL/ Informatik! Falls die Fehlermeldung „Der Befehl „javac“ ist entweder falsch geschrieben oder konnte nicht gefunden werden“ dennoch erscheint, so muss, wie Tim Grabowski entdeckt hat, das Setzen der Umgebungsvariablen nochmals bestätigt werden (S.87: zweimal auf „okay“ drücken). Cmd sollte dann neugestartet werden. Eigentlich sollte die Klasse HalloWelt.class mit dem Befehl java HalloWelt interpretiert werden. Das klappt bei der Serverbasierten Java-Installation (also an unserer Schule) leider nicht. Die Fehlermeldung besagt, dass die Klasse 97 nicht gefunden wurde! Daher zwingt man Java durch den Parameter –cp den Pfad in Echtzeit hinzuzufügen. Wie Sie sehen ist das Zusammenspiel zwischen Java und Windows nicht unproblematisch. Stellen Sie sich vor, Sie wollen Ihr mühsam erstelltes JavaProgramm (Programm.class – nix exe!!) einem Windows-Benutzer schenken. Es darf bezweifelt werden, dass dieser viel damit anfangen kann ....... Variable: Java ist unsere erste Programmiersprache. Nehmen wir uns daher etwas mehr Zeit für die Variablen. Wie im letzten Kapitel schon angedeutet, werden Sie sehr bald merken, dass man auch für die anderen Programmiersprachen nicht viel Neues dazulernen muss! Für jede zu speichernde Information benötigt man Platz auf dem Speicher. Damit man den wertvollen Speicher nicht verschenkt, versucht man nur soviel wie nötig an Platz zu reservieren. Daher legt man vorher schon gewisse Datentypen fest und verlangt vom Programmierer, dass er sich festlegt: Soll x eine Ganzzahl (int) oder einen Buchstaben (char) aufnehmen? Ist y eine Kommazahl (float, double= oder ein Text (string)? Der Datentyp beschreibt somit, welche Art von Information in einer Variablen gespeichert werden kann. Java bietet wie auch andere Programmiersprachen eine Handvoll primitiver Datentypen an. Es handelt sich um Datentypen, die in die Programmiersprache Java direkt eingebaut sind und die man ohne besondere Vorkehrungen verwenden kann. (Es ist zum Beispiel nicht notwendig, primitive Datentypen über die import-Anweisung in irgendeiner Form in das Programm einzubinden, um sie gegenüber dem Java-Compiler bekannt zu machen. Der Java-Compiler kennt von Haus aus alle primitiven Datentypen.) Und das gibt es: • • • • • • • • boolean b; char c; byte y; short s; int i; long l; float f; double d; (1 byte) – welche Verschwendung: 1bit würde reichen! (2 byte) (1 byte) (2 byte) (4 byte) (8 byte) (4 byte) (8 byte) Um Variable in Java zu benutzen, gibt man zuerst einen Datentyp an und dahinter durch ein Leerzeichen getrennt einen Variablennamen. Variablendefinitionen werden in Java am Zeilenende zusätzlich mit einem Semikolon (;) abgeschlossen. Die obigen Code-Zeilen legen also die Variablen b, c, y, s, i, l, f und d an. 98 Will man auf die boolean Variable b einen Wert legen, so geht das über das Gleichheitszeichen: b = true; oder b = false; Der Datentyp boolean eignet sich also für Variablen, die genau einen von zwei Zuständen speichern sollen. Daher bräuchte man hier lediglich 1 Bit Speicherplatz. Solch kleine Speichereinheiten können einzeln nicht angesprochen werden, - also nimmt man 1 Byte! Man spricht bei einem Speichervorgang, der mit Hilfe des Operators = erfolgt, von einer Zuweisung. Das, was rechts vom Operator = steht, wird dem, was links steht, zugewiesen. Die Zuweisung findet immer von rechts nach links statt. Obige Zeilen weisen also einmal den Wahrheitswert true, einmal den Wahrheitswert false der Variablen b zu. Der Zuweisungsoperator = findet nicht nur bei Variablen vom Typ boolean Anwendung, sondern existiert für Variablen jeden Datentyps. c = 'H'; Der Datentyp char speichert genau ein Zeichen „Unicode“(2 Byte). Lesen Sie hierzu bei Wikipedia den zugehörigen Artikel: http://de.wikipedia.org/wiki/Unicode Für Ganzzahlen gibt es folgenden Zahlenbereich: byte y; short s; int i; long l; -128 <= y < =127 -32768 <= s < = 32767 -2147483648 <= i < = 2147483647 -9223372036854775808 <= i < = 9223372036854775807 Und für Kommazahlen gibt es diesen Bereich: float f; double d; -3.40282347e38 <= f <= 3.40282347e38 -1.79769313486231570e308 <= d <= 1.79769313486231570e308 Genug der Theorie, - wir wollen Java rechnen sehen!! 99 (Varible.java ist im Tauschverzeichnis). Überraschungen birgt das Programm nicht! Interessant ist allenfalls, wie die Ausgabe in Java gemanagt wird: System.out.println(); (println steht für „print line“) Wie auch PHP nimmt es Java mit den Variablen nicht so genau. Sehen Sie sich den folgenden Screenshot an: Im obigen Bild sieht man, dass ein Character zu einer int-Zahl addiert, bzw, mit einer float-Zahl multipliziert werden soll, - was ganz offentlich Unsinn ist. Java bringt aber ein Ergebnis! In der Sprache der Java-Fans heißt dieser Vorgang „automatische Typenkonvertierung“! Im folgenden Screenshot sollten Sie auf zwei Dinge achten: Was ist das Ergebnis, wenn man zwei int-Zahlen dividiert? Wie kann man in Java Wurzel-Rechnungen durchführen? 100 Verzweigung: Da wir für die Lösung einer quadratischen Gleichung eine Verzweigung einbauen müssen: • Ist die Diskriminante, also das, was unter der Wurzel steht, positiv? Dann gibt es zwei Lösungen! • Ist die Diskriminante negativ? Dann gibt es keine Lösung! • Ist die Diskriminante gleich Null? Dann gibt es genau eine Lösung! Das Programm Verzweigung prüft, ob eine Zahl a positiv, negativ oder Null ist: 101 Sie sehen, dass Java in diesem Punkt genau so ist, wie man es erwartet hat: Beinahe wie gesprochene Sprache – in englisch halt ☺ Jetzt könnten wir unser Zielprogramm schon fast angehen. Eines fehlt aber noch: Wie kann man die Eingabe variabel gestalten. Man hat ja keine Lust, für jede neue Zahl den Quelltext umzuschreiben. Eingabe: Wie man zur Wurzelrechnung das Paket java.lang.Math importieren musste, so benötigt man für eine Eingabe, wie wir sie uns vorstellen, das Paket java.io. Mit „throws IOExceptions“ wird festgelegt, wie eine „Exception“ (meist ein Fehler) abgefangen werden soll. Erst wenn wir uns mit objektorientierter Programmierung befassen, werden wir genauer auf diese Einzelheiten eingehen können. Und so wird der Tastaturpuffer abgefragt: BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); 102 Nun zur Mitternachtsformel: Wir wollen ein Programm erstellen, das eine quadratische Gleichung der Form x2 + px + q = 0 lösen kann. Dabei soll zunächst noch auf eine variable Eingabe von p und q verzichtet werden. Aufgabe 6 Schauen Sie sich nochmals das Struktogramm am Ende des letzten Kapitels an. Unten sehen Sie, wie eine Umsetzung in Java-Code aussehen kann. Versuchen Sie die einzelnen Zeilen anhand des Struktogramms nachzuvollziehen. Schreiben Sie danach den Quellcode in Editplus und speichern Sie die Datei unter QuadratFest_p_q.java ab. Dann nach D: kopieren und wie im letzten Beispiel verfahren. Läuft das Programm? Wie heißt die Lösung? Geben Sie auch mal andere Werte für p und q ein! Kurz noch zur Form des Quelltextes: Jeder Programmierer entwickelt im Laufe der Zeit „seinen“ Stil. Gleichgültig wie genial er auch sein mag: Die Qualtität seiner Quelltexte hängt entscheidend von der Lesbarkeit des Codes für andere ab. Und da gibt es eben bestimmte Regeln, die man tunlichst einhalten sollte. 103 Aufgabe 7 Versuchen Sie anhand des obigen Textes solche Regeln zu finden und notieren Sie, was Sie gefunden haben. Sehr störend an dem Programm ist, dass man für neue Werte von q und q jedesmal den Programmcode ändern und dann den Code erneut compilieren muss. In der Zeit haben Sie die Aufgabe fünf mal mit Hand gerechnet. Wir brauchen daher eine Möglichkeit, Varible eingeben zu können. Mit anderen Worten: Das Programm soll uns nach den Werten für p und q fragen und diese dann auswerten. Da die eingebenen Werte zunächst nur als Zeichenkette (String) verstanden werden, müssen sie „geparst“ werden. (to parse = analysieren). Dies wäre ein möglicher Quelltext: 104 So sieht der Ablauf aus: Aufgabe 8 Versuchen Sie herauszufinden, wie die Ein- und Ausgaben realisiert wurden. Schreiben Sie danach eine Variante dieses Programms, bei der die andere Mitternachtsformel für ax2 + bx + c = 0 gelöst wird! Es sollen a, b und c wie oben eingegeben werden können. Lösung: x1/2 = (-b +/- sqrt(d)) / (2a) wobei d = b2 - 4ac Unser Ziel ist erreicht: Ein Programm zur Lösung einer quadratischen Gleichung. Dennoch wollen wir weder bei Java noch bei den noch zu behandelnden Programmiersprachen auf das letzte noch fehlende Element der elementare Programmierung verzichten: Schleifen Die Syntax erinnert hier sehr an C++. Einfache Zählschleifen werden mit for (Bedingung) realsiert (for-Schleife). Beispiel: for (x=1; x<=3; x++) zahl = zahl*2; Hierbei bedeutet x++ das selbe wie x=x+1. Entsprechend x--soll heißen x=x-1. Können Sie sich noch erinnern, wie Primzahlen definiert werden? Richtig: Sie sind nur durch 1 oder sich selbst teilbar. Und wie bestimmt man, ob eine Zahl eine Primzahl ist oder nicht? Eine einfache (aber relativ langsame) Methode besteht darin, zu untersuchen, ob die Zahl durch 2 teilbar ist. Wenn nicht dann testet man der Reihe nach 3; 5; 7; 9; etc. Wie lange muss man diesen Test durchführen? Doch nicht bis zur Zahl selbst?! Nein! Ein Beispiel: Wenn die Zahl 100 durch 2; 3; 5; 7; 9 nicht teilbar ist, dann auch nicht durch eine größere Zahl. Ist Ihnen klar weshalb? Naja: Wenigstens ein Faktor muss kleiner oder gleich der Wurzel aus 100 sein. Sonst wird das Produkt der Faktoren sicher größer als 100. Sehen Sie sich diesen Screenshot für ein einfaches Primzahltest-Programm in Java an. Als Schleife wurde eine while-Schleife verwendet: Der Quellcode ist auch auf dem Tauschverzeichnis zu finden. 105 Aufgabe 9 Versuchen Sie, den unten dargestellten Programmcode nachzuvollziehen. Ist Ihnen ein bestimmter Teil nicht klar, so recherchieren Sie über das Internet. Auch der Lehrer hilft Ihnen gerne! Was bedeutet zum Beispiel die Zeile 36: while( i*i < zahl & zahl % i !=0) Welche Bedeutung hat “return”? 106 Apache sucht PHP Apache ist hier kein Indianer sondern ein HTTP-Webserver der nach dem berühmten Indianerstamm benannt wurde. Mitunter kann man auch die Formulierung:“ Apache ist der HTTP-Webserver“ lesen. Kein Wunder! War der Marktanteil von Apache im Jahr 2002 doch über 70%!! Im Jahr 2007 sank er zwar erstmals wieder unter die 60%-Marke, - aber auch diese Zahl rechtfertigt den Begriff „marktbeherrschend“! (Siehe hierzu auch: http://www.heise.de/newsticker/meldung/84838 ). In Wikipedia kann man zum Apache-Server folgendes lesen: Der Apache HTTP Server [ə pæt i] ist ein Produkt der Apache Software Foundation und der meistverbreitete Webserver im Internet, vor dem Internet Information Services (IIS) von Microsoft. Der Name wurde aus Respekt vor dem nordamerikanischen Indianerstamm der Apachen gewählt. Nicht korrekt ist laut der offiziellen FAQ, dass der Name eine Umdeutung von „a patchy server“ sei, was soviel wie „ein zusammengeflickter Server“ bedeutet. Neben Unix und Linux unterstützt Apache auch Win32, NetWare sowie eine Vielzahl weiterer Betriebssysteme. In Version 2.0 wurde die Stabilität und Geschwindigkeit des Servers – vor allem auch auf Nicht-UNIX-Systemen – erheblich verbessert: Die Bibliothek Apache Portable Runtime (APR) stellt eine Verallgemeinerung wichtiger Systemaufrufe zur Verfügung, so dass die individuellen Stärken des jeweiligen Betriebssystems ausgenutzt werden können. Hinzu kommen verschiedene Multiprocessing-Module (MPM), die je nach Plattform unterschiedliche Lösungen für die gleichzeitige Bedienung mehrerer Client-Anfragen anbieten. Der Apache-Webserver ist modular aufgebaut: Durch entsprechende Module kann er beispielsweise die Kommunikation zwischen Browser und Webserver verschlüsseln, als Proxyserver eingesetzt werden oder komplexe Manipulationen von HTTP-Kopfdaten und URLs durchführen. Der Apache bietet die Möglichkeit, mittels serverseitiger Skriptsprachen Webseiten dynamisch zu erstellen. Häufig verwendete Skriptsprachen sind PHP oder Perl. Diese sind kein Bestandteil des Webservers, sondern müssen ebenfalls entweder als Module eingebunden werden oder über die CGI-Schnittstelle angesprochen werden. Hier kommt PHP ins Spiel: PHP ist eine Skriptsprache zur Erzeugung dynamischer Webseiten. Wenn Sie nicht genau wissen, was eine Webseite „dynamisch“ macht, dann schauen Sie sich diese Seite an: https://user.web.de/step1.jsf?mc=hp@[email protected]@home Es ist nicht wahr, dass, wie ein Gerücht behauptet, der Name PHP von „Professional Help for Pisher“ kommt. Aber wie so oft in derartigen Fällen, hat PHP diese „Auszeichnung“ nicht ganz unverdient bekommen. Wir werden später sehen, dass gedankenloses oder schlampiges Programmieren zu erheblichen Sicherheitslücken führen kann. 107 Wie und wann PHP entstanden ist, lesen Sie im folgenden Wikipedia-Artikel nach: PHP wurde 1995 von Rasmus Lerdorf entwickelt. Der Begriff stand damals noch für Personal Home Page Tools und war ursprünglich eine Sammlung von Perl-Skripten, die Rasmus Lerdorf zur Protokollierung der Zugriffe auf seinen Online-Lebenslauf geschrieben hatte. Bald schuf Lerdorf jedoch eine größere Umsetzung in C. In dieser Programmiersprache wird PHP heute noch entwickelt. Das schließlich veröffentlichte PHP war Perl sehr ähnlich, wenn auch viel eingeschränkter, einfacher, und ziemlich inkonsistent. PHP 3 wurde von Andi Gutmans und Zeev Suraski neu geschrieben, da das inzwischen erschienene PHP ihrer Meinung nach für eCommerce zu schwach war. Auch die Bedeutung der Abkürzung „PHP“ wurde hierbei geändert. Lerdorf kooperierte mit Gutmans und Suraski, und so wurde die Entwicklung von PHP eingestellt. Obwohl PHP 3 für den professionellen Einsatz noch keine allzu große Funktionsvielfalt bot bzw. einige Schwächen aufwies, brachte es die Verbreitung von PHP bedeutend voran. Die von Gutmans und Suraski gegründete Firma Zend Technologies entwickelte in der Folge die Zend Engine 1, die den Kern der PHP-4Standardimplementation bildet. Der Name „Zend“ ist aus den beiden Vornamen der Entwickler Zeev und Andi gebildet. Mit PHP 4 wurden die Ausführungsgeschwindigkeit komplexer Applikationen und die Sicherheit bei Verwendung globaler Variablen verbessert. Da das World Wide Web Ende der 1990er-Jahre stark wuchs, bestand großer Bedarf an Skriptsprachen, mit denen sich dynamische Webseiten realisieren lassen. PHP wurde, für Webentwicklung, mit der Zeit populärer als der vorherige De-factoStandard Perl, weil es durch seine Spezialisierung als einfacher erlernbar gilt. Sie werden sehen, dass PHP tatsächlich relativ „einfach erlernbar“ ist. Die oben erwähnte Spezialisierung ist sicher ein Grund. Ein anderer Grund ist dem Anfänger die „Großzügigkeit“ bei schlampiger Programmierung. Darin allerdings muss man leider auch einen Nachteil von PHP sehen: Wenn eine Integer-Variable klaglos auch einen String schluckt, so ist das vielleicht bequem – aber sicher nicht sinnvoll! Ein großer Vorteil der Programmiersprache PHP ist zweifellos die Tatsache, dass sie wirklich auf jeder Plattform läuft! Und zwar deswegen, weil sie nicht auf ihr läuft!! Haben Sie das verstanden? Es ist ganz simpel: Im Gegensatz zu Java ist PHP eine serverbasierte Sprache. Sie läuft also überhaupt nicht auf den Clients. Das folgende Bild (ebenfalls von Wikipedia) zeigt sehr eindrücklich, wie die Sache funktioniert: 108 Der PHP-Quelltext wird nicht an den Browser des Client geleitet, sondern an einen Interpreter des (Apache-) Webservers gereicht und ausgeführt. Erst das Ergebnis wird (zumeist in einer HTML-Seite) an den Browser weitergegeben. Unter vielen anderen Vorteilen ist besonders eine Eigenschaft hervorzuheben: Der PHP-Code ist für den clientseitigen Benutzer nicht einzusehen! Er bekommt lediglich die bearbeiteten Daten ausgeliefert. Auch eventuell verwendete Datenbanken bleiben für den Besucher unsichtbar. Selbstverständlich kann man mit PHP auch Programme schreiben, die rein garnichts mit dem World-Wide-Web zu tun haben. Sie werden das schon sehr bald sehen, wenn wir diesmal mit PHP das Problem der Lösung einer quadratischen Gleichung angehen werden. Aufgabe 9 Versuchen Sie anhand des obigen Bildes den Ablauf einer Client-Anfrage nachzuvollziehen. Weshalb ist es sehr wichtig, dass ein Client den PHP-Code nicht zu sehen bekommt? Nun wird man sich vielleicht fragen, wie man seinen mühsam erstellten ersten PHPCode testen kann, wenn man dazu einen Server braucht! In Kapitel 3 werden Sie lernen, dass jede Workstation auch einen eigenen Server unter „localhost“ betreiben kann. Fragen wir Wikipedia nach localhost: Üblicherweise ist das eigene System (der local host) unter der IP-Adresse 127.0.0.1 für TCP/IP-Applikationen auf die selbe Weise erreichbar, wie ein fernes System (ein remote host) unter einer gewöhnlichen Adresse. Das ermöglicht es unter anderem, Serverapplikationen mit einem Client auf demselben Rechner zu betreiben. Verwendung findet das vor allem zum Testen von Webservern oder zum Betreiben von Spiele-Servern. Dabei kann man eine beliebige Adresse der Netzmaske 127.0.0.0/8, z. B. http://127.0.0.1/ oder auch den Namen http://localhost/ als URL benutzen. 109 Die Adresse des eigenen Servers hätten wir damit. Fehlt uns nur noch die Serversoftware. Hier bietet sich der oben erwähnte kostenlose Apacheserver an. Und dann sollten wir diesem auch das PHP-Modul zur Verfügung stellen können. Das klingt kompliziert und das war es auch. Bis XAMPP kam. Schauen wir wieder bei Wikipedia nach: XAMPP ist eine Zusammenstellung von freier Software. XAMPP ermöglicht das einfache Installieren und Konfigurieren des Webservers Apache mit der Datenbank MySQL bzw. SQLite und den Skriptsprachen Perl und PHP. Das X steht hierbei für die verschiedenen Betriebssysteme auf denen es eingesetzt werden kann. XAMPP enthält zusätzlich andere nützliche Werkzeuge wie den FTP-Server FileZilla, den Mailserver Mercury, phpMyAdmin, Webalizer und OpenSSL. Ziel von XAMPP ist es, eine besonders einfache Installation zu erreichen. Für Windows-Systeme gibt es eine Version mit Installationsroutine, für die anderen unterstützten Betriebssysteme (siehe unten) eine Version mit ausführlicher Installationsanleitung. Mit wenigen Mausklicks erhält man Server-Werkzeuge, die alleine teilweise recht lange Konfigurationszeiten benötigen würden. XAMPP ist nicht für den Einsatz als Produktivsystem (z.B. als öffentlicher Webserver) gedacht, sondern für Entwickler, die möglichst schnell ein kompaktes Testsystem aufsetzen möchten. Dies erklärt auch die bewusst in Kauf genommenen Einschränkungen in Hinblick auf die Sicherheit von XAMPP. Hier bekommt man XAMPP : http://www.apachefriends.org/de/xampp-windows.html mittlerweile in der Version 1.6 An der Schule haben wir Version 1.42. Wer genau die gleichen Programme will, sollte sich diese Version besorgen (auch bei obigem Link). Zunächst werden Sie sehen, wie es in der Schule funktioniert: Zunachst müssen Sie im NAL unter Informatik Apache_Start doppelklicken. Danach MySQL_Start. Dann gehen zwei cmd-Fenster auf, die Sie bitte nicht wegklicken!! (Siehe unten). Auf Ihrem Homeverzeichnis (H) finden Sie einen Ordner namens _xampp. In diesem Ordner gibt es mehrer Unterordner und einer von diesen ist usr (steht für user). Wenn Sie dort hinein eine php- oder htmlDatei legen, so können Sie diese vom Browser aus aufrufen. (Siehe übernächstes Bild). 110 Hier wurde also eine php-Datei mit Namen quadrGleichung.php in den usr-Ordner gelegt. Über localhost/usr/“Dateiname“ kann sie mit dem Browser aufgerufen werden. Der geneigte Leser ahnt, dass wir unser Ziel (Lösung einer quadratischen Gleichung mit PHP) diesmal mit einem GUI ausstatten werden. Wer XAMMP zuhause installiert wird, sofern man die voreingestellten Pfade übernimmt, eine etwas andere Situation vorfinden: XAMPP ist vermutlich unter C:/ Programme/XAMPP installiert. Dort gibt es einen Ordner htdocs/xampp. Und genau da müssen die php-Files abgelegt werden. Hier können Sie den Apache-Server und MySQL auch gleichzeitig starten und stoppen: Unser erstes „Programm“ schreiben wir mit dem Editor und speichern es unter dem Namen HalloInformatiker.php ab in H:/_xampp / usr ab. Und so rufen wir es auf: http://localhost/usr/HalloInformatiker.php 111 Hello World: Probieren Sie es gleich aus! Damit das Programm uns mit „Hallo Informatiker!“ begrüßt, müssen wir dies in den Editor tippen: <?php echo "Hallo Informatiker, "; print("Hallo Informatikerinnen!"); ?> Einfacher geht es kaum! Frage: Welche Funktion hat <? bzw ?> ? Variable: Alle Variablen beginnen mit $. $Text = “Otto“; weist der Variablen $Text den String “Otto“ zu. $Zahl = 3 ; legt die Integerzahl 3 auf Speicher $Zahl. PHP ist nicht zimperlich, wenn es Variablen-Typen geht. So gibt $Ergebnis = $Zahl + “4“ tatsächlich 7!! Um Typenkonvertierung muss man sich also nicht kümmern. Was Sie sicher für einen Vorteil halten ist in Wirklichkeit eher ein Nachteil. Raten Sie, was $Zahl + $Text hier ergibt! Rechenoperationen: Neben der schon oben angegebenen Addition kann PHP auch folgendes: Folgende Rechenoperationen kann PHP ausführen: "-" Subtraktion $a-$b "*" Multiplikation $a*$b "/" Division $a/$b sqrt($i): Wurzel aus $i $i++ erhöht $i um 1 $i-- erniedrigt $i um 1 Vergleichsoperationen: $i==0 Ist $i gleich 0? $i!=0 Ist $i ungleich 0? $i>=0 Ist $i größer oder gleich 0? $i<=0 Ist $i kleiner oder gleich 0? $i==0 OR $i==1 Ist $i gleich 0 oder 1? $i>0 AND $i<10 Ist $i größer als 0 und kleiner als 10? modulo (Restbildung): $a%$b bedeutet „$a modulo $b“ 112 Beispiel: 38%12 = 2 Am Besten lernen Sie an einem Beispiel: Aufgabe 10 Der Quelltext Variable.php liegt im Tauschverzeichnis. Bevor Sie das Mini-Programm starten, überlegen Sie sich, wie die Ausgabe wohl aussehen wird. Danach programmieren Sie eigene Ausgaben und Rechnungen. Fallunterscheidungen: Wie nicht anders erwartet : Mit anderen Worten: Der bei if oder else auszuführende Code wird in geschweifte Klammern { } gesetzt. Der besseren Übersicht wegen ist es ratsam, die jeweils zugehörigen geschweiften Klammern genau untereinander zu schreiben! Geschachtelt geht es auch: 113 Die in dieser Textfarbe geschriebenen Teile des Kapitels haben Thomas Fröhle und Mario Schreiner im Rahmen einer GFS erstellt. Vielen Dank an die Beiden für die ausgezeichnete Arbeit! Funktionen: In PHP gibt es wie in jeder anderen Programmiersprache zahlreiche vordefinierte Funktionen, die PHP von Haus aus mitbringt. Im Gegensatz zu einigen anderen Sprachen müssen in der PHP-Datei selbst keine Bibliotheken o.ä. Definiert werden, die diese Funktionen enthalten. Sehr viele der Funktionen bringt PHP ohne Zutun des Users mit, einige (z.B. Funktionen zur Bildbearbeitung) können heruntergeladen und über die php.ini (die Konfigurationsdatei von PHP) für alle PHP-Skripte, die über diesen PHP-Interpreter interpretiert werden, verfügbar gemacht werden. Dies ist aber vorerst weniger wichtig. Wie erfährt man nun von einer bestimmten Funktion? Dafür gibt es das PHP-Manual, das am einfachsten über die Webseite http://www.php.net erreichbar ist. Auf dieser Webseite gibt es oben ein Suchfeld mit dem man unter anderem die „function list“ durchsuchen kann. Dies ist eine Zusammenstellung aller vordefinierten PHPFunktionen und eine Beschreibung derselben. Hat man nun auch nur den ungefähren Namen einer Funktion kann man nach dieser suchen (und wird sie hoffentlich finden). Will man z.B. Funktionen zum Thema Bildbearbeitung suchen, versucht man es einfach mal mit dem Begriff „Image“ und stellt fest, dass es ein komplettes Kapitel zum Thema „Image Functions“ gibt. Im Prinzip muss man sich also keine PHP-Funktion merken, wobei man natürlich die häufig verwendeten mit der Zeit automatisch kann. Praktisch, oder? Nun zur Verwendung von php.net. Hat man nun eine Funktion gefunden landet man bei der Funktionsbeschreibung, die im Prinzip immer gleich aufgebaut ist. Sie soll hier anhand der Funktion substr() gezeigt werden. Mit dieser Funktion kann ein Teil eines Strings aus einer längeren Zeichenkette geholt werden. Die Beschreibung der Funktion auf php.net sieht wie folgt aus (die von mir hinzugefügten Beschreibungen der einzelnen Teile sind in rot gehalten): substr (Name der Funktion) (PHP 4, PHP 5) (PHP-Versionen, in denen die Funktion verfügbar ist) substr — Gibt einen Teil eines Strings zurück (Kurzbeschreibung der Funktion) 114 Beschreibung In der nächsten Zeile wird nun der Aufbau der Funktion beschrieben. Ganz vorne steht hier die Art der Rückgabe, in diesem Fall „string“. Das bedeutet, dass die Funktion eine Zeichenkette zurückgibt. Wenn wir einen Teil einer Zeichenkette bekommen wollen, ist es ja auch nur logisch, das dieser auch nur eine Zeichenkette ist. Danach kommt der Aufbau der Funktion, so wie er in PHP geschrieben werden muss. Also zuerst der Name der Funktion, dann einesich öffnende Klammer. Jetzt kommen die einzelnen Argumente der Funktion, also gewisse Informationen, die die Funktion braucht um wie gewünscht zu funktionieren. Unbedingt benötigte Argumente sind hier normal geschrieben, optionale Argumente in eckigen Klammern. Die Argumente sind per Komma voneinander getrennt und vor jedem Argument steht, welchen Typ dieses Argument haben soll. Darunter findet sich eine längere Beschreibung der Funktion in der auch angegeben wird, was die einzelnen Argumente für eine Bedeutung haben. Für die Funktion substr müssen also die Argumente angeben werden: • Eine Zeichenkette, aus der ein Teil ausgelesen werden soll. • Eine Zahl die die Position des Zeichens angibt, bei der der Teilstring beginnen soll. • Optional die Länge des Teilstrings. Wird diese nicht angegeben, wird ein Teilstring von $start bis zum ende von $string ausgegeben. string substr ( string $string, int $start [, int $length] ) Hier wird nun eine Beschreibung der Funktion an sich und der einzelnen Argumente angegeben. Diese erscheint zum Teil auf den ersten Blick verwirrend, ist aber eigentlich immer selbsterklärend. An dieser Stelle wird nur gesagt, dass ein Teil von $string zurückgegeben wird, der bei $start beginnt und $length Zeichen lang ist. Darunter werden noch Sonderfälle angegeben, z.b. eine negative Länge oder eine negative Startposition (was beides durchaus möglich ist). Fast immer folgen dann auch noch einige Beispiele zur Funktion. substr() gibt den Teil von string zurück, der durch die Parameter start und length definiert wurde. Wenn start nicht negativ ist, beginnt der zurück gegebene String an der startPosition von string, angefangen bei 0 (Null). So ist z.B. im String 'abcdef' das Zeichen an der Position 0 gleich 'a', das Zeichen an der Position 2 ist 'c' usw. Ist start negativ, beginnt der zurückgegebene String bei dem in start festgelegten Zeichen vom Ende von string aus betrachtet. Ist length angegeben und positiv, enthält der zurückgegebene String höchstens length Zeichen ab start (abhängig von der Länge von string). Ist string kürzer als oder gleich start Zeichen, wird FALSE zurückgegeben. 115 Ist length angegeben und negativ, werden genau so viele Zeichen vom Ende von string abgeschnitten (nachdem die Startposition ermittelt wurde, sollte start negativ sein). Gibt start eine Position hinter dem abzuschneidenden Teil an, wird ein leerer String zurückgegeben. Nun wissen wir also, wie wir Informationen über jede beliebige vordefinierte PHPFunktion bekommen können. Was fehlt? Richtig: Selbst definierte Funktionen! Selbst definierte Funktionen In PHP ist es jederzeit möglich, eigene Funktionen zu definieren. Dies wird hauptsächlich für Codesegmente verwendet, die sehr oft aufgerufen werden müssen. Jeder kann nachvollziehen, dass es wesentlich einfacher ist einmal eine Funktion zu definieren und dann beliebig oft nur die Funktion aufzurufen, anstatt bei jedem Funktionsaufruf den unter Umständen sehr langen Code der Funktion neu zu schreiben oder zu kopieren. Das macht nicht nur den Code unübersichtlicher sondern auch das eventuelle Ändern schwieriger. Möchte ich etwas an diesem Codesegment ändern, müsste ich es an jeder Stelle an der dieser Code steht ändern. Habe ich den Code über eine Funktion definiert, kann ich nur den Code in der Funktion ändern. Eigene Funktionen werden wie folgt definiert (das Beispiel hier zeigt eine Funktion die bei Auftreten von Fehlern aufgerufen wird und dafür sorgt, das Fehler in einer einheitlichen Form angezeigt werden): Wir sehen, dass die Definition einer selbstdefinierten Funktion zuerst mit dem Schlüsselwort „function“ beginnt. Nach diesem folgt der Name der Funktion (fehler_ausgabe) und danach die Parameter. Zu beachten ist, dass die Parameter als Variablen definiert werden. Das hat den einfachen Grund, dass man mit den Parametern ja später in der Funktion irgendwie arbeiten muss, also muss man sie in Variablen speichern. Das erste an die Funktion übergebene Argument wird in der Variable $fehlertext enthalten sein, das zweite Argument in $zeilenumbruch. Bei $zeilenumbruch definieren wir außerdem einen Standardwert (TRUE). Dieser wird verwendet wenn das Argument beim Funktionsaufruf nicht angegeben wird (somit wird das Argument automatisch optional). Man kann die Funktion als jetzt auf mehrere Arten aufrufen. Die folgenden zwei Aufrufe erzeugen das gleiche Ergebnis: 116 hingegen wird folgender Aufruf am Ende des Fehlertextes keinen Zeilenumbruch anzeigen: Zu beachten ist noch Folgendes: Die Variablen $fehlertext und $zeilenumbruch können auch außerhalb der Funktion (also davor oder danach) definiert werden. Dennoch sind sie aber dann in der Funktion NICHT gesetzt. In einer Funktion sind keine Variablen von außen verfügbar, das heißt, würde man vor dem Funktionsaufruf die Variable $fehlertext setzen, wäre dies eine andere Variable als die $fehlertext-Variable IN der Funktion. Möchte man Variablen aus dem sonstigen Code in eine Funktion mitnehmen, kann dies über die Argumente geschehen. (Wahlweise kann auch über den Befehl „global“ in der Funktion eine Variable von außen geholt werden. Das sollte man jedoch tunlichst unterlassen. Gründe, weshalb die global-Variablen nicht günstig sind, werden nachgeliefert.....) PHP und HTML: Leider ist PHP nicht zur strikten und sonst üblichen Trennung von Code und Inhalt konzipiert. Dennoch ist es möglich, zumindest den PHP-Code vom HTML-Code zu trennen. Das kann in einem Dokument erfolgen, nach dem Motto: PHP oben und HTML unten! Beispiel: 117 Aber auch eine völlige Trennung ist möglich. So klappt es: <?php include “extern.php“ ?> Aufgabe 11: Schreiben Sie das obige Beispiel so um, dass innerhalb des HTML-Teils (Trennung2.html) die externe PHP-Datei Fallunterscheidung.php aufgerufen wird. Wer Schwierigkeiten hat, holt sich die Datei Trennung2.html im Tauschverzeichnis. Übergabe HTML PHP: Am Anfang hat man Schwierigkeiten, PHP und HTML fein säuberlich zu trennen. Zur Erinnerung: Für uns dient HTML nur als GUI. Nicht mehr – aber auch nicht weniger. Um so besser, wenn die beiden Programmiersprachen so gut miteinander harmonieren. Trotzdem müssen wir eine Frage lösen: Wie bekommt PHP eine Eingabe, die man in einem HTML-Dokument gemacht hat? Einfaches Beispiel: Eine beliebige Zahl soll mit 23 multipliziert werden. Das Formular soll so aussehen: Keine Sorge! Edit-Felder und Buttons sind in HTML äußerst einfach zu erzeugen: <input type="text" name="eingabe" value="<?=$zahl ?>" /> <input type="text" name="ausgabe" value="<?=$resultat ?>" /> <input type="submit" name="Senden" value="Rechnen" /> Das bedeutet: Die beiden Editfelder (input type="text" ) heißen eingabe und ausgabe. Die Werte, die sie erwarten sind $zahl bzw. $resultat. 118 Der Button (input type="submit") heißt Senden und übergibt einen Wert namens Rechnen. Und hier kommt jetzt PHP ins Spiel. Schauen Sie sich das kleine Programm an: (Es liegt auch im Tauschverzeichnis. Name Uebergabe.php) W Das müssen Sie wissen: Der Befehl „isset“ prüft die Existenz einer Variblen. In diesem Fall werden sogar zwei Dinge geprüft. Und nur wenn beide Bedingungen erfüllt sind, wird der Befehl $zahl = $_GET[“eingabe“] ausgeführt. Welche zwei Dinge sind das?!? Was aber ist $_GET ? $_GET ist ein array (das bedeutet in etwa „Vektor“, wie Sie ihn von der Mathematik kennen). Dieses Array $_GET ist immer vorhanden. Die Arrayelemente hingegen sind nur vorhanden, wenn entsprechend eine Variable name=wert übergeben wurde. „GET“ steht für die Übergabe-Methode GET, bei der die Variablen aus der URL ausgelesen werden. In unserm Beispiel liest GET, nachdem wir zum Beispiel die Zahl 34 in das erste Textfeld eingetragen haben und auf den Button “Senden“ gedrückt haben, aus der URL http://localhost/xampp/Uebergabe.php?eingabe=34&ausgabe=0&Senden=Rechnen eingabe hat den Wert 34, ausgabe hat (noch) den Wert 0 und der Button Senden hat den Wert “Rechnen“. Für den PHP-Anfänger ist die GET-Methode durchaus zu empfehlen, weil sie leichter verständlich als die POST-Methode ist. 119 Da bei der GET-Methode die übergebenen Werte, wie zum Beispiel Passwörter, in der URL in Klartext zu lesen sind, kann man sich leicht vorstellen, dass dies ein Sicherheitsproblem sein kann. Mehr dazu hier: http://www.drweb.de/webmaster/formular-sicherheit.shtml Mit diesem Wissen ausgerüstet, sollten Sie den Quelltext für das Programm „Quadratische Gleichung lösen“ verstehen können: Damit sieht das HTML-Dokument so aus: Sie brauchen den obigen Text nicht abzuschreiben! Er befindet sich im Tauschverzeichnis: QuadrGleichung.php 120 Aufgabe 12 Versuchen Sie (wie bei Aufgabe 8 und Java) herauszufinden, wie die Ein- und Ausgaben realisiert wurden. Schreiben Sie danach eine Variante dieses Programms, bei der die andere Mitternachtsformel für ax2 + bx + c = 0 gelöst wird! Es sollen a, b und c wie oben eingegeben werden können. Lösung: x1/2 = (-b +/- sqrt(d)) / (2a) wobei d = d2 - 4ac Gestalten Sie dabei auch die HTML-Ausgabe etwas ansehlicher! Zusammenfassung Bevor nun ein komplett eingenständiges Skript programmiert werden soll, wollen wir uns nochmal ein kleines Skript anschauen bei dem alles gelernte angewendet wird. Das Skript soll schlicht die Formulareingaben eines Benutzers zum Teil auswerten und anzeigen. Wir werden dabei Schritt für Schritt den Aufbau betrachen. Da die Skripte recht groß sind, sind sie in den extra Dateien V1.html, V2.php und V3.php gespeichert. Diese sind gut kommentiert. Um alles gelernte nochmal zu wiederholen empfiehlt es sich, alle drei Dateien genau anzusehen, die Kommentare zu lesen und die Dateien gegebenenfalls zu verändern bzw. ein wenig mit ihnen zu spielen. In V1.html sehen wir das reine HTML-Grundgerüst der Datei, also im Prinzip das Formular in eine Tabelle eingebunden. In V2.php wurde die Ausgabe der eingegebenen Daten realisiert. Die Eingaben werden hier aber lediglich ausgegeben. In V3.php werden die Eingaben auf Richtigkeit geprüft und die Ausgabe wird ausgewertet. Aufgabe 13: Eigenes Skript Zum Abschluss soll ein eigenes Skript geschrieben werden. Dieses Skript soll folgendes Bewerkstelligen: Der User soll über ein Formular seinen kompletten Geburtstag angeben Das Skript soll nun die Monate, Tage und Stunden bis zum Geburtstag des Benutzers ausgeben, außerdem wie alt der Benutzer dann wird Folgende Funktionen werdet ihr in jedem Fall benötigen und es lohnt sich, sich diese über php.net anzueignen: mktime() date() round() floor() isset() Für alle weiteren benötigten Funktionen bist du selbst verantwortlich! Außerdem sollte man sich eventuell über folgendes Gedanken machen: Wie kann ich sicher sein, dass das angegebene Datum überhaupt existiert? Was ist mit Schaltjahren? Was passiert wenn der Benutzer heute Geburtstag hat? 121 So, nun viel Glück beim programmieren. Das ganze ist definitiv NICHT einfach, wenn man also absolut nicht mehr weiterkommt kann man sich die Musterlösung bday.php im Tauschverzeichnis holen. Schleifen Wie in Java auch wollen wir die Sprache PHP nicht verlassen, ohne die Schleifen zu erwähnen. Schleifen funktionieren in PHP wie in jeder C-ähnlichen Sprache (beispielsweise Java) nach dem Muster while (<Bedingung>) { <Schleifeninhalt> } Dies prüft am Anfang der Schleife, ob Bedingung wahr ist und wenn ja, wird die Schleife eben ausgeführt. Dann wird der Wahrheitsgehalt nochmals überprüft und die Schleife gegebenenfalls nochmal ausgeführt. Auch die for-Schleifen sind ganz ähnlich: for (<Startanweisung>; <Bedingung>; <Schleifenanweisung>) { <Schleifeninhalt> } Beispiel: for ($i=100; $i<=200; $i+=10) { echo "$i "; } Diese Schleife zählt in Zehnerschritten von 100 bis 200 Wie bei Java auch soll die Schleifen-Technik an einem Primzahl-Testprogramm eingeübt werden. Man kann dabei die Ein- und Ausgabe vom letzten Programm übernehmen. Aufgabe 13 Versuchen Sie zunächst selbst mit Hilfe der Lösung in Java ein PrimzahlTestprogramm in PHP zu schreiben. Erst wenn Sie nicht mehr weiterkommen schauen Sie sich die Lösung weiter unten an und kommentieren die einzelnen Programmzeilen. 122 Die html-Oberfläche sieht so : 123 Aufgabe 14 (zum Thema Sicherheit) Wie man die Sicherheit durch ungeschicktes Programmieren in PHP aufgibt, haben Sie in den obigen Ausführungen selbst gesehen. Hier sind zwei spektakuläre Fälle, die heise-security an die Öffentlichkeit gebracht hat. Lesen Sie die Meldungen durch und beziehen Sie Stellung: Waren die Fehler unvermeidbar? Sind sie PHP-typisch? http://www.heise.de/newsticker/meldung/104135 http://www.heise.de/newsticker/meldung/73837 124