vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbacknächstes Kapitel


Tag 19


PHP - Einführung

Während Sie gestern etwas völlig Neues kennen gelernt haben, nämlich die Microsoft´sche Definition von serverseitiger Programmierung, kommen wir heute zum Hauptkonkurrenten, nämlich PHP. Es handelt sich hierbei um eine weitere serverseitige Programmiersprache, die insbesondere in letzter Zeit Furore macht. Genau so wie gestern erhalten Sie zunächst einen Crash-Kurs in die Sprachsyntax, und dann sehen Sie, wie einige Standardaufgaben mit PHP gelöst werden können. Auch hier gilt leider wieder: Für einen kompletten Kurs fehlt uns leider die Zeit bzw. der Platz. Bei PHP gilt das noch mehr als bei ASP, denn die Sprache kennt weit über 1000 verschiedene Funktionen! Aus diesem Grunde auch hier Literaturhinweise: Für Einsteiger empfiehlt sich das (allerdings recht Linux-lastige) Buch »Jetzt lerne ich PHP 4«, oder das Standardwerk, und nebenbei auch das erste deutschsprachige Buch überhaupt zu dem Thema (von Mitgliedern der PHP Documentation Group mit verfasst und enthält damit auch die offizielle Funktionskurzübersicht), »PHP 4«, ISBN 3-8272-5877-4.

Im Anhang finden Sie eine Installationsanleitung, und zwar sowohl unter Linux, als auch unter Windows (und hier auch mit verschiedenen Webservern). Weiterführende Hinweise finden Sie auch im World Wide Web, auf der offiziellen PHP-Seite unter www.php.net. Das Online-Manual, immer auf dem aktuellen Stand, mit einer Übersicht über alle Funktionen sowie mit Beispielen und Hinweisen, gibt es unter www.php.net/manual.

Die Themen heute:

19.1 Was ist eigentlich PHP?

Fast jede Programmiersprache hat eine Legende, und bei PHP ist das nicht anders. Ein gewisser Rasmus Lerdorf hat eine Reihe von Tools geschrieben, die ihn in seiner täglichen Arbeit unterstützen sollten. Nun ja, er hat diese Tools der Öffentlichkeit zur Verfügung gestellt, und Mundpropaganda und geschicktes Marketing taten ihr weiteres. Ursprünglich hieß das ganze PHP/FI, dann wurde es in PHP umbenannt, und Version 3 der Sprache, oder auch PHP 3, wurde veröffentlicht. Im Jahr 2000 erschien dann PHP 4, eine komplett neu geschriebene PHP-Version, die intern einen völlig neuen Aufbau aufwies, aber dennoch (größtenteils) abwärtskomatibel zu Version 3 war. Die im Hintergrund operierende PHP-Engine heißt Zend, nach den Namen der beiden Hauptentwickler.

Ein weltweites Netz von Entwicklern entwickelte damals (und auch heute noch) an der Sprache, und zwar nach dem Prinzip Open Source: Der Quellcode steht zur Verfügung, und jeder kann die Sprache weiterentwickeln, neuen Code hinzufügen, der dann von den Entwicklern begutachtet und eventuell eingebaut wird. Das Prinzip ist also dasselbe wie beim Betriebssystem Linux.

Schon hier wird deutlich, dass PHP eine klare Konkurrenzposition zu ASP eingenommen hat. Genauso, wie der Quellcode der Microsoft-Betriebssysteme (noch) nicht offengelegt worden ist, steht auch der Quellcode des ASP-Interpreters der Öffentlichkeit nicht zur Verfügung. Wir wollen uns damit keineswegs aufs Glatteis begeben und behaupten, die eine oder die andere Variante sei die bessere. Dieser Hintergrund ist aber wichtig, um einige Hintergründe der Sprache besser zu verstehen.

PHP wurde unter Unix/Linux entwickelt, und zielte auch lange Zeit auf diese Plattformen ab. Irgendwann gab es eine Windows-Portierung, aber auch die wurde eine Zeitlang von den Kernentwicklern nur müde belächelt oder als (nicht ganz notwendiges) Beiprodukt gesehen. Windows-Nutzer wurden in den PHP-Diskussionslisten anfangs genauso behandelt. Sie sehen also: Ideologische Glaubenskriege sind auch hier nie spurlos vorübergezogen.

Aber auch andere Besonderheiten hielten den Aufstieg von PHP in die erste Liga der kommerziell eingesetzten Programmiersprachen auf. Die Dokumentation war lange Zeit ein großer Schwachpunkt, denn Entwickler dokumentieren ja prinzipiell ungern, und ein gewisser Mangel an Professionalität war beim PHP-Projekt lange Zeit nicht wegzudiskutieren. Entwickler waren auf Kritik oder Änderungswünsche nicht besonders gut zu sprechen, und der Ton in den Diskussionslisten wurde teils sehr scharf. Technische Entscheider, die sich überlegen mussten, ob sie PHP einsetzen wollten, fanden also genügend Argumente, die Technologie zunächst ad acta zu legen.

So nach und nach hat sich die Situation aber verbessert. Heutzutage stehen Windows- Binaries einer neuen PHP-Version nur Stunden nach Veröffentlichung des Quellcodes einer neuen Version zur Verfügung. Die PHP Documentation Group (unter Leitung von Egon Schmid) sorgt dafür, dass die Dokumentation immer auf dem neuesten Stand ist. Mittlerweile wurde erkannt, dass PHP nur dann den Durchbruch schaffen kann, wenn man ideologische Mauern einreißt und versucht, eine möglichst große Zielgruppe zu erreichen. Denn oftmals ist es so: Entwickler greifen gerne zu ihren Windows-Maschinen für die Programmierung, auch wenn der endgültige Zielserver dann unter Linux läuft. Inzwischen gibt es sogar eine eigene Website, die Windows-Binaries auch von Entwickler- Versionen (Vorabversionen) von PHP anbietet: www.php4win.de.

Die ursprüngliche Standardplattform von PHP ist LAMP: Linux als Betriebssystem, Apache als Webserver, MySQL als Datenbank, und natürlich PHP. Anfangs wurde oft empfohlen, unter Windows analog von WAMP zu sprechen: Windows, Apache, MySQL, PHP. Das ist in den meisten Fällen jedoch grober Unfug. Viele Leute, die sich mit der Installation von Apache unter Windows abmühen, haben gar keine so großen Anforderungen an ihren Webserver, so dass der Personal Web Server von Microsoft völlig genügt. Der Internet Information Server von Microsoft ist dem Apache sogar weitestgehend ebenbürtig. Zu beiden Servern finden Sie im Anhang übrigens eine Installationsanleitung.

Nun ein Wort zur verwendeten Datenbank: MySQL ist gratis, und unter Linux weit verbreitet. Unter Windows gibt es jedoch einige Alternativen. Wer keine großen Anforderungen hat, kann Access verwenden; für die Beispiele in diesem Buch (morgen gehen wir auf die Datenbankprogrammierung ein) wird dazu nicht mal Access selbst benötigt! Professionellere Anwendungen verwenden als Datenbank Oracle oder Microsoft SQL Server, zwei Produkte, die insbesondere bei größeren Datenmengen MySQL überlegen sind. Man kann diese Datenbanken inzwischen sogar über eigene PHP- Funktionen ansteuern, aber unter Windows gibt es für den Datenbankzugriff einen kleinsten gemeinsamen Nenner: ODBC, Open Database Connectivity. Hiermit kann quasi jede Datenquelle unter Windows mit einem einheitlichen Befehlssatz angesteuert werden.

Warum dennoch so viele Leute auf einmal wie wild angefangen haben, auf Ihren Windows-Maschinen Apache und MySQL zu installieren, und dann laut geflucht haben, weil es doch etwas komplizierter war als die »Klicki-Bunti«-Welt von Windows? Nun, viele Bücher waren sehr Linux-lastig, und Windows und/oder ODBC waren Fremdwörter. Hier eine gute Nachricht: Wir gehen sowohl auf Linux als auch auf Windows ein, Sie können also die für Ihre Anforderungen optimale Lösung wählen und sind nicht durch die Vorgaben Ihrer Autoren eingegrenzt.

Legen wir also los, legen Sie die Sitzgurte an, und halten Sie sich fest. Im Folgenden erhalten Sie eine Spracheinführung im Schnelldurchlauf und dann eine Reihe von Anwendungsbeispielen. Und noch ein Wort zum Umfang des heutigen Tages (in Sachen Buchseiten) im Vergleich zu gestern. Ja, es sind weniger Seiten, aber das heißt weder, dass wir ASP über PHP bevorzugen oder umgekehrt, noch dass die eine oder die andere Sprache schwieriger oder leichter zu erlernen sei. Der Grund ist folgender: PHP orientiert sich von der Syntax an JavaScript und Perl, und insbesondere mit ersterem sollten Sie inzwischen sehr vertraut sein. Wir können also viele einleitende Dinge kürzer fassen. Der Umfang der Anwendungsbeispiele ist ungefähr gleich zum ASP-Teil, Sie verpassen also nichts. Um genau zu sein, werden Sie einige der Beispiele sogar leicht modifiziert wiederfinden; dies ermöglich es Ihnen, einen direkten Vergleich zwischen den beiden Sprachen zu ziehen.

Als allerletzte Vorbereitung sollten Sie noch einmal sicherstellen, dass PHP auf Ihrem Webserver korrekt eingerichtet ist. Erstellen Sie eine Datei mit folgendem Inhalt:

Listing 19.1: phpinfo.php

<?php
phpinfo();
?>

Rufen Sie diese Datei über ihre Server-URL auf, also beispielsweise als http://localhost/ skriptname.php, und vergleichen Sie die Anzeige im Webbrowser mit der aus Abbildung 19.1. Sofern Sie eine gewisse Ähnlichkeit erkennen können, haben Sie (zunächst) alles richtig gemacht und können loslegen. Falls nicht, werfen Sie noch einmal einen Blick auf die Installationsanleitung im Anhang, oder suchen Sie im Online-Manual nach Hilfe.

Abbildung 19.1:  PHP ist korrekt installiert und eingerichtet worden

19.2 Spracheinführung

Steigen wir also ohne weitere Umschweife in die PHP-Programmierung ein. Vieles, was Sie hier sehen werden, wird Ihnen nur allzu bekannt vorkommen. PHP ähnelt (nicht ohne Absicht) Perl sehr stark, und auch JavaScript-Kenner werden das eine oder andere Déja-vu- Erlebnis haben. Also, frisch ans Werk!

Einbau

Was bei ASP noch <% und %> war, ist bei PHP <?php und ?>. Sie sehen: Auch hier wird der Programmcode direkt in ein HTML-Dokument eingebettet, was unter anderem den Vorteil hat, dass Sie PHP-Skripte in praktisch jedes beliebige Verzeichnis legen können, im Gegensatz zu Perl, wo Sie zumeist alles in cgi-bin legen müssen, was die Verlinkung auf andere Seiten etwas erschwert.

Wohl auch aus diesem Grund rechnen manche Experten damit, dass PHP mittelfristig Perl als Web-Skriptsprache ablösen wird.

Es gibt auch andere Möglichkeiten, PHP-Code vom HTML-Code abzugrenzen. Eine Möglichkeit besteht in der Verwendung von <script language="php"> ... </script>, aber - durch entsprechende Modifikationen in der php.ini - ist auch <? ... ?> und sogar <% ... %> möglich. Standard ist und bleibt aber <?php ... ?>, woran wir uns heute auch halten wollen und werden. Sehr häufig findet man außerdem noch oben erwähntes <? ... ?>.

Hier ein erstes, einfaches, PHP-Skript:

Listing 19.2: willkommen.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>PHP-Test</title>
</head>
<body bgcolor="white">
<?php
print "<h1>";
print "Willkommen bei PHP!";
print "</h1>";
?>
</body>
</html>

Im Browser sollten dieses PHP-Skript nun zu einer ähnlichen Ausgabe führen.

Abbildung 19.2:  Das erste Skript im Webbrowser

Ihnen wird einiges aufgefallen sein:

Ein Blick auf den Quellcode der resultierenden Seite bestätigt zumindest die erste Vermutung:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>PHP-Test</title>
</head>
<body bgcolor="white">
<h1>Willkommen bei PHP!</h1></body>
</html>

Zur Erinnerung: Sie können den Quelltext einsehen, indem Sie beim Netscape Navigator View/Page Source bzw. Anzeige/Seitenquelltext wählen, beim Internet Explorer lautet der Menübefehl Ansicht/Quelltext anzeigen.

Und noch ein Wort zur Klammerung: Es ist auch möglich, den Parameter für print in Klammern zu schreiben, also print "irgendein Text";. Bei nur einem Parameter unterlässt man das in der Praxis aber, wohl auch deswegen, weil die print-Anweisung naturgemäß sehr häufig verwendet wird.

Kommentare gibt es in PHP natürlich auch. Zwei davon kennen Sie von JavaScript, einen davon von Perl. Alles weitere finden Sie in !

Kommentarzeichen

Beispiel

Beschreibung

//

// Kommentar

einzeiliger Kommentar

/* ... */

/*
Kommentar
Kommentar
*/

mehrzeiliger Kommentar

#

# Kommentar

einzeiliger Kommentar

Tabelle 19.1: Die Kommentare in PHP

Variablen

Am Anfang war das Wort... in unserem Falle sind es aber die Variablen, Grundbaustein für die Programmierung. Eine Variable wird - genauso wie in Perl - durch ein vorangestelltes Dollarzeichen gekennzeichnet. Für die Namensgebung der Variablen gibt es die folgenden Regeln und Tipps:

Zuweisungen

Als Zuweisungsoperator fungiert auch hier das Gleichheitszeichen. Links davon steht der Variablenname, rechts davon der Wert (oft auch in Form eines Ausdrucks), den die Variable annehmen soll.

<?php
$ping = "pong";
$pingpong = $ping;
?>

Nach Ausführung dieses Codes haben sowohl die Variable $ping als auch die Variable $pingpong denselben Wert: »pong«.

Ausgabe

Die Ausgabe einer Variablen funktioniert mit der Anweisung print, die Sie bereits zuvor im Abschnitt 19.2.1 kennen gelernt haben. Als Parameter wird einfach die Variable übergeben:

Listing 19.3: variablen.php

<?php
$begruessung = "Guten Tag!";
$tag = 18;
$thema = "PHP";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Variablen</title>
</head>
<body background="white">
<h1>
<?php
print $begruessung;
?>
</h1>
Herzlich Willkommen an Tag
<?php
print $tag;
?>;
das heutige Thema lautet:
<?php
print $thema;
?>.
</body>
</html>

Abbildung 19.3:  Der Inhalt der Variablen wird ausgegeben

Es gibt noch eine Alternative zur print-Anweisung, auf die Sie im Web wohl hin und wieder stoßen werden: echo. Die Unterschiede zwischen den beiden Anweisungen sind aber so gering, dass Sie Ihnen in der Regel gar nicht auffallen werden (eine der beiden Funktionen hat einen - überflüssigen - Rückgabewert).

Genauso wie bei ASP gibt es bei PHP auch eine Kurzform für die print-Anweisung, und zwar das Gleichheitszeichen in Verbindung mit <? (also nicht <?php!). Sie finden diese Abkürzung aber in der Praxis sehr, sehr selten im Einsatz. Aus diesem Grund sollten Sie sie auch nur sehr, sehr selten einsetzen. Rechnen Sie immer damit, dass andere Leute (beispielsweise Kollegen) Ihren Code einmal überarbeiten müssen, und da sollten Sie sich an allgemein akzeptierte, wenn auch ungeschriebene Standards halten.

Hier noch einmal das Listing von oben, unter Verwendung der Kurzform:

Listing 19.4: variablen_kurz.php

<?php
$begruessung = "Guten Tag!";
$tag = 19;
$thema = "PHP";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Variablen</title>
</head>
<body background="white">
<h1><?=$begruessung; ?></h1>
Herzlich Willkommen an Tag <?=$tag; ?>;
das heutige Thema lautet: <?=$thema; ?>.
</body>
</html>

Strings und Interpolation

Strings werden (unter anderem) durch doppelte Anführungszeichen umfasst, also analog zu allen Sprachen, die Sie bisher kennen gelernt haben. Alternativ dazu (und das ist ein echter Unterschied zu ASP) können Sie einen String auch durch einfache Anführungszeichen umgeben:

<?php
$d = "Dynamic";
$wp = 'Web-Publishing';
?>

Innerhalb von doppelten Anführungszeichen gibt es aber eine Besonderheit: Variablennamen werden durch ihren aktuellen Wert ersetzt! Werfen Sie einen Blick auf das folgende Beispiel:

Listing 19.5: interpolation.php

<?php
$d = "Dynamic";
$wp = 'Web-Publishing';
$dwp1 = "$d $wp";
$dwp2 = '$d $wp';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Interpolation</title>
</head>
<body bgcolor="white">
<h2><?php print $dwp1; ?></h2>
<h2><?php print $dwp2; ?></h2>
</body>
</html>

Laden Sie dieses Listing in Ihren Webbrowser, und Sie werden den Unterschied zwischen einfachen und doppelten Anführungszeichen sehen (siehe auch ). Bei doppelten Anführungszeichen (erste Ausgabezeile) werden Variablenwerte interpoliert, bei einfachen Anführungszeichen (zweite Ausgabezeile) nicht.

Abbildung 19.4:  Einmal Interpolation (oben), einmal nicht (unten)

Naheliegende Frage - wie ist es dann möglich, das Dollarzeichen innerhalb eines Strings auszugeben? Nun, verwenden Sie einfache Anführungszeichen (wie im vorherigen Listing zu sehen), oder stellen Sie dem Dollarzeichen einen Backslash voran. Dadurch »entwerten« Sie das Sonderzeichen. Auch dies ist Ihnen bereits aus den Tagen zu JavaScript und Perl bekannt.

<?php
$sichtbar = "L'êtat, c'est moi";
$unsichtbar = "\$sichtbar";
?>

Die Variable $unsichtbar enthält jetzt die Zeichenkette »$sichtbar«, und nicht den Wert der Variablen $sichtbar.

Einen Backslash können Sie innerhalb von doppelten Anführungszeichen natürlich auch entwerten - durch einen vorangestellten Backslash:

<?php
print "Die php.ini liegt unter c:\\windows";
?>

Dieses Codestück gibt »Die php.ini liegt unter c:\windows« aus.

Eine weitere besondere Form der Entwertung findet statt, wenn Sie den Backslash vor ein doppeltes Anführungszeichen setzen. Innerhalb eines Strings wird dadurch ein doppeltes Anführungszeichen als Text interpretiert und nicht als Ende des Strings:

<?php
print "Wofür steht \"PHP\" eigentlich?";
?>

Durch den Backslash können nicht nur Sonderzeichen entwertet werden, sondern einige Zeichen erhalten noch eine besondere Bedeutung:

Weitere Variablentypen

Neben Strings gibt es natürlich auch die numerischen Variablen, also entweder ganzzahlige oder Fließkommawerte. Beachten Sie hier, dass es - wie bei fast allen Programmiersprachen - kein (deutsches) Dezimalkomma gibt, sondern einen (insbes. amerikanischen) Dezimalpunkt!

<?php
$php3 = 1997;
$euler = 2.718281828;
?>

Des weiteren sind noch die booleschen Variablen erwähnenswert. Sie kennen zwei Zustände, true (wahr) und false (falsch).

<?php
$t = true;
$f = false;
?>

PHP ist keine typisierte Sprache, das heißt der Typ einer Variablen ist nicht fix, er kann sich also zur Laufzeit des Skripts ohne Weiteres ändern. Ein einfaches Beispiel illustriert dies:

<?php
$euler = 2.718281828; //Variable ist ein Fließkommawert
$euler = "etwa zwei Komma sieben"; //Variable ist jetzt ein String
?>

Arrays

PHP bietet zwei Arten von Arrays. Die erste Art orientiert sich an der klassischen Vorstellung von Arrays: Über einen numerischen Index wird auf ein Array-Element zugegriffen. Der niedrigste Index hat auch hier den Wert 0, und der Index selbst steht in eckigen Klammern:

<?php
$kontinente[0] = "Amerika";
$kontinente[1] = "Afrika";
$kontinente[2] = "Asien";
$kontinente[3] = "Europa";
$kontinente[4] = "Antarktis";
$kontinente[5] = "Australien";
?>

Sie können sich ein wenig Schreibarbeit sparen, indem Sie die Funktion array verwenden. Als Parameter übergeben Sie die einzelnen Werte, die im Array gespeichert werden sollen. Der erste Parameter bekommt dann den Index 0, der zweite den Index 1, und so weiter:

<?php
$kontinente = array("Amerika", "Afrika", "Asien", "Europa",
"Antarktis", "Australien");
?>

Sie können - wie zu sehen - längere Codezeilen beliebig umbrechen. Ausnahme: Innerhalb von Funktionsnamen oder von Werten wie etwa Strings.

Die zweite Art von Array sind assoziative Arrays, also Arrays, bei denen als Index (oder auch Schlüssel) eine beliebige Zeichenkette fungiert und nicht notwendigerweise ein numerischer Wert. Achten Sie bei der Zuweisung aber darauf, dass die Indizes eindeutig sind, denn sonst überschreiben Sie den alten Wert!

<?php
$hauptstadt["Deutschland"] = "Berlin";
$hauptstadt["Ägypten"] = "Kairo";
$hauptstadt["China"] = "Peking";
?>

Auch hier gibt es eine Möglichkeit, sich ein wenig Tipparbeit zu ersparen. Verwenden Sie erneut die array-Funktion, aber geben Sie die Schlüssel mit an, und trennen Sie sie mit => von den entsprechenden Werten.

<?php
$hauptstadt = array("Deutschland"=>"Berlin", "Ägypten"=>"Kairo",
"China"=>"Peking");
?>

Im Zusammenhang mit Arrays ist noch die Funktion count interessant, welche die Anzahl der Elemente im Array zurückliefert. In Tabelle 19.1 sehen Sie die Rückgabewerte von count für die exemplarischen Arrays von oben.

Ausdruck

Wert

count($kontinente)

6

count($hauptstadt)

3

Tabelle 19.2: Die Rückgabewerte von count für die exemplarischen Arrays

Operationen und Operatoren

Variablen einfach statische Werte zuzuweisen ist langweilig. Die Programmierung lebt davon, dass man mit Variablen rechnen kann. Je nach Variablentyp gibt es unterschiedliche Operatoren, die Sie einsetzen können.

Arithmetische Operatoren

Auch heute werden Sie wohl wieder einige Déja-vu-Erlebnisse haben. Die meisten Operatoren kennen Sie noch aus der Grundschule (auch wenn die dort etwas anders aussahen, beispielsweise Malpunkt statt Stern), und den Rest haben Sie bei irgendeiner anderen Programmiersprache schon gesehen. Der Unterschied, und damit auch der Teufel, steckt - wie immer - im Detail. Sollten Sie sich bei der Programmierung nicht so ganz sicher sein, werfen Sie immer wieder einen Blick auf Tabelle 19.3, und sehen Sie nach, welchen Operator Sie bei Ihren Berechnungen benötigen!

Operator

Beschreibung

Beispiel

+

Addition

11 + 4 (ergibt 15)

-

Subtraktion

11 - 4 (ergibt 7)

*

Multiplikation

11 * 4 (ergibt 44)

/

Division

11 / 4 (ergibt 2.75)

%

Rest bei Division

11 % 4 (ergibt 3)

Tabelle 19.3: Die arithmetischen Operatoren von PHP

Zusammen mit dem Vergleichsoperator können Sie nun schon einige Dinge mit Zahlen anstellen:

<?php
$AnzahlWochen = 52;
$TageProWoche = 7;
$TageProJahr = 2 + $AnzahlWochen * $TageProWoche;
print "Ein Schaltjahr hat $TageProJahr Tage";
?>

Sie sehen am Ergebnis (366): Es gilt Punkt-vor-Strich. Die Multiplikation wird also vor der Addition ausgeführt.

Natürlich gibt es bei diesen Operatoren auch wieder die schon aus JavaScript und Perl bekannten Kurzformen:

Kurzform

Ausführliche Schreibweise

Beschreibung

$x++;

$x = $x + 1;

Inkrement

$x--;

$x = $x - 1;

Dekrement

$x += $y;

$x = $x + $y;

Addition

$x -= $y;

$x = $x - $y;

Subtraktion

$x *= $y;

$x = $x * $y;

Multiplikation

$x /= $y;

$x = $x / $y;

Division

$x %= $y;

$x = $x % $y;

Rest bei Divison (Modulo)

Tabelle 19.4: Die Kurzformen der arithmetischen Operatoren von PHP

Vergleichsoperatoren

Ein Vergleich macht meistens nur bei numerischen Werten Sinn, und unter Umständen noch bei Zeichenketten; dort sprich man von einem lexikalischen Vergleich. Ein 'A' ist damit »kleiner« als ein 'B', aufgrund der Position im Alphabet. Das Ergebnis eines Vergleichs ist eine boolesche Variable, also wahr (true) oder falsch (false). PHP kennt die in Tabelle 19.5 aufgeführten Vergleichsoperatoren.

Operator

Beschreibung

Beispiel

>

größer als

2 > 1 (ergibt true)

<

kleiner als

2 < 1 (ergibt false)

>=

größer oder gleich als

2 >= 1 (ergibt true)

<=

kleiner oder gleich als

2 <= 1 (ergibt false)

==

Gleich

2 == 1 (ergibt false)

<>

Ungleich

2 <> 1 (ergibt true)

Tabelle 19.5: Die Vergleichsoperatoren von PHP

Zwei mögliche Fehlerquellen gilt es zu beachten. Erstens, Gleichheit wird durch ein doppeltes Gleichheitszeichen überprüft, nicht durch ein einfaches, das ist eine Zuweisung! Und zweitens, es gibt (im Gegensatz zu Perl) keine eigenen Vergleichsoperatoren für Strings, Sie können also bei PHP Strings mit den Operatoren aus Tabelle 19.5 vergleichen.

Logische Operatoren

Auch mit booleschen Variablen, oder Wahrheitswerten, lassen sich Operationen durchführen. Zuständig hierfür sind die logischen Operatoren, welche Sie in Tabelle 19.6 aufgeführt finden.

Operator

Bedeutung

Beispiel

and

(logisches) Und

true and false (ergibt false)

&&

(logisches) Und

true && false (ergibt false)

or

(logisches) Oder

true or false (ergibt true)

||

(logisches) Oder

true || false (ergibt true)

!

Nicht (Negation)

not true (ergibt false)

xor

Entweder oder

true xor false (ergibt true)

Tabelle 19.6: Die logischen Operatoren von PHP

Wie Sie sehen, sind and und && bzw. or und || ebenbürtig. In der Praxis verwendet man jedoch fast ausschließlich && und ||.

Zeichenkettenoperatoren und -operationen

Mit Zeichenketten können Sie zwar nicht groß rechnen, aber zumindest werden Sie sie hin und wieder konkatenieren (aneinanderhängen) müssen. Als Operator dient hierzu nicht das Plus-Zeichen, sondern - wie in Perl auch - der Punkt. Um eines der ersten Beispiele des heutigen Tages, die Ausgabe einer Handvoll von Variablen, neu aufzuwärmen und etwas kürzer zu fassen, können wir uns dieses Operators bedienen.

Listing 19.6: konkatenation.php

<?php
$begruessung = "Guten Tag!";
$tag = 18;
$thema = "PHP";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Konkatenation</title>
</head>
<body background="white">
<?php
print "<h1>".$begruessung."</h1>\n";
print "Herzlich Willkommen an Tag ".$tag.";\n";
print "das heutige Thema lautet: ".$thema.".\n";
?>
</body>
</html>

Natürlich hätten wir hier auch Interpolation einsetzen können.

Auch für diesen Operator gibt es eine Kurzform: $x .= $y; entspricht $x = $x . $y; - an die Variable $x wird also der Wert der Variablen $y angehängt.

Ansonsten kennt PHP noch eine Reihe von String-Funktionen; eine komplette Übersicht finden Sie unter der URL www.php.net/manual/ref.strings.php. Wir beschränken uns an dieser Stelle auf die wichtigsten Funktionen (wobei wir natürlich eine subjektive Auswahl treffen mussten. In Tabelle 19.7 finden Sie außer dieser Übersicht außerdem noch die entsprechende äquivalente VBScript-Funktion, so dass Sie einen Vergleich haben und Skripte schneller von der einen in die andere Sprache portieren können:

Funktion

Beschreibung

Parameter

VBScript-Äquivalent

strlen(s)

Ermittelt die Länge eines Strings

s - der betrachtete String

Len(s)

strpos(s1, s2)

Ermittelt die erste Position eines Teilstrings in einem längeren String, wobei die Zählung bei 0 beginnt. Der Rückgabewert -1 bedeutet, dass der Teilstring nicht im längeren String enthalten war.

s1 - der zu durchsuchende String

s2 - der zu suchende String

InStr(s1, s2)

strrpos(s1, s2)

Ermittelt die letzte Position eines Teilstrings in einem längeren String, wobei die Zählung bei 0 beginnt. Der Rückgabewert -1 bedeutet, dass der Teilstring nicht im längeren String enthalten war.

s1 - der zu durchsuchende String

s2 - der zu suchende String

InStrRev(s1, s2)

substr(s, a, b)

Liefert einen Teilstring aus einem String zurück, wobei die Zählung bei 0 beginnt.

s - der betrachtete String

a - Startposition des Teilstrings

b - Anzahl der zu ermittelnden Zeichen

Mid(s, a, b)

str_replace(s1, s2, s)

Ersetzt in einem String einen Teilstring durch einen anderen und liefert den ersetzten String zurück

s1 - der zu ersetzende Teilstring

s2 - der Teilstring, durch den ersetzt werden soll

s - der betrachtete String

Replace(s, s1, s2)

Tabelle 19.7: Einige der Zeichenkettenfunktionen von PHP

Im Folgenden ein kleines Beispiel, das den Einsatz dieser Funktionen demonstriert:

Listing 19.7: zeichenketten.php

<?php
$s = "Markt und Technik";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Zeichenkettenfunktionen</title>
</head>
<body bgcolor="white">
<p>
<ul>
<li>
<strong>strlen: </strong>
<?php print strlen($s); ?>
</li>
<li>
<strong>strpos: </strong>
<?php print strpos($s, "n"); ?>
</li>
<li>
<strong>strrpos: </strong>
<?php print strrpos($s, "n"); ?>
</li>
<li>
<strong>substr: </strong>
<?php print substr($s, 6, 3); ?>
</li>
<li>
<strong>str_replace: </strong>
<?php print str_replace("und", "+", $s); ?>
</li>
<li>
<strong>$s: </strong>
<?php print $s; ?>
</li>
</ul>
</p>
</body>
</html>

Abbildung 19.5:  Die Zeichenkettenfunktionen im Einsatz

Beachten Sie, dass sich - wie in der letzten Ausgabezeile in Abbildung 19.5 zu sehen - der Wert der Variablen $s selbst nie ändert, auch durch die Anwendung von str_replace nicht!

Fallunterscheidungen

Egal, welcher Programmiersprache man sich zuwendet: Fast alle haben irgendeine Form von Fallunterscheidung, und bei fast allen gibt es if - so auch in PHP. In Sachen Syntax herrscht fast völlige Gleichheit zu JavaScript und Perl; ein Grund mehr, dieses Thema hier recht kurz abzuhandeln!

Damit wir an dieser Stelle ein halbwegs realistisches Beispiel anbringen können, hier ein kleiner Vorgriff auf später: Die PHP-Funktion getdate liefert ein assoziatives Array zurück. Über den Schlüssel wday erhalten Sie den aktuellen Wochentag als numerischen Wert. 0 steht dabei für Sonntag, 1 für Montag, und so weiter, bis zum Wert 6, der für Samstag steht. Das funktioniert also ganz analog zur Weekday-Funktion von VBScript, nur das letztere einen um 1 höheren Wert für jeden Tag zurückliefert.

<?php
$datum = getdate();
print $datum["wday"];
?>

if-Anweisung

Nun aber zur if-Anweisung selbst. In der kürzesten Form sieht sie folgendermaßen aus:

<?php
if (Bedingung) {
Befehlsblock
}
?>

else-Anweisung

Natürlich gibt es in PHP auch else, das wie folgt eingesetzt wird:

<?php
if (Bedingung) {
Befehlsblock
} else {
Befehlsblock
}
?>

Um das Wochentagsbeispiel von gestern noch einmal aufzuwärmen:

<?php
$datum = getdate();
$tag = $datum["wday"];
if ($tag == 0 || $tag == 6) {
print "Am Wochenende wird nicht gearbeitet!";
} else {
print "Guten Tag, frisch ans Werk!";
}
?>

elseif-Anweisung

Sie wissen bereits, dass viele else-Anweisungen zu unübersichtlichem Code führen (können). Aus diesem Grund gibt es auch in PHP elseif, welches wie folgt eingesetzt wird:

<?php
if (Bedingung) {
Befehlsblock
} elseif (Bedingung) {
Befehlsblock
} elseif (Bedingung) {
...
} else {
Befehlsblock
}
?>

Die letzte else-Anweisung samt folgendem Befehlsblock ist dabei optional.

Zurück zum Wochentagsbeispiel, diesmal ausführlicher und mit elseif:

<?php
$datum = getdate();
$tag = $datum["wday"];
if ($tag == 0 || $tag == 6) {
print "Am Wochenende wird nicht gearbeitet!";
} elseif ($tag == 3 || $tag == 4 || $tag == 5) {
print "Guten Tag, frisch ans Werk!";
} else {
print "So früh in der Woche, und schon surfen?!";
}
?>

switch-Anweisung

Was in VBScript Select Case heißt, heißt in PHP (und auch in JavaScript) switch. Hiermit können Sie eine Variable/einen Ausdruck gegen mehrere mögliche Werte prüfen. Die Syntax ist die folgende:

<?php
switch(Variable) {
case Wert:
Befehlsblock
break;
case Wert:
Befehlsblock
break;
...
default:
Befehlsblock
}
?>

Der Block mit default und dazugehörigem Befehlsblock ist optional. Hier können Sie die Standardbefehle angeben, die abgearbeitet werden sollen, falls die Variable mit keinem der angegebenen Werte übereinstimmt.

Die Anweisung break ist ebenfalls sehr wichtig. Hierdurch wird die switch-Anweisung sofort verlassen, nachdem der entsprechende Befehlsblock abgearbeitet worden ist. Andernfalls würden alle Befehlsblöcke abgearbeitet werden, sobald die Variable mit einem der Werte übereinstimmt. Der PHP-Interpreter geht eine switch-Anweisung zeilenweise durch.

Hiermit kann das Beispiel mit dem Wochentag umgeschrieben werden. Im Gegensatz zu VBScript unterstützt switch jedoch nicht die Angabe von mehreren Werten innerhalb einer einzelnen case-Anweisung! Sie müssen also jeden Wert einzeln angeben.

<?php
$datum = getdate();
$tag = $datum["wday"];
switch ($tag){
case 0: print "Sonntag, Zeit zu rasten"; break;
case 1: print "Montag, Arbeitsbeginn"; break;
case 2: print "Dienstag, immer noch Arbeit"; break;
case 3: print "Mittwoch, Wochenmitte"; break;
case 4: print "Donnerstag, Woche fast rum"; break;
case 5: print "Freitag, letzter Arbeitstag"; break;
default: print "Samstag, endlich Wochenende";
}
?>

Mischung mit HTML-Code

Alle bis dato vorgestellten Fallunterscheidungen haben einen kleinen, aber feinen Nachteil. Die jeweiligen Befehlsblöcke können nur PHP-Anweisungen enthalten, aber keinen HTML-Code. Wenn Sie beides mischen wollen, müssen Sie eine spezielle Version dieser Anweisungen einsetzen. Dazu gibt es zwei grobe Grundregeln: Zum einen muss die Anweisung (z.B. if, else) mit einem Doppelpunkt enden, und zum andern gibt es eine besondere Anweisung am Ende, die mit end beginnt (z.B. endif). Die geschweiften Klammern entfallen dafür.

Werfen wir einmal einem Blick hierauf, und beginnen bei der if-Anweisung:

<?php
$datum = getdate();
$tag = $datum["wday"];
if ($tag == 0 || $tag == 6) :
?>
Am Wochenende wird nicht gearbeitet!
<?php
elseif ($tag == 3 || $tag == 4 || $tag == 5) :
?>
Guten Tag, frisch ans Werk!
<?php
else :
?>
So früh in der Woche, und schon surfen?!
<?php
endif;
?>

Nach if (Bedingung), elseif (Bedingung) und else kommt ein Doppelpunkt. Die Anweisung wird mit endif beendet. Dazwischen ist jeder HTML-Code erlaubt.

Auch die switch-Anweisung hat diese alternative Form:

<?php
$datum = getdate();
$tag = $datum["wday"];
switch ($tag) :
case 0: ?> Sonntag, Zeit zu rasten <?php break;
case 1: ?> Montag, Arbeitsbeginn <?php break;
case 2: ?> Dienstag, immer noch Arbeit <?php break;
case 3: ?> Mittwoch, Wochenmitte <?php break;
case 4: ?> Donnerstag, Woche fast rum <?php break;
case 5: ?> Freitag, letzter Arbeitstag <?php break;
default: ?> Samstag, endlich Wochenende <?php
endswitch;
?>

Weitere Informationen über die alternative Syntax finden Sie unter www.php.net/manual/control-structures.alternative-syntax.php.

Schleifen

Wie Sie bereits aus den vorhergehenden Kapiteln wissen, dienen Schleifen zu weitaus mehr als zur reinen Tippersparnis bei der Programmierung. Auch PHP bietet eine Reihe von Schleifen an, und die gute Nachricht: Als JavaScript- und Perl-Experte kennen Sie alle. Aus diesem Grund können wir uns hier wieder ziemlich kurz fassen. Und noch eine gute Nachricht: Nach diesem Abschnitt lassen wir die Theorie hinter uns und steigen endlich in die Praxis ein!

for-Schleife

Die for-Schleife dient primär zur wiederholten Ausführung eines Befehlsblocks. Dabei werden drei Parameter angegeben: Eine Start-Anweisung, eine Bedingung, die vor jeder Ausführung der Schleife überprüft wird, sowie eine Anweisung, die nach jedem Schleifendurchlauf ausgeführt wird. Folgender Code beispielsweise wiederholt die Argumentationsanregung zur Gehaltsverhandlung vom gestrigen Tage und gibt die Geldforderung zehnmal aus:

Listing 19.8: gehalt1.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Ich will mehr Gehalt</title>
</head>
<body bgcolor="white">
<p>
<?php
for ($i = 1; $i <= 10; $i++) {
print "Ich will mehr Gehalt <br />";
}
?>
</p>
</body>
</html>

Auch hier gibt es wieder eine alternative Syntax; Weitere Informationen darüber finden Sie unter der bereits einmal aufgeführten URL www.php.net/manual/control- structures.alternative-syntax.php, oder werfen Sie ein Beispiel auf folgenden Code:

Listing 19.9: gehalt2.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Ich will mehr Gehalt</title>
</head>
<body bgcolor="white">
<p>
<?php
for ($i = 1; $i <= 10; $i++) :
?>
Ich will mehr Gehalt <br />
<?php
endfor;
?>
</p>
</body>
</html>

Abbildung 19.6:  Gehaltsverhandlungen mit PHP - ob's funktioniert?

In der Praxis wird die Zählvariable, die im ersten Teil der Klammer nach for initialisiert wird, innerhalb der Schleife verwendet. Beispielsweise gibt folgendes Skript die Buchstaben einer Zeichenkette einzeln aus und verwendet dabei eine Schleife:

Listing 19.10: pappenheimer.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Pappenheimer</title>
</head>
<body bgcolor="white">
<p>
<?php
$p = "Pappenheimer";
for ($i = 0; $i < strlen($p); $i++) :
?>
Das <?=$i ?>. Zeichen ist: <?=substr($p, $i, 1) ?>
<br />
<?php
endfor;
?>
</p>
</body>
</html>

while-Schleife

Bei der while-Schleife wird am Anfang jedes Schleifendurchlaufs eine Bedingung überprüft. Solange diese Bedingung erfüllt ist, wird der Anweisungsblock innerhalb der Schleife ausgeführt:

Listing 19.11: gehalt3.php

<?php
$i = 0;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Ich will mehr Gehalt</title>
</head>
<body bgcolor="white">
<p>
<?php
while ($i < 10) {
print "Ich will mehr Gehalt <br />";
$i++;
}
?>
</p>
</body>
</html>

Auch von dieser Schleife gibt es eine alternative Syntax:

Listing 19.12: gehalt4.php

<?php
$i = 0;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Ich will mehr Gehalt</title>
</head>
<body bgcolor="white">
<p>
<?php
while ($i < 10) :
?>
Ich will mehr Gehalt <br />
<?php
$i++;
endwhile;
?>
</p>
</body>
</html>

Abbildung 19.7:  Mehr Gehalt - dank while/endwhile

do-while-Schleife

Die do-while-Schleife ähnelt der while-Schleife sehr. Es gibt nur zwei augenscheinliche Unterschiede. Zunächst einmal wird die Bedingung erst nach Ausführung des Anweisungsblocks überprüft (die Schleife wird also mindestens einmal durchlaufen), und zweitens gibt es keine alternative Syntax. Ansonsten bringt diese Schleife aber auch nicht viel Neues.

Listing 19.13: gehalt5.php

<?php
$i = 0;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Ich will mehr Gehalt</title>
</head>
<body bgcolor="white">
<p>
<?php
do {
print "Ich will mehr Gehalt <br />";
$i++;
} while ($i < 10)
?>
</p>
</body>
</html>

foreach-Schleife

Sie kennen foreach-Konstrukte aus JavaScript (heißt dort for in), ASP (For Each) und Perl, und deswegen haben Sie wohl schon eine Vermutung, wozu diese Schleife eingesetzt wird: Zum Durchschreiten einer Auflistung oder einer Kollektion. Beispielsweise können Sie auf alle Elemente eines Arrays zugreifen. Diese Funktion wurde übrigens erst in PHP-Version 4 eingeführt, unter PHP 3 war dies noch völlig unbekannt.

Zunächst einmal können Sie alle Werte eines Arrays mit einer Schleife und wenig zusätzlichem Aufwand ausgeben:

<?php
$kontinente = array("Amerika", "Afrika", "Asien", "Europa",
"Antarktis", "Australien");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>foreach</title>
</head>
<body bgcolor="white">
<table border="2" cellpadding="5">
<?php
foreach ($kontinente as $k) {
print "<tr><td>$k</td></tr>";
}
?>
</table>
</body>
</html>

Abbildung 19.8:  Die sechs Kontinente - ausgegeben mit foreach

Die zweite Variante der foreach-Schleife greift bei assoziativen Arrays: Sie erhalten die einzelnen Schlüssel des Arrays und die Werte dazu:

Listing 19.14: hauptstaedte1.php

<?php
$hauptstadt = array("Deutschland"=>"Berlin", "Ägypten"=>"Kairo",
"China"=>"Peking");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>foreach</title>
</head>
<body bgcolor="white">
<table border="2" cellpadding="5">
<?php
foreach ($hauptstadt as $land => $stadt) {
print "<tr><td>$land</td><td>$stadt</td></tr>";
}
?>
</table>
</body>
</html>

Abbildung 19.9:  Auch assoziative Arrays können mit foreach ausgegeben werden

Auch von dieser, letzten, Schleife gibt es eine alternative Form. Wie üblich: Die foreach- Anweisung endet mit einem Doppelpunkt, und am Ende des Anweisungsblocks kommt endforeach.

Listing 19.15: hauptstaedte2.php

<?php
$hauptstadt = array("Deutschland"=>"Berlin", "Ägypten"=>"Kairo",
"China"=>"Peking");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>foreach</title>
</head>
<body bgcolor="white">
<table border="2" cellpadding="5">
<?php
foreach ($hauptstadt as $land => $stadt) :
?>
<tr><td><?=$land ?></td><td><?=$stadt ?></td></tr>
<?php
endforeach;
?>
</table>
</body>
</html>

Damit sind wir am Ende der PHP-Spracheinführung angelangt. Doch wir haben noch nicht das Ende des heutigen Tags erreicht, denn jetzt steigen wir erst richtig in die Materie ein und führen einige Standardbeispiele vor. Schnallen Sie sich also an!

19.3 Datumswerte

Es ist schon ein Unterschied, ob man serverseitig oder clientseitig programmiert. Nicht nur, dass serverseitige Programmierung ein wenig mehr Können voraussetzt - die Anforderungen an den Server sind ungleich größer. Aus Sicherheitsbedenken, oder auch aus Bequemlichkeit, ist bei vielen Hosting-Paketen keine Unterstützung von serverseitigen Technologien dabei. Oder, aus der anderen Sicht betrachtet: Bei Billigangeboten rechnet sich für den Hoster der zusätzliche administrative Aufwand einfach nicht.

Wenn es aber soweit ist, sprich, man hat serverseitige Mittel wie eben PHP zur Verfügung, fängt das große Kopfkratzen oft erst an. Was will ich überhaupt serverseitig? Und vor allem, was lässt sich vergleichsweise schnell und unauffällig umsetzen? Die Antwortet lautet sehr oft: Gib zumindest einmal das aktuelle Tagesdatum aus. Klar, das geht auch mit JavaScript, aber das setzt eben gewisse Anforderungen an den Client (JavaScript muss aktiviert sein, Browser muss eine bestimmte Versionsnummer haben), und darüber haben Sie keine Kontrolle. Sie haben aber Kontrolle über den Server (hoffentlich).

Sie sind heute schon einmal mit der Funktion getdate in Berührung gekommen. Diese gibt ein assoziatives Array zurück, über das sie einzelne Informationen über das aktuelle Tagesdatum (beispielsweise Tag, Monat, Jahr) herausbekommen können. Werfen wir zunächst einen Blick darauf, was genau in diesem Array alles steht. Hierbei hilft uns foreach:

Listing 19.16: getdate.php

<?php
$datum = getdate();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>getdate</title>
</head>
<body bgcolor="white">
<table border="2" cellpadding="5">
<?php
foreach ($datum as $schluessel => $wert) :
?>
<tr><td><?=$schluessel ?></td><td><?=$wert ?></td></tr>
<?php
endforeach;
?>
</table>
</body>
</html>

Abbildung 19.10:  Alle Werte im von getdate zurückgelieferten Array

Führen Sie obiges Skript einmal bei sich aus, und versuchen Sie dann, die Bedeutung der einzelnen Werte (bzw. deren Schlüssel) zu interpretieren. Fertig? Dann vergleichen Sie doch Ihre Ergebnisse mit der »offiziellen« Lösung in Tabelle 19.8.

Schlüssel

Beschreibung

Rückgabewert am 24.12.2001, 23:45:56 Uhr

Seconds

Sekunde

56

Minutes

Minute

45

Hours

Stunde

23

Mday

Tag

24

Wday

Wochentag (0=Sonntag, 6=Samstag)

1

Mon

Monat

12

Year

Jahr

2001

Yday

Tag im Jahr (fortlaufend gezählt)

358

Weekday

Wochentag als (englischer) Text

Monday

Month

Monat als (englischer) Text

December

Tabelle 19.8: Datumsinformationen in getdate

Wenn Sie mehr über eine Funktion herausfinden wollen, hilft Ihnen das Online-Manual zu PHP weiter. Sie können direkt zu den meisten Funktionen springen, indem Sie die URL www.php.net/Funktionsname aufrufen. Beispielsweise erfahren Sie mehr zu getdate, wenn Sie www.php.net/getdate aufrufen. Sie werden dann automatisch zur »richtigen« URL, in diesem Falle www.php.net/manual/function.getdate.php, weitergeleitet.

Somit ist es nun ein Leichtes, ein schön formatiertes Datum auszugeben. Als kleines Extra übersetzen wir die Monats- und Tagesnamen vom Englischen ins Deutsche. Die erste Möglichkeit besteht darin, in einem normalen Array die numerischen Werte auf Strings abzubilden:

Listing 19.17: datum.php

<?php
$monatsnamen = array("", "Januar", "Februar", "M&auml;rz",
"April", "Mai", "Juni", "Juli", "August",
"September", "Oktober", "November", "Dezember");
$tagesnamen = array("Sonntag", "Montag", "Dienstag", "Mittwoch",
"Donnerstag", "Freitag", "Samstag");
$datum = getdate();
$anzeige = $tagesnamen[$datum["wday"]];
$anzeige .= ", der ";
$anzeige .= $datum["mday"] . ". ";
$anzeige .= $monatsnamen[$datum["mon"]] . " ";
$anzeige .= $datum["year"] . ", ";
$anzeige .= $datum["hours"] . ":";
$anzeige .= $datum["minutes"] . ":";
$anzeige .= $datum["seconds"] . " Uhr.";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Tagesdatum</title>
</head>
<body bgcolor="white">
<p>Guten Tag! Heute ist <?php print $anzeige; ?></p>
</body>
</html>

Abbildung 19.11:  Das aktuelle, formatierte Datum

Alternativ können Sie auch ein assoziatives Array einsetzen, um die englischen auf die deutschen Bezeichnungen umzusetzen. Der Rest des Skripts funktioniert dann analog, Sie müssen nur bei Wochentag und Monat die richtigen Schlüssel für das Rückgabearray von getdate wählen.

Listing 19.18: datum_assoziativ.php

<?php
$monatsnamen = array("January" => "Januar", "February" => "Februar",
"March" => "M&auml;rz", "April" => "April",
"May" => "Mai", "June" => "Juni",
"July" => "Juli", "August" => "August",
"September" => "September",
"October" => "Oktober", "November" => "November",
"December" => "Dezember");
$tagesnamen = array("Sunday" => "Sonntag", "Monday" => "Montag",
"Tuesday" => "Dienstag","Wednesday" => "Mittwoch",
"Thursday" => "Donnerstag", "Friday" => "Freitag",
"Saturday" => "Samstag");
$datum = getdate();
$anzeige = $tagesnamen[$datum["weekday"]];
$anzeige .= ", der ";
$anzeige .= $datum["mday"] . ". ";
$anzeige .= $monatsnamen[$datum["month"]] . " ";
$anzeige .= $datum["year"] . ", ";
$anzeige .= $datum["hours"] . ":";
$anzeige .= $datum["minutes"] . ":";
$anzeige .= $datum["seconds"] . " Uhr.";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Tagesdatum</title>
</head>
<body bgcolor="white">
<p>Guten Tag! Heute ist <?php print $anzeige; ?></p>
</body>
</html>

19.4 Auf Formulare zugreifen

Richtig interessant wird PHP aber erst, wenn Sie Formulareingaben verarbeiten können und somit Interaktion mit Ihren Benutzern erst ermöglicht wird. Bei PHP ist dies deutlich einfacher als bei JavaScript, Perl und ASP, zumindest war es das. Es gibt aber Bestrebungen, den Aufwand für den Programmierer wieder ein wenig zu vergrößern. Warum dies so ist, erfahren Sie in den folgenden Abschnitten.

Allgemeines

Unter Version 3 von PHP war das Formularhandling sehr, sehr bequem, und auch besonders leicht zu erlernen. Nehmen wir einmal an, Sie haben ein Formularelement mit name-Attribut »Pappenheimer«. Dann können Sie wie folgt auf das zugehörige value- Attribut zugreifen: $Pappenheimer.

Sie haben richtig gelesen. Das name-Attribut ist gleichzeitig Namensgeber für die dazugehörige Variable. Sie müssen nun zwar für die name-Attribute einige gesonderte Regeln beachten, beispielsweise keine Leer-, Sonderzeichen oder Bindestriche, aber ansonsten funktioniert das ganz tadellos. Sehen Sie selbst:

Listing 19.19: post.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Formulare</title>
</head>
<body bgcolor="white">
<h3>Formularwerte</h3>
<p>
<?php
print "<strong>Vorname</strong>: $vorname<br />";
print "<strong>Nachname</strong>: $nachname<br />";
print "<strong>E-Mail</strong>: $email<br />";
Next
?>
</p>
<h3>Formular (POST)</h3>
<p>
<form method="post">
<input type="text" name="vorname" size="20" />Vorname<br />
<input type="text" name="nachname" size="20" />Nachname<br />
<input type="text" name="email" size="20" />E-Mail<br />
<input type="submit" name="submit" value="Abschicken" />
</form>
</p>
</body>
</html>

Abbildung 19.12:  Formulareingaben können mit PHP einfach erfasst werden

Wie Sie auch aus Abbildung 19.12 entnehmen können, funktioniert obiger Code entsprechend den analogen ASP-Beispielen. Das action-Attribut des Formulars bleibt leer, dadurch wird das Formular auf das aktuelle Skript verschickt.

In der Variablen $PHP_SELF steht die URL der aktuellen Seite, Sie könnten also auch action="<?php print $PHP_SELF; ?>" im <form>-Tag verwenden. Diesen Tipp finden Sie allerorten, aber hier ist er - wie oben ausgeführt - schlichtweg unnötig!

So weit, so gut. Das mit den bequemen Variablennamen geht so weit, dass Sie auch auf Cookies auf dieselbe Art und Weise zugreifen können. Dies erinnert also entfernt an das Objekt Request vom gestrigen Tag (ASP): auch hier konnten Sie auf alle Formularvariablen zugreifen (egal ob das Formular via POST oder GET verschickt worden ist), sowie auf Cookies.

Der Nachteil an der ganzen Sache war und ist jedoch die Manipulierbarkeit. Stellen Sie sich vor, Sie programmieren einen geschützten Bereich mit PHP, und übergeben zur Authentifizierung der Benutzer irgendwelche geheimen Daten (seinen Benutzernamen, seine Kundennummer) als verstecktes Formularfeld oder als Cookie. Ein Wort vorweg: Mit etwas Aufwand kann der Benutzer auch selbst lokale Cookies anlegen. Sie fragen nun mit PHP den Wert im Cookie ab und gewähren bei Übereinstimmung mit einem bestimmten Wert den Zutritt zum geschützten Bereich. So weit, so gut, aber da Sie Cookies genauso wie POST-Daten und ebenfalls genauso wie GET-Variablen abfragen können, lässt sich dieser Mechanismus ganz einfach austricksen: Der Hacker übergibt die Daten einfach als Teil der URL, also via GET. Er ruft also nicht beispielsweise login.php auf, sondern login.php?benutzer=erik. Und schon nimmt Ihr Skript an, der Benutzer hat ein Cookie namens »benutzer« bei sich gespeichert, das den Wert »erik« hat.

In PHP 4 gibt es diese Vereinfachung immer noch. Allerdings gibt es in der php.ini jetzt besonders hervorgehoben einen Wert register_globals. Dieser ist in der Standard- Version der php.ini auf On gesetzt, in der optimierten Version (php.ini-optimized) auf Off. Was bedeutet dies nun? Setzen Sie den Wert auf On, können Sie weiterhin über die kurzen Variablennamen auf die Formularwerte zugreifen. Ist Off eingestellt, so haben Sie nur noch die folgenden Möglichkeiten:

Inzwischen lautet die offizielle Empfehlung, die assoziativen Arrays zu verwenden. Auf fast jedem PHP-Kongress wird diese Forderung mehr oder weniger laut vorgebracht. Das Problem liegt jedoch darin, dass die meisten Anwendungen weltweit noch die »alte Methode« einsetzen, und es ist ein ziemlicher Aufwand, das Ganze umzuschreiben. So wird auch noch über längere Zeit hinweg eine Abwärtskompatibilität gegeben sein. Wenn Sie allerdings Anwendungen schreiben wollen, die auch noch in ferner Zukunft laufen, sollten Sie auf die Arrays zurückgreifen. Und auch, wenn register_globals auf On gestellt ist, können Sie die Variablen dennoch verwenden. Wir werden uns deswegen heute an die Arrays halten.

Unterschiede bei den einzelnen Formularelementen

Wie bei ASP gilt auch hier, dass es bei den einzelnen Typen von Formularfeldern Unterschiede in der Handhabung innerhalb von PHP gibt. Dies gilt bei PHP umso stärker, wie Sie im Folgenden auch sehen werden. Ein Wort vorab noch: Wir verwenden als Versendemethode immer POST, und greifen dementsprechend auf $HTTP_POST_VARS zu. Natürlich können Sie dieselben Techniken mit GET einsetzen, Sie müssen dann lediglich an den entsprechenden Stellen mit $HTTP_GET_VARS arbeiten.

Textfelder / Passwortfelder / unsichtbare Felder

Auch an dieser Stelle gibt es nichts Neues: $name liefert das value-Attribut des Elements mit name-Attribut name. Die folgenden Formularelemente sind hiervon betroffen:

Beispiel:

Sie haben als E-Mail-Adresse
<?php print $HTTP_POST_VARS["email"]; ?>
angegeben!

Auswahllisten

Bei normalen Auswahllisten gibt es auch hier kein Problem. Über $name erhalten Sie das value-Attribut des ausgewählten Elements der Auswahlliste mit name-Attribut name:

<p>Sie haben den folgenden Wert ausgew&auml;hlt:<br />
<?php print $name; ?></p>

Wenn Sie keinen value-Wert bei einer Option der Auswahlliste angeben, verwenden die meisten Browser die Beschriftung der Option als value-Attribut - aber darauf sollten Sie sich nicht verlassen.

Eine Besonderheit gibt es jedoch bei Mehrfach-Auswahllisten, die Sie mit <select multiple> erzeugen können. Damit Sie bei PHP auf alle ausgewählten Elemente zugreifen müssen, muss der HTML-Code angepasst werden. Das name-Attribut muss auf [] enden:

<select name="kontinente[]" multiple size="6">
<option value="Amerika">Amerika</option>
<option value="Afrika">Afrika</option>
<option value="Asien">Asien</option>
<option value="Europa">Europa</option>
<option value="Antarktis">Antarktis</option>
<option value="Australien">Australien</option>
</select>

Durch die eckigen Klammern wird dem PHP-Interpreter angezeigt, dass an dieser Stelle nicht nur ein Wert übergeben wird, sondern ein ganzes Array. Mit einer for-Schleife können Sie dann alle ausgewählten Werte ausgeben:

<p>
Sie haben die folgenden Kontinente bereits besucht: <br />
<?php
for ($i=0; $i<count($HTTP_POST_VARS["kontinente"]); $i++) {
print $HTTP_POST_VARS["kontinente"][$i] . "<br />";
}
</p>

Abbildung 19.13:  Eine mögliche Ausgabe im Browser

Checkboxen

Bei der Behandlung von Checkboxen tut man sich wiederum ein wenig leichter. Über das name-Attribut kommt man an das value-Attribut heran. Sie können nun einfach überprüfen, ob eine Checkbox angekreuzt worden ist oder nicht:

<?php
if ($HTTP_POST_VARS["Name"] != "") {
print "Checkbox angekreuzt!";
} else {
print "Checkbox nicht angekreuzt!";
}
?>

Sie können alternativ auch noch die PHP-Funktion isset verwenden. Diese liefert true zurück, wenn eine Variable bereits mit einem Wert belegt worden ist, ansonsten false:

<?php
if (isset($HTTP_POST_VARS["Name"])) {
print "Checkbox angekreuzt!";
} else {
print "Checkbox nicht angekreuzt!";
}
?>

Radiobuttons

Da von einer Gruppe von Radiobuttons jeweils nur einer ausgewählt werden darf, gestaltet sich hier die Angelegenheit recht unkompliziert. Wie üblich: Über das name-Attribut der Gruppe erhält man das value-Attribut des angeklickten Radiobuttons.

Sie haben den Radiobutton 
<?php print $HTTP_POST_VARS["Name"]; ?>
ausgew&auml;hlt!

Datei-Uploads

Kommen wir nun zu einem der großen Vorteile von PHP gegenüber ASP. Sie benötigen keine Zusatzkomponenten, um Datei-Uploads durchzuführen. Definieren Sie zunächst ein Datei-Upload-Formularelement in Ihrem HTML-Code:

<input type="file" name="datei" />

Sie müssen als Versendemethode POST einstellen; ebenso müssen Sie enctype="multipart/form-data" setzen!

Wenn Sie das Formular abschicken, passiert Folgendes:

Bevor Sie mit diesem Formularelement herumexperimentieren, sollten Sie zunächst einen Blick auf Ihre php.ini werfen. Drei Einstellungen bedürfen einer besonderen Betrachtung:

Nun können Sie loslegen. Da die temporäre Datei nach Abarbeitung des PHP-Skripts gelöscht wird, müssen Sie sie innerhalb des Skripts an eine andere Stelle kopieren, wenn Sie sie behalten wollen.

Zur Theorie: In obigem HTML-Beispiel hatte das Formularelement für den Datei-Upload das name-Attribut »datei«. Ihnen stehen dann (bei register_globals = On) die folgenden Variablen zur Verfügung (nur unter PHP3!):

Aus oben ausgeführten Gründen sollten Sie jedoch wieder auf die entsprechenden assoziativen Arrays zugreifen - und hier müssen Sie es sogar (bei PHP 4). Für Datei- Uploads zuständig ist $HTTP_POST_FILES. Ihnen stehen dann die folgenden Werte zur Verfügung:

Mit der Funktion move_uploaded_file können Sie dann die Datei an eine andere Position verschieben.

Folgender Code führt das einmal vor: Eine Datei wird zum Webserver übertragen, in das Hauptverzeichnis des Webservers kopiert, und dann angezeigt. Passen Sie das Hauptverzeichnis Ihres Webservers auf dem lokalen System entsprechend an.

Listing 19.20: upload.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Datei-Upload</title>
</head>
<body bgcolor="white">
<h3>Datei-Upload</h3>
<p>
<?php
if (is_uploaded_file($HTTP_POST_FILES["datei"]["tmp_name"])) {
$dateiname = $HTTP_POST_FILES["datei"]["name"];
move_uploaded_file($HTTP_POST_FILES["datei"]["tmp_name"],
"c:\\inetpub\\wwwroot\\$dateiname");
print "<img src='$dateiname' />";
}
?>
</p>
<p>
<form method="post" enctype="multipart/form-data">
<input type="file" name="datei" />
<br />
<input type="submit" name="submit" value="Abschicken" />
</form>
</p>
</body>
</html>

Die Funktion is_uploaded_file überprüft, ob eine angegebene Datei auch wirklich via HTTP-File-Upload an den Server übertragen worden ist - ein weiteres Sicherheitsfeature.

Abbildung 19.14:  Die Grafik wurde vom Benutzer auf den Webserver übertragen

Achten Sie darauf, übertragene Grafiken in einem eigenen Verzeichnis abzulegen, damit Sie nicht eigene Dateien überschreiben!

Wenn Sie mehrere Dateien auf einmal übertragen möchten, müssen Sie allen Datei- Upload-Formularelementen dasselbe name-Attribut geben, und - ähnlich wie bei den Auswahllisten - muss dieses auf [] enden. Sie können dann auf die einzelnen Attribute über den Index zugreifen: $HTTP_POST_FILES["tmp_name"][0], $HTTP_POST_FILES["tmp_name"] [1], ...

Weitere Informationen zum Datei-Upload unter PHP finden Sie im Online-Manual unter www.php.net/manual/features.file-upload.php.

Versende-Schaltflächen

Auch bei diesem Formularelement gilt: Sag mir, wie Du heißt (name-Attribut), und ich sag Dir, wer Du bist (value-Attribut). Sie können das name-Attribut dazu verwenden, um herauszufinden, ob eine Seite direkt per URL aufgerufen worden ist, oder ob ein Formular an die aktuelle Seite versandt worden ist (analog zum gestrigen Tag, ASP):

<?php
if ($HTTP_POST_VARS["Versendebutton"] == "Abschicken") {
// Formulardaten verarbeiten
} else {
// Formular anzeigen
}
?>

Praxisbeispiele

Nachdem Sie nun einen Überblick über alle Formularelemente sowie ihre Behandlung in PHP gewonnen haben, können (und sollten) Sie nun Ihr Wissen in der Praxis anwenden. Im Folgenden ein paar exemplarische Aufgabenstellungen und ihre Lösung - mit PHP.

Anzeige aller übertragenen Daten

Um alle Formulardaten anzuzeigen, können Sie natürlich eine simple for-Schleife oder eine foreach-Schleife verwenden, aber Sie haben größere Möglichkeiten der Einflussnahme, wenn Sie auf die einzelnen Elemente direkt zugreifen.

Listing 19.21: daten_anzeigen.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Formulare</title>
</head>
<body bgcolor="white">
<?php
if ($HTTP_POST_VARS["submit"] == "Abschicken") :
?>
<h3>Formularwerte</h3>
<p>
<?php
switch ($HTTP_POST_VARS["Geschlecht"]) {
case "m":
$anrede = "Herr"; break;
case "f":
$anrede = "Frau"; break;
default:
$anrede = "Herr/Frau";
}

print "Hallo $anrede ";
print $HTTP_POST_VARS["Vorname"] . " ";
print $HTTP_POST_VARS["Nachname"] . "!<br />"
?>
Sie setzen die folgenden Betriebssysteme ein:
<?php
if (isset($HTTP_POST_VARS["Windows"])) {
print "Windows ";
}
if (isset($HTTP_POST_VARS["Linux"])) {
print "Linux ";
}
?>
<br />Sch&ouml;n, dass Ihnen Tag
<?php print $HTTP_POST_VARS["Tag"]; ?>
so gut gef&auml;llt.
</p>
<?php
else :
?>
<h3>Formular (POST)</h3>
<p>
<form method="post">
<input type="text" name="Vorname" size="20" />Vorname<br />
<input type="text" name="Nachname" size="20" />Nachname<br />
<input type="radio" name="Geschlecht" value="m">m&auml;nnlich
<input type="radio" name="Geschlecht" value="f">weiblich<br />
Ich nutze
<input type="checkbox" name="Windows" value="ja">Windows
<input type="checkbox" name="Linux" value="ja">Linux<br />
<select name="Tag" size="1">
<?php
for ($i=1; $i<=21; $i++) :
?>
<option value="<?=$i ?>"><?=$i ?></option>
<?php
endfor;
?>
</select>Dieser Tag gef&auml;llt mir am Besten<br />
<input type="submit" name="submit" value="Abschicken" />
</form>
</p>
<?php
endif;
?>
</body>
</html>

Abbildung 19.15:  Die Formulardaten werden ausgelesen und interpretiert

Vollständigkeitsüberprüfung

Daten ausgeben ist eine Sache - aber da gibt es interessantere Anwendungsgebiete. Oft zitiert, oft implementiert und auch gestern schon einmal ein Thema war die Vollständigkeitsüberprüfung von Formularangaben. Nur vollständige Daten sind marketingrelevante Daten, und mit PHP haben Sie ein probates Mittel, zumindest einmal zu überprüfen, ob nicht etwas fehlt. Eine Logiküberprüfung, ob die eingegebenen Daten auch sinnvoll sind, ist ungleich komplexer, und in manchen Bereichen auch so gut wie unmöglich.

Listing 19.22: vollstaendig.php

<?php
$vollstaendig = false;
if ($HTTP_POST_VARS["submit"] == "Abschicken") {
$vollstaendig = true;

if (!isset($HTTP_POST_VARS["Geschlecht"])) {
$vollstaendig = false;
}
if (!isset($HTTP_POST_VARS["Vorname"])) {
$vollstaendig = false;
}
if (!isset($HTTP_POST_VARS["Nachname"])) {
$vollstaendig = false;
}
if (!isset($HTTP_POST_VARS["Windows"]) &&
!isset($HTTP_POST_VARS["Linux"])) {
$vollstaendig = false;
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Formulare</title>
</head>
<body bgcolor="white">
<h3>Formularversand</h3>
<p>
<?php
if ($vollstaendig) :
?>
Danke f&uuml;r Ihre Angaben
<?php
else :
?>
<form method="post">
<input type="text" name="Vorname" size="20" />Vorname<br />
<input type="text" name="Nachname" size="20" />Nachname<br />
<input type="radio" name="Geschlecht" value="m">m&auml;nnlich
<input type="radio" name="Geschlecht" value="f">weiblich<br />
Ich nutze
<input type="checkbox" name="Windows" value="ja">Windows
<input type="checkbox" name="Linux" value="ja">Linux<br />
<select name="Tag" size="1">
<?php
for ($i=1; $i<=21; $i++) :
?>
<option value="<?=$i ?>"><?=$i ?></option>
<?php
endfor;
?>
</select>Dieser Tag gef&auml;llt mir am Besten<br />
<input type="submit" name="submit" value="Abschicken" />
</form>
<?php
endif;
?>
</p>
</body>
</html>

Anstelle der lapidaren Danksagung für das Ausfüllen des Formulars können Sie natürlich den Benutzer auch auf eine entsprechend gestaltete Dankesseite umleiten. Sie benötigen dazu die folgende Funktion:

<?php
header("Location: Umleitungs-URL");
?>

Beachten Sie, dass Sie - wie bei Response.Redirect in ASP - dieses Kommando vor der allerersten HTML-Ausgabe setzen müssen, sonst gibt es eine Fehlermeldung!

Aus Platzgründen hier nur der Code vor <!DOCTYPE; der restliche Code bleibt im Vergleich zu obigem Listing unverändert.

Listing 19.23: weiterleitung.php (Ausschnitt)

<?php
$vollstaendig = false;
if ($HTTP_POST_VARS["submit"] == "Abschicken") {
$vollstaendig = true;

if (!isset($HTTP_POST_VARS["Geschlecht"])) {
$vollstaendig = false;
}
if (!isset($HTTP_POST_VARS["Vorname"])) {
$vollstaendig = false;
}
if (!isset($HTTP_POST_VARS["Nachname"])) {
$vollstaendig = false;
}
if (!isset($HTTP_POST_VARS["Windows"]) &&
!isset($HTTP_POST_VARS["Linux"])) {
$vollstaendig = false;
}

if ($vollstaendig) {
header("Location: danke.php");
}
}
?>

19.5 Mit Dateien arbeiten

PHP bietet mannigfaltige Methoden des Dateizugriffs. Beispielsweise können Sie nicht nur auf lokale Dateien zugreifen, sondern auch auf Dateien, die Sie über HTTP oder FTP erreichen können. Wir wollen uns an dieser Stelle jedoch auf eine kleine Praxisanwendung beschränken: Das Schreiben von Formulardaten in eine Textdatei. Dies ist ein kostengünstiger Ersatz zu einer Datenbank, welche viele Hoster nur gegen Aufpreis anbieten. Sollten Sie am Thema Datenbanken interessiert sein - übermorgen erfahren Sie mehr!

Um in eine Datei zu schreiben, müssen Sie zunächst eine Verbindung zu dieser Datei öffnen. Sie haben dazu zwei Möglichkeiten:

Wie immer bei Dateioperationen der wichtige Hinweis: Sie benötigen Schreibrechte in das Verzeichnis, in dem Sie Dateien anlegen wollen!

Nach einer der obigen beiden Operationen enthält die Variable $datei einen numerischen Wert, das sogenannte Datei-Handle. Über diesen Wert können Sie nun in die Datei schreiben. Dazu dient die Funktion fputs, die zwei Parameter erwartet: Das Datei-Handle, sowie den zu schreibenden Text. Mit fclose wird das Datei-Handle wieder geschlossen.

Kommen wir nun zu obigem Formular zurück. Aufgabe ist es, die Werte, die ins Formular eingegeben werden, in eine Textdatei zu schreiben. Als Trennzeichen zwischen den einzelnen Werten dient der Tabulator (»\t«), denn dann können Sie die Textdatei einfach in Excel, Access etc. importieren:

Listing 19.24: dateizugriff.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Formulare</title>
</head>
<body bgcolor="white">
<?php
if ($HTTP_POST_VARS["submit"] == "Abschicken") :
$datei = fopen("form.txt", "a");
fputs($datei, $HTTP_POST_VARS["Vorname"]."\t");
fputs($datei, $HTTP_POST_VARS["Nachname"]."\t");
fputs($datei, $HTTP_POST_VARS["Geschlecht"]."\t");
fputs($datei, $HTTP_POST_VARS["Windows"]."\t");
fputs($datei, $HTTP_POST_VARS["Linux"]."\t");
fputs($datei, $HTTP_POST_VARS["Tag"]."\r\n");
fclose($datei);
?>
<p>Vielen Dank f&uuml;r Ihre Angaben!</p>
<?php
else :
?>
<h3>Formular (POST)</h3>
<p>
<form method="post">
<input type="text" name="Vorname" size="20" />Vorname<br />
<input type="text" name="Nachname" size="20" />Nachname<br />
<input type="radio" name="Geschlecht" value="m">m&auml;nnlich
<input type="radio" name="Geschlecht" value="f">weiblich<br />
Ich nutze
<input type="checkbox" name="Windows" value="ja">Windows
<input type="checkbox" name="Linux" value="ja">Linux<br />
<select name="Tag" size="1">
<?php
for ($i=1; $i<=21; $i++) :
?>
<option value="<?=$i ?>"><?=$i ?></option>
<?php
endfor;
?>
</select>Dieser Tag gef&auml;llt mir am Besten<br />
<input type="submit" name="submit" value="Abschicken" />
</form>
</p>
<?php
endif;
?>
</body>
</html>

19.6 Cookies

Erinnern Sie sich noch an gestern? Die mühsame Unterscheidung zwischen dem Setzen und Lesen von Cookies, und Sie mussten sich immer überlegen, ob Sie jetzt auf das Request-Objekt oder das Response-Objekt zugreifen? Nun, bei PHP ist das nicht großartig anders, aber Sie finden es vermutlich intuitiver gelöst.

Wir gehen jetzt einmal davon aus, dass Sie gestern den Abschnitt über Cookies vollständig durchgearbeitet haben und somit auch das notwendige Grundwissen besitzen. Falls nicht, blättern Sie noch einmal zurück, und werfen Sie auch noch einen Blick auf die offizielle Cookie-Spezifikation von Netscape, die Sie unter www.netscape.com/newsref/std/ cookie_spec.html finden. Dann können Sie loslegen!

Cookies setzen

Zum Setzen von Cookies dient die Funktion setcookie. Da Cookies als Teil des HTTP- Headers übertragen werden, gilt hier dieselbe Einschränkung wie auch bei der zuvor einmal eingesetzten header-Funktion: Sie muss jeweils vor der ersten HTML-Ausgabe aufgerufen werden!

Die Syntax der Funktion ist die folgende:

<?php
setcookie(Name, Wert, Verfallsdatum, Pfad, Domain, Sicher)
?>

Von den Parametern sind in der Regel nur maximal die ersten drei interessant; dennoch führen wir hier den Sinn und Zweck aller Parameter auf:

An einem Beispiel ausprobiert: Folgende Seite speichert die Lieblingsfarbe des Benutzers in einem (temporären) Cookie.

Listing 19.25: cookie_schreiben.php

<?php
if (isset($HTTP_POST_VARS["submit"])) {
setcookie("Farbe", $HTTP_POST_VARS["Farbe"]);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Cookies</title>
</head>
<body bgcolor="white">
<h2>Cookies</h2>
<?php
if (isset($HTTP_POST_VARS["submit"])) :
?>
Sie haben <?php print $HTTP_POST_VARS["Farbe"]; ?>
als Ihre Lieblingsfarbe angegeben!
<?php
else :
?>
<form method="post">
<input type="text" name="Farbe" size="20" /> Lieblingsfarbe<br />
<input type="submit" name="submit" value="Abschicken">
</form>
<?php
endif;
?>
</body>
</html>

Abbildung 19.16:  Der Server will einen Cookie an den Browser schicken

Wenn der Cookie permanent gespeichert werden soll, müssen Sie ein Verfallsdatum angeben (im dritten Parameter). Am Einfachsten ist es, wenn Sie das aktuelle Datum nehmen und eine gewisse Zeitspanne hinzuaddieren:

<?php
setcookie("Farbe", $HTTP_POST_VARS["Farbe"], time() + 60*60*24*30);
?>

Wozu das komische Produkt im dritten Parameter, und warum nicht direkt das Ergebnis, in diesem Falle 2592000? Nun, das dient der Übersichtlichkeit. Die Funktion time liefert die Epoche zurück, also die seit Anfang 1970 vergangenen Sekunden. Sie müssen zu diesem Wert die Sekunden addieren, die der Cookie ab dem momentanen Zeitpunkt noch gültig sein soll. Ein Tag hat 24 Stunden à 60 Minuten à 60 Sekunden, also entspricht 60*60*24*30 der Zahl Sekunden, die in 30 Tagen verstreichen. Das Cookie ist also 30 Tage lang gültig.

Um ein Cookie zu löschen, müssen Sie nur ein Datum in der Vergangenheit wählen, also beispielsweise im Verfallsdatum den gestrigen Tag wählen:

<?php
setcookie("Farbe", "egal", time() - 60*60*24);
?>

Wenn Sie die Parameter für Pfad, Domain und Sicher beim Setzen eines Cookies angeben, müssen Sie diese exakt so auch beim Löschen des Cookies angeben!

Abbildung 19.17:  Der Cookie soll wieder gelöscht werden

Cookies lesen

Wir hatten es zuvor bereits einmal angedeutet - der Name des Cookies ist gleichzeitig der Variablenname, unter dem Sie auf den Wert des Cookies zugreifen können. Vorausgesetzt wird, dass register_globals in der php.ini auf On gesetzt ist. Was aber immer funktioniert und was Sie aus den mehrfach angeführten Sicherheitsgründen unbedingt verwenden sollten, ist der Zugriff über das assoziative Array $HTTP_COOKIE_VARS. Der Name des Cookies dient hier als Schlüssel für den Wert.

<?php
print "Lieblingsfarbe: " . $HTTP_COOKIE_VARS["Farbe"];
?>

Praxisbeispiel

Auch dieses Mal wärmen wir ein Beispiel vom gestrigen Tage neu auf - denn so werden Unterschiede zwischen den verschiedenen serverseitigen Technologien deutlich erkennbar. Der Benutzer soll die Möglichkeit haben, seine Lieblingsfarbe in ein Formular einzugeben; sobald er das getan hat, wird diese Farbe als Hintergrundfarbe der Website eingesetzt. Das ist eine besonders einfache Form der Personalisierung, und legt damit den Grundstock für weitere, komplexere Personalisierungsaufgaben.

Beachten Sie auch hier die Hinweise von gestern: Die Farbe muss auf spitze öffnende und schließende Klammern überprüft bzw. diese aus dem String entfernt werden. Sodann kann der Cookie gesetzt werden.

Nachfolgend schon das Listing; da wir keine neuen Technologien verwenden und den Code schon gestern konzipiert und entwickelt hatten, bedarf es hier keiner weiteren Erklärungen.

Listing 19.26: lieblingsfarbe.php

<?php
$farbe = $HTTP_COOKIE_VARS["Farbe"];
$farbe = str_replace("<", "", $farbe);
$farbe = str_replace(">", "", $farbe);
if ($farbe == "") {
$farbe = "white";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Personalisierung</title>
</head>
<body bgcolor="<?=$farbe ?>">
<h2>Willkommen auf Ihrer personalisierten Seite!</h2>
<p>Ihre Lieblingsfarbe ist: <?=$farbe ?>.</p>
</body>
</html>

Abbildung 19.18:  In der Schwarzweißabbildung kaum zu erkennen: Die Hintergrundfarbe

Damit wollen wir diesen Tag auch schon beenden. Es war relativ anstrengend, aber wie wir hoffen, auch sehr interessant und spannend. Weiterführende Literatur zum Thema PHP finden Sie in der Einleitung zum heutigen Tag. Bevor Sie sich aber weiter in die Materie stürzen, sollten Sie zunächst den Fragen- und Übungsteil erfolgreich hinter sich bringen!

19.7 Fragen und Antworten

Frage:
Wie kann ich in PHP auf Umgebungsvariablen zugreifen?

Antwort:
Verwenden Sie die Funktion getenv. Beispielsweise erhalten Sie mit getenv("HTTP_REFERER") die URL der Seite, von der aus der Benutzer kam.

Frage:
Wie kann ich einen numerischen Wert in einen Integerwert umwandeln und umgekehrt?

Antwort:
PHP bietet hierzu Funktionen an, die Sie in der Dokumentation finden - aber auch hier funktioniert der kleine Trick von gestern: Integers werden zu Strings, wenn Sie die Integervariable mit »« konkatenieren. Strings werden zu Integer- Werten (oder auch zu Floats), wenn Sie sie mit 1 multiplizieren.

Frage:
Kann ich mit PHP ein wenig HTML-Code ausgeben, und dann nach ein paar Sekunden den Benutzer auf eine andere Seite weiterleiten?

Antwort:
Nein, das geht nur mit clientseitigen Mitteln. In den vorhergehenden beiden Wochen haben Sie dazu Mittel und Wege kennen gelernt, dies sowohl mit HTML als auch mit JavaScript zu realisieren.

Frage:
Kann ich PHP 3 und PHP 4 parallel installieren?

Antwort:
Das ist prinzipiell möglich, da die Ini-Datei von PHP 3 php3.ini heißt. Doch obwohl PHP 4 wohl etwas zu früh veröffentlicht worden ist (Zur Drucklegung des Buches ist bereits Unterversion 4.0.4 veröffentlicht, die schon deutlich stabiler ist als 4.0.0), gibt es mittlerweile kaum einen Grund mehr, noch PHP 3 zu verwenden.

Frage:
Ich will per HTTP/FTP auf eine Datei zugreifen, aber mit dem Parameter »a« oder »w« für fopen funktioniert es nicht. Woran liegt das?

Antwort:
Sie benötigen hier expliziten Lesezugriff. Dazu dient der Parameter »r«. Nähere Informationen finden Sie im Online-Manual unter der Funktion fopen.

Frage:
Warum kann ich nicht unmittelbar, nachdem ich ein Cookie gesetzt habe, darauf zugreifen?

Antwort:
Der Cookie muss erst an den Client geschickt und dort gespeichert werden. Sie können also nicht serverseitig darauf zugreifen, denn der Client hat es noch nicht an den Server schicken können. Merken Sie sich also den Wert im Cookie, und beim Laden der nächsten Seite wird der Cookie zu Verfügung stehen.

Frage:
Wofür steht eigentlich PHP?

Antwort:
Hierzu gibt es viele falsche Antworten - und eine richtige. PHP steht für: »PHP: Hypertext Preprocessor«.

19.8 Workshop

Der Workshop enthält Quizfragen, die Ihnen helfen sollen, Ihr Wissen zu festigen, und Übungen, die Sie anregen sollen, das eben Gelernte umzusetzen und eigene Erfahrungen zu sammeln. Versuchen Sie, das Quiz und die Übungen zu beantworten und zu verstehen, bevor Sie zur Lektion des nächsten Tages übergehen.

Quiz

  1. Was ist Zend, und was hat das mit Rasmus Lerdorf zu tun?
  2. Ist das Gleichheitszeichen im PHP ein Vergleichs- oder ein Zuweisungsoperator?
  3. Was ist der Hauptunterschied zwischen if und switch?
  4. Mit welchen Schleifen können Sie besonders bequem auf alle Arrayelemente zugreifen? Welche Parameter sind hier wichtig?
  5. Wozu dient $PHP_SELF?
  6. Wie greifen Sie auf alle ausgewählten Elemente einer Auswahlliste zu, die mit <select multiple> erstellt worden ist? Was müssen Sie im HTML-Code beachten?
  7. Wozu ist der zweite Parameter von fopen gut?
  8. Welche Parameter von setcookie sind nicht optional?

Übungen

  1. Begrüßen Sie auf einer PHP-Seite Ihre Besucher je nach Tageszeit (»Guten Morgen« etc.)!
  2. Erweitern Sie die Vollständigkeitsüberprüfung des Formulars aus diesem Kapitel! Momentan ist es so, dass bei nicht vollständiger Ausfüllung das Formular erneut angezeigt wird, aber komplett leer. Sorgen Sie dafür, dass bereits eingegebene Werte stehen bleiben.
  3. Fassen Sie die Listings zum Thema Personalisierung zusammen: Auf einer PHP-Seite erscheint entweder die angegebene Hintergrundfarbe, oder der Benutzer wird zu ihrer Eingabe aufgefordert.



vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbackKapitelanfangnächstes Kapitel


© Markt+Technik Verlag, ein Imprint der Pearson Education Deutschland GmbH