# Ein- und Ausgabe
Was jeder Computer Consultant wissen muss:
1. Wenn Zweifel entstehen, wirken Sie überzeugend.
2. Glauben Sie nicht an Wunder. Verlassen Sie sich darauf.
– Murphy's Law
Auch in PHP ist die Ein- und Ausgabe von Daten wichtig. Trotz der Abstammung von Perl ist diese jedoch in PHP anders – teilweise auch leichter – implementiert worden.
# Parameterübergabe
Während Sie in Perl die Übergabe von Parametern umständlich über $ENV{'QUERY_STRING'}
und eine Auswertung dieser Zeichenkette realisieren müssen, ist PHP an dieser Stelle etwas »humaner«. Es stellt die übergebenen Parameter einfach als Variablen im Script zur Verfügung. Dies ist jedoch auch eine ernst zu nehmende Sicherheitslücke.
<?php
echo "Jahr: $jahr";
?>
Listing 6.1: Ausgabe der Variablen $jahr
Die Aufgabe des Scripts aus Listing 6.1 ist lediglich die Ausgabe eines Textes und der Variablen $jahr
. Diese Variable wird im Script jedoch an keiner Stelle definiert, wohl aber, wenn Sie das Script mit der URI
http://localhost/list6.1.php?jahr=2002
aufrufen. Sie übergeben dann bei dem Aufruf den Parameter jahr
und als Wert 2002
. Den Parameter jahr
stellt PHP nun im Script zur Verfügung, und zwar als Variable $jahr
, und weist dieser Variablen den Wert 2002
zu. Die Ausgabe des Scripts könnte nach dem Aufruf mit der eben genannten URI folgendermaßen aussehen:
Jahr: 2002
Wie bereits gesagt: Es ist äußerst komfortabel. Doch jetzt zur angesprochenen Sicherheitslücke. Auf den ersten Blick ist sie nicht zu erkennen. Sehen Sie sich dazu ein Beispielscript an:
<?php
if(ueberpruefe_rechte())
{
$administrator = TRUE;
}
if($administrator)
{
/* ... */
?>
Die Funktion ueberpruefe_rechte
soll testen, ob der aktuelle Benutzer über die Rechte eines Administrators verfügt. Ist dies der Fall, wird der Variablen $administrator
der Wert true
zugewiesen. An diesem Beispiel ist eigentlich nichts auszusetzen, außer man betrachtet die Art und Weise, wie das Script aufgerufen werden kann. Nennen Sie das Beispiel-Listing von eben einfach mal admin.php. Würde das Script nun mit der URI
http://localhost/admin.php?administrator=1
aufgerufen werden, wird eine Variable mit dem Namen $administrator
definiert, die den Wert 1
zugewiesen bekommt. Bei einer logischen Bedingungsprüfung mit
if($administrator) ...
entspricht 0 dem Wert FALSE
und jede andere Zahl dem Wert TRUE
. Selbst wenn nun die Überprüfung der Rechte mit der Funktion ueberpruefe_rechte
dazu führt, dass der Anweisungsblock der if
-Bedingung nicht ausgeführt wird und der Variablen $administrator
nicht der Wert TRUE
zugewiesen wird, würde die nachfolgende if
-Bedingung zu dem Schluss kommen, dass der aktuelle Benutzer der Administrator ist, und ihm im schlimmsten Fall eine Oberfläche mit Passwörtern und Ähnliches anzeigen. Um diese Lücke zu schließen, sollte das Script folgendermaßen erweitert werden:
<?php
$administrator = FALSE;
if(ueberpruefe_rechte())
{
$administrator = TRUE;
}
if($administrator)
{
/* ... */
?>
Egal, ob nun bei dem Aufruf des Scripts ein Parameter namens administrator
übergeben wurde oder nicht, vor der Überprüfung der Rechte wird die Variable $administrator
auf FALSE
gesetzt.
Sie können alternativ aber auch den gleichen Weg wie in Perl beschreiten. Die übergebene Zeichenkette erhalten Sie aus dem Array $HTTP_SERVER_VARS
unter Verwendung des Index QUERY_STRING
. Anstelle der langen Bezeichnung des Arrays können Sie auch die Kurzform $_SERVER
verwenden.
$qs = $HTTP_SERVER_VARS['QUERY_STRING'];
$qs = $_SERVER['QUERY_STRING'];
Da in PHP natürlich die gleichen Regeln gelten wie in Perl, um Daten mit der URI zu übergeben, werden Wertepaare durch ein kaufmännisches Und &
sowie Name und Wert durch ein Gleichheitszeichen =
getrennt. Das Äquivalent zur Perl-Funktion split
ist in PHP die Funktion explode
, mit dem Unterschied, dass letztere keine regulären Ausdrücke verwendet. Als erster Parameter wird das Zeichen bzw. die Zeichenkette übergeben, nach der der zweite Parameter zerlegt werden soll. Der Rückgabewert der Funktion ist ein Array.
array explode(string seperator, string string)
Um nun also alle Wertepaare extrahieren zu können, müsste die Verwendung der Funktion explode
z. B. folgendermaßen aussehen:
$wertepaare = explode("&",$_SERVER['QUERY_STRING']);
Ein weiterer Aufruf der Funktion explode
in Verbindung mit einer foreach
-Schleife würde dann die einzelnen Bezeichner und Werte trennen und als Schlüssel und Wert in ein assoziatives Array einfügen.
foreach($wertepaare as $wertepaar)
{
list($key,$value) = explode("=",$wertepaar);
$query_values[$key] = $value;
}
Die Funktion, die dann schlussendlich ein assoziatives Array zurückgibt, das als Schlüssel den Parameterbezeichner und als Wert den Parameterwert enthält, könnte z. B. wie folgt aussehen:
function parse_query_string()
{
$vp = explode("&",$_SERVER['QUERY_STRING']);
foreach($vp as $value)
{
list($key,$value) = explode("=",$value);
$query_values[$key] = $value;
}
return $query_values;
}
Welche Methode Sie letztlich wählen, bleibt Ihnen überlassen. Sie sollten dabei aber immer bedenken, welche Risiken Sie nun genau eingehen, wenn Sie die einfache Variante verwenden. Dies hängt insbesondere davon ab, welche Rechte dem Benutzer zur Verfügung gestellt werden, wenn er ein bestimmtes Script aufruft.
# Formulare
Auch in PHP können Daten per HTML-Formular an ein Script übergeben werden. Die Behandlung der verschiedenen Methoden hängt einzig und allein vom zu verwendenden Array ab. Werden die Daten mit der GET-Methode übertragen, werden die Daten im Array $HTTP_GET_VARS
gespeichert, und bei der POST-Methode im Array $HTTP_POST_VARS
. Auch für diese beiden Arrays gibt es wieder eine Kurzform:
- Die Kurzform
$_GET
entspricht der Langform$HTTP_GET_VARS
. - Die Kurzform
$_POST
entspricht der Langform$HTTP_POST_VARS
.
Generell sollten Sie die GET-Methode nur bei der Übertragung von wenigen Daten verwenden, z. B. bei der Eingabe eines Namens, und die POST-Methode, wenn Sie große Datenmengen oder aber Daten übertragen, die z. B. Benutzernamen und Passwörtern entsprechen.
# GET-Methode
Folgendes HTML-Dokument stellt ein Formular zur Verfügung, das die Daten mit der GET-Methode an das PHP-Script list6.3.php sendet.
<html>
<head>
<title>GET-Methode</title>
</head>
<body>
<form action="list6.3.php" method="GET">
Vorname: <input type="text" name="vorname"><br>
Nachname: <input type="text" name="nachname"><br>
<input type="submit">
</form>
</body>
</html>
Listing 6.2: HTML-Formular zum Übertragen von Daten mit der GET-Methode
Den Quellcode des PHP-Scripts list6.3.php finden Sie in Listing 6.3.
<?php
foreach($_GET as $key=>$value)
{
echo "$key => $value<br>\n";
}
?>
Listing 6.3: Gibt alle Elemente des Arrays $_GET im Browser aus
Die einzige Aufgabe des PHP-Scripts aus Listing 6.3 ist die Ausgabe des Schlüssels und der Werte des Arrays $_GET
im Browser.
Beim Öffnen des HTML-Dokuments aus Listing 6.2 erhalten Sie ein Formular mit zwei Eingabefeldern und einer Schaltfläche zum Abschicken der Daten. Sobald Sie auf die Schaltfläche klicken, werden die Daten an das PHP-Script list6.3.php gesendet, das dann die übermittelten Daten ausgibt.
Zwei Dinge werden Ihnen auffallen: Zum einen können Sie die übermittelten Daten in der Adressleiste des Browsers sehen, und zum anderen wurden die Namen der Eingabefelder aus Listing 6.2 als Schlüssel für die Elemente im Array $_GET
verwendet.
Hätten Sie im HTML-Formular als Vorname »Max« und als Nachname »Mustermann« eingegeben, würde die Ausgabe des PHP-Scripts folgendermaßen aussehen:
vorname => Max
nachname => Mustermann
Die Angabe des name
-Attributs für Elemente eines HTML-Formulars ist also wichtig, um später die richtigen Werte auslesen zu können. Ohne eine solche Angabe können Sie im PHP-Script die empfangenen Daten nicht mehr auseinander halten.
# POST-Methode
Die Vorgehensweise bei der POST-Methode entspricht nahezu der der GET-Methode, mit dem Unterschied, dass anstelle des $_GET
-Arrays das $_POST
-Array verwendet wird, und natürlich, dass im HTML-Dokument die Methode von GET nach POST geändert wird.
Nachfolgend finden Sie wieder zwei Listings: eines vom HTML-Dokument und eines vom PHP-Script.
<html>
<head>
<title>POST-Methode</title>
</head>
<body>
<form action="list6.5.php" method="POST">
Vorname: <input type="text" name="vorname"><br>
Nachname: <input type="text" name="nachname"><br>
Kommentar: <textarea cols="30" rows="10" name="kommentar"></textarea><br>
<input type="submit">
</form>
</body>
</html>
Listing 6.4: HTML-Formular zum Übertragen von Daten mit der POST-Methode
<?php
foreach($_POST as $key=>$value)
{
echo "$key => $value<br>\n";
}
?>
Listing 6.5: PHP-Script, das mit der POST-Methode übermittelte Daten im Browser ausgibt.
Das HTML-Formular aus Listing 6.4 stellt vier Formularelemente zur Verfügung: zwei Eingabefelder und ein Textfeld sowie eine Schaltfläche zum Absenden der Daten. Das PHP-Script aus Listing 6.5 gibt nun lediglich die Schlüssel und Werte der Elemente des $_POST
-Arrays aus.
Feld | Eingabe |
---|---|
vorname | Max |
nachname | Mustermann |
kommentar | Dies ist nur irgendein Kommentar, um das textarea -Element mit Inhalt zu füllen, damit viele Daten an das PHP-Script list6.5.php übertragen werden. |
Tabelle 6.1: Beispieleingabe für das HTML-Formular aus Listing 6.4
Hätten Sie im HTML-Dokument die Eingaben aus Tabelle 6.1 vorgenommen, würde das PHP-Script nun die folgende Ausgabe erzeugen:
vorname => Max
nachname => Mustermann
kommentar => Dies ist nur irgendein Kommentar, um das textarea-Element mit Inhalt zu füllen, damit viele Daten an das PHP-Script list6.5.php übertragen werden.
# Checkboxen, Radiobuttons und Auswahllisten
Die Handhabung von Daten, die durch Radiobuttons oder Checkboxen angegeben werden, unterscheidet sich ein klein wenig von den bisher behandelten Formularelementen. Radiobuttons, die zu einer Gruppe gehören, haben den gleichen Wert im name
-Attribut und unterscheiden sich im Wert des value
-Attributs.
<input type="radio" name="zahlungsart" value="nachnahme">
<input type="radio" name="zahlungsart" value="rechnung">
<input type="radio" name="zahlungsart" value="lastschrift">
Der Vorteil bei Radiobuttons ist, dass immer nur ein Element ausgewählt werden kann. In PHP würde dann der Wert des name
-Attributs dem Schlüssel im Array $HTTP_POST_VARS
oder $HTTP_GET_VARS
entsprechen. Als Wert des entsprechenden Elements des Arrays wird dann der Wert des value
-Attributs des ausgewählten Radiobuttons eingesetzt.
Bei Checkboxen verhält sich das anders, denn dort können mehrere Checkboxen einer Gruppe aktiviert werden. Das Problem ist nun, wie alle markierten Werte der Checkboxen einer Gruppe übertragen werden. Optimal wäre es, wenn uns in PHP ein Array zur Verfügung stehen würde, das alle Werte der aktivierten Checkboxen einer Gruppe enthält. Damit dies jedoch möglich wird, muss an den Wert im name
-Attribut einer Checkbox ein eckiges Klammernpaar angehängt werden.
<input type="checkbox" name="ware[]" value="Apfel">
<input type="checkbox" name="ware[]" value="Birne">
<input type="checkbox" name="ware[]" value="Orange">
<input type="checkbox" name="ware[]" value="Zitrone">
PHP stellt im Array $HTTP_POST_VARS
bzw. $HTTP_GET_VARS
nun ein Array zur Verfügung, das alle Werte der aktivierten Checkboxen enthält. Beim Auslesen des Arrays dürfen Sie die eckigen Klammern nun nicht mehr notieren. Um also das Array auszulesen, könnten Sie die folgende Anweisung verwenden:
$ware = $HTTP_POST_VARS['ware'];
Natürlich wäre auch die folgende Anweisung erlaubt:
foreach($HTTP_POST_VARS['ware'] as $ware)
{
echo "$ware<br>\n";
}
Wurden alle Checkboxen aktiviert, würde sich folgende Ausgabe ergeben:
Apfel
Birne
Zitrone
Orange
Ähnliches gilt bei Auswahllisten, in denen eine Mehrfachauswahl erlaubt ist. Auch dort müssen Sie im name
-Attribut des select
-Elements eckige Klammern notieren.
<select size="4" name="ware[]" multiple>
<option value="Apfel">Apfel
<option value="Birne">Birne
<option value="Orange">Orange
<option value="Zitrone">Zitrone
</select>
Der Zugriff in PHP könnte wieder folgendermaßen aussehen:
foreach($HTTP_POST_VARS['ware'] as $ware)
{
echo "$ware<br>\n";
}
# Cookies
Die einzige Funktion, die Sie in PHP benötigen, um ein Cookie zu setzen, ist die Funktion setcookie
.
Wichtig dabei ist, dass diese Funktion vor jeglicher Ausgabe aufgerufen werden muss. Bevor Sie also Text im Browser ausgeben dürfen oder gar das Tag <html>
, müssen Sie das Cookie mit der Funktion geschrieben haben. Erst dann dürfen Sie Browserausgaben erzeugen.
int setcookie(string name[, string value, int expire, string path,
string domain, int secure])
Die einzelnen Parameter im Detail finden Sie in Tabelle 6.2.
Parameter | Erklärung |
---|---|
name | Name des zu setzenden Cookies |
value | Wert, der im Cookie gespeichert werden soll |
expire | Datum, wann die Gültigkeit des Cookies endet (im UNIX-Zeitformat) |
path | Pfad auf dem Server, für den und dessen Unterverzeichnisse dieses Cookie gültig ist |
domain | Name des Servers |
secure | Legt fest, ob das Cookie nur über eine sichere Verbindung transportiert werden darf |
Tabelle 6.2: Parameter der Funktion setcookie
Alle Parameter bis auf name
sind optional. Wenn Sie nur den Parameter name
übergeben, wird das Cookie mit dem entsprechenden Namen vom Rechner des Benutzers gelöscht. Möchten Sie jedoch ein Cookie schreiben, müssen Sie gegebenenfalls auch Parameter übergeben, die Sie gar nicht übergeben möchten. In diesem Fall können Sie jedoch entweder eine leere Zeichenkette angeben oder NULL
bei Zahlenwerten.
# Cookie schreiben
Um beispielsweise den letzten Besuch eines Benutzers zu speichern, ist die Verwendung von Cookies geradezu optimal. Alles, was Sie angeben sollten, ist der Name, der zu speichernde Wert und wie lange das Cookie gültig sein soll:
setCookie("LetzterBesuch",time(),time()+(7*24*60*60));
Mit dieser Anweisung wird auf dem Rechner des Benutzers ein Cookie mit dem Namen LetzterBesuch
erzeugt. Als Wert wird im Cookie der aktuelle Zeitpunkt im UNIX-Zeitformat gespeichert. Als Datum, wann das Cookie seine Gültigkeit verliert, wurde ein Zeitpunkt festgelegt, der genau eine Woche in der Zukunft liegt (606024*7 Sekunden = 1 Woche).
# Cookie lesen
Wurde ein Cookie geschrieben, bestehen zwei Möglichkeiten, auf das Cookie zuzugreifen. Die erste Möglichkeit ist es, über das Array $HTTP_COOKIE_VARS
bzw. die Kurzform $_COOKIE
und den Namen des Cookies als Index den Wert des Cookies auszulesen. Alternativ erzeugt PHP jedoch auch Variablen mit dem Namen des Cookies, denen der Wert des Cookies zugewiesen wird. Für das Cookie LetzterBesuch
bedeutet dies also:
echo $HTTP_COOKIE_VARS['LetzterBesuch'];
echo $_COOKIE['LetzterBesuch'];
echo $LetzterBesuch;
Alle drei Varianten sind möglich.
Das folgende Beispiel zeigt die Möglichkeit, vor dem neuen Schreiben des Cookies den alten Wert auszulesen.
<?php
$alt = $LetzterBesuch;
$neu = time();
setCookie("LetzterBesuch",$neu,$neu+(7*24*60*60));
echo "Altes Datum: ",strftime("%d.%m.%Y / %H:%M:%S",$alt),"<br>\n";
echo "Neues Datum: ",strftime("%d.%m.%Y / %H:%M:%S",$neu),"<br>\n";
?>
Listing 6.6: Lesen und Schreiben des Cookies LetzterBesuch
Zunächst wird der Variablen $alt
der alte Wert des Cookies und der Variablen $neu
der aktuelle Zeitpunkt zugewiesen. Danach wird das Cookie LetzterBesuch
neu geschrieben. Anschließend erfolgt die formatierte Ausgabe der Variablen $alt
und $neu
.
# Datei-Upload
Auch PHP unterstützt das Übertragen von Dateien vom Rechner des Benutzers auf den Server. Dabei ist es egal, ob Sie Textdateien oder Binärdateien übertragen möchten. Zusätzlich zu den Anpassungen eines HTML-Formulars, die auch schon in Perl erforderlich waren, kommt noch eine weitere hinzu.
- Zusätzliches Attribut
enctype="multipart/form-data"
imform
-Start-Tag input
-Element mit dem Wertfile
imtype
-Attributinput
-Element mit dem Werthidden
imtype
-Attribut,MAX_FILE_SIZE
imname
-Attribut und mit dem Wert der maximal erlaubten Dateigröße in Bytes imvalue
-Attribut
Wichtig ist, dass das versteckte input
-Element noch vor dem Dateiauswahlfeld im HTML-Dokument notiert wird. Eine Vorlage für ein solches HTML-Formular könnte also folgendermaßen aussehen:
<html>
<head>
<title>Listing 6.7</title>
</head>
<body>
<form method="post" action="list6.8.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="10000">
Datei: <input type="file" name="clientdatei">
<input type="submit">
</form>
</body>
</html>
Listing 6.7: Vorlage für ein HTML-Formular zum Übertragen einer Datei
Anstelle von ziel.php sollten Sie natürlich das PHP-Script notieren, das die übersandten Daten verarbeiten soll. Bei dieser Vorlage ist die maximale Größe einer hochladbaren Datei auf 10.000 Bytes beschränkt. Die Angabe der Dateigröße ist jedoch nur ein Hinweis für den Browser. Dies kann auch umgangen werden, jedoch besitzt PHP eine Option in der php.ini, die die maximale Dateigröße festlegt: upload_max_filesize
.
Die hochgeladene(n) Datei(en) steht bzw. stehen im Array $HTTP_POST_FILE
bzw. $_FILES
zur Verfügung. Da Sie auch mehrere Dateien gleichzeitig hochladen können, müssen Sie als ersten Index den im HTML-Formular angegebenen Namen notieren. In dem Muster-Formular ist dies clientdatei
.
Als zweiten Index müssen Sie einen angeben, der in der folgenden Tabelle enthalten ist.
Index | Erklärung |
---|---|
name | Ursprünglicher Name der Datei auf dem Client-Rechner |
size | Größe der übertragenen Datei in Bytes |
tmp_name | Der temporäre Dateiname, unter dem die Datei auf dem Server gespeichert wurde |
type | Der Mime-Typ der übertragenen Datei, falls der Browser diese Information zur Verfügung gestellt hat |
error | Enthält den Fehlercode, falls bei der Übertragung der Datei ein Fehler aufgetreten ist |
Tabelle 6.3: Zweiter Index des Arrays $_FILES
Um also den ursprünglichen Namen der Datei auszugeben, könnte der Aufruf
echo $_FILES['clientdatei']['name'];
lauten.
Da die Datei nun im temporären Verzeichnis liegt, muss sie natürlich noch an die entsprechende gewünschte Position verschoben werden. Außerdem sollten mögliche Fehler behandelt werden. Um zu überprüfen, ob die in $_FILES['clientdatei']['name']
angegebene Datei auch wirklich die übertragene Datei ist, können Sie die Funktion is_uploaded_file
verwenden. Als Parameter muss der Dateiname übergeben werden, und als Rückgabewert liefert die Funktion TRUE
, wenn es sich um die übertragene Datei, oder FALSE
, wenn es sich nicht um die übertragene Datei handelt.
bool is_uploaded_file(string filename)
Eine weitere hilfreiche Funktion ist move_uploaded_file
. Diese Funktion kann die im temporären Verzeichnis liegende Datei in das von Ihnen gewünschte Verzeichnis verschieben. Als ersten Parameter erwartet sie den Dateinamen und als zweiten das Zielverzeichnis und den Dateinamen. Bei erfolgreicher Operation liefert die Funktion TRUE
zurück, andernfalls FALSE
.
bool move_uploaded_file(string source, string destination)
Der Wert des Elements $_FILES['clientdatei']['error']
ist übrigens 0, wenn während der Übertragung der Datei kein Fehler aufgetreten ist. In Tabelle 6.4 finden Sie die möglichen Werte für $_FILES['clientdatei']['error']
und ihre Bedeutung.
Wert | Erklärung |
---|---|
0 | Kein Fehler |
1 | Die hochgeladene Datei ist größer, als in der Datei php.ini festgelegt wurde |
2 | Die hochgeladene Datei ist größer, als im Browser mit MAX_FILE_SIZE festgelegt wurde |
3 | Die Datei wurde nur teilweise hochgeladen. |
4 | Die Datei wurde nicht hochgeladen. |
Tabelle 6.4: Mögliche Fehlercodes
Listing 6.8 enthält den Quellcode eines Beispiel-Scripts, das den Upload einer Datei verarbeitet.
<?php
if(is_uploaded_file($_FILES['clientdatei']['tmp_name'])
and ($_FILES['clientdatei']['error'] == 0))
{
move_uploaded_file($_FILES['clientdatei']['tmp_name'],"../upload/".$_FILES['clientdatei']['name']);
echo "<h1>Datei�bertragung erfolgreich</h1>";
echo "Die Datei wurde erfolgreich hochgeladen!<br>\n";
echo "<b>Dateiname:</b> ",$_FILES['clientdatei']['name'],"<br>\n";
echo "<b>Dateigr��e:</b> ",$_FILES['clientdatei']['size']," Bytes<br>\n";
echo "<b>Tempor�rer Name:</b> ",$_FILES['clientdatei']['tmp_name'],"<br>\n";
echo "<b>Dateityp:</b> ",$_FILES['clientdatei']['type'],"<br>\n";
echo "<a href=\"../upload/".$_FILES['clientdatei']['name']."\">Datei anzeigen</a>";
}
else
{
echo "<h1>Datei�bertragung misslungen</h1>";
echo "Die Datei konnte nicht erfolgreich hochgeladen werden!<br>\n";
switch($_FILES['clientdatei']['error'])
{
case 1:
echo "<b>FEHLER #1:</b> Hochgeladene Datei zu gro�!";
break;
case 2:
echo "<b>FEHLER #2:</b> Hochgeladene Datei zu gro�!";
break;
case 3:
echo "<b>FEHLER #3:</b> Datei nur teilweise hochgeladen!";
break;
case 4:
echo "<b>FEHLER #4:</b> Es wurde keine Datei hochgeladen!";
break;
default:
echo "Unbekannter Fehler w�hrend der �bertragung!";
break;
}
}
?>
Listing 6.8: Beispiel-Script zum Verarbeiten eines Datei-Uploads
Zu Beginn des Scripts wird überprüft, ob die Datei, die in $_FILES['clientdatei']['tmp_name']
hinterlegt ist, auch die Datei ist, die mit der POST-Methode übertragen wurde, und ob die Übertragung fehlerfrei verlaufen ist.
if (is_uploaded_file($_FILES['clientdatei']['tmp_name'])
and ($_FILES['clientdatei']['error'] == 0))
Ist das Ergebnis dieser Bedingung TRUE
, wird die übertragene Datei in das Verzeichnis /upload verschoben. Anschließend werden noch einige Details zur Datei und zusätzlich ein Hyperlink ausgegeben, der auf die übertragene Datei verweist.
Ist das Ergebnis der Bedingung FALSE
, wird der else
-Anweisungsblock ausgeführt. In diesem Fall wird mit einer switch
-Anweisung überprüft, welcher Fehler während der Übertragung aufgetreten ist.
Das Script aus Listing 6.8 ist natürlich nur ein Beispiel für die Verarbeitung. Wie Sie die Logik aufbauen, bleibt natürlich Ihnen überlassen. Das Verschieben der übertragenen Datei sollten Sie aber auf jeden Fall vornehmen, da sie ansonsten nach einem Seitenwechsel wieder gelöscht wird.
# Zusammenfassung
- Per URI übergebene Parameterpaare können aus dem Element mit dem Index
QUERY_STRING
des$_ENV
-Arrays ausgelesen werden. - Mit GET übertragene Formulardaten stehen im Array
$HTTP_GET_VARS
bzw.$_GET
. - Mit POST übertragene Formulardaten stehen im Array
$HTTP_POST_VARS
respektive$_POST
. - Um alle ausgewählten Einträge der Checkbox-Gruppe oder einer Auswahlliste zu übertragen, muss nach dem Namen der Elemente jeweils ein eckiges Klammernpaar notiert werden, z. B.
name="ware[]"
. - Cookies werden mit der Funktion
setcookie
geschrieben und über das Array$HTTP_COOKIE_VARS
bzw.$_COOKIE
und den Namen des Cookies als Index gelesen. - HTML-Formulare müssen für den Datei-Upload um einige Elemente und Attribute erweitert werden.
- Die Funktionen
is_uploaded_file
undmove_uploaded_file
dienen zur Verifizierung der Datei und zum Verschieben an einen anderen Ort auf dem Server. - Übertragene Dateien stehen im Array
$HTTP_POST_FILES
bzw.$_FILES
bereit.
# Fragen und Übungen
- Mit welcher Funktion können Sie die einzelnen Parameternamen und Parameterwerte aus
$_ENV['QUERY_STRING']
ermitteln? - Schreiben Sie ein Beispiel-Script, das überprüft, ob Daten an das Script übermittelt worden sind, und das entweder ein HTML-Formular anzeigt oder die Daten ausgibt.
- Schreiben Sie ein Script, das die persönlichen Seitenbesuche eines Benutzers in einem Cookie speichert.
- Schreiben Sie ein Script, das übertragene Dateien auf ihren Typ überprüft und nur Bilder zulässt (MIME-Typ: image/*).