# 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.

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).

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" im form-Start-Tag
  • input-Element mit dem Wert file im type-Attribut
  • input-Element mit dem Wert hidden im type-Attribut, MAX_FILE_SIZE im name-Attribut und mit dem Wert der maximal erlaubten Dateigröße in Bytes im value-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 und move_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

  1. Mit welcher Funktion können Sie die einzelnen Parameternamen und Parameterwerte aus $_ENV['QUERY_STRING'] ermitteln?
  2. 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.
  3. Schreiben Sie ein Script, das die persönlichen Seitenbesuche eines Benutzers in einem Cookie speichert.
  4. Schreiben Sie ein Script, das übertragene Dateien auf ihren Typ überprüft und nur Bilder zulässt (MIME-Typ: image/*).