Java und PHP

Transcrição

Java und PHP
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