SELFPHP

SELFPHP-Druckversion
Original Adresse dieser Seite:
http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=199&group=34&page=2
© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.de
© 2005-2017 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de


Cookies in PHP


Cookies können mit PHP durch die Funktion setcookie() erzeugt werden. Die Syntax lautet wie folgt:

setcookie(name[, value[, expires[, path[, domain[, secure]]]]]);


Da Cookies Bestandteile eines HTTP-Headers sind, muss diese Funktion genau wie bei der Funktion header()aufgerufen werden, noch bevor irgendeine andere Ausgabe an den Browser erfolgt. Im folgenden Beispiel wird mithilfe der Funktion setcookie() ein Cookie gesetzt:

Beispiel

<?php

// Inhalt festlegen
$inhalt = "Ich bin dein Cookie!";

// Cookie erzeugen
setcookie("cook_first_one",$inhalt, time()+600);

// Prüfen
if (!$_COOKIE[cook_first_one]) {
  echo "Cookie ist nicht vorhanden!";
} else {
  echo $_COOKIE[cook_first_one];
}

?>

Die Funktion erzeugt ein Cookie mit dem Namen cook_first_one und dem Inhalt aus der Variablen $inhalt. Der Parameter expires, der die Lebensdauer des Cookies in Sekunden nach dem 1.1.1970 angibt, wird durch die Funktion time() und ein Offset von 600 Sekunden erzeugt. Die Funktion time() gibt dabei den aktuellen Unix-Zeitstempel zurück, sodass auf diese Weise für das Cookie eine Lebensdauer von zehn Minuten festgelegt wird. Wird keine Zeit angegeben, ist das Cookie so lange gültig, bis der Browser geschlossen wird.

Die übrigen Parameter für path, domain und secure wurden nicht gesetzt.

Beim Aufruf der Seite wird das entsprechende Cookie gesetzt. Sofern Sie Ihren Browser entsprechend konfiguriert haben, wird vor dem Setzen von Cookies eine entsprechende Meldung angezeigt, aus der Sie alle wesentlichen Daten des Cookies entnehmen können.



Bild 4.5: Browser meldet Cookie

Darüber hinaus passiert zunächst gar nichts. Beim nächsten Aufruf derselben Seite kann die im Cookie abgelegte Information verwendet werden. Dem verarbeitenden Skript steht das Cookie in Form einer Variablen $cook_first_one zur Verfügung. Der Inhalt wird mithilfe des echo-Befehls ausgegeben.

Hinweis: Beachten Sie, dass der Wertebereich des Cookies automatisch URL-konform kodiert (urlencoded()) wird, sobald Sie das Cookie senden, und wenn es gelesen wird, wird es automatisch URL-konform dekodiert (urldecode()) und einer Variablen zugewiesen, die denselben Namen wie das Cookie trägt.


Namenskonflikte

Da das Auslesen der Cookies durch Übergabe des Inhalts in eine gleichlautende Variable erfolgt, kann es Namenskonflikte mit GET- oder POST-Daten geben. Welche Datenquelle den Vorrang besitzt, kann in der Konfigurationsdatei php.ini festgelegt werden. Suchen Sie den folgenden Eintrag im Abschnitt [Data Handling]:

gpc_order = gpc;

Wenn der Eintrag nicht existiert, fügen Sie ihn hinzu. Der Reihenfolge wird durch das Argument bestimmt:
{PSP}Mit gpc ist also die Reihenfolge GET->POST->Cookie gemeint. Um solche Konflikte zu vermeiden, sollten Sie Cookies konsequent nach einem bestimmten Schema benennen, z. B. cook_xxxxx oder co_xxxx. Dann können Namenskonflikte erst gar nicht entstehen.

Sollte diese Methode keine ausreichende Flexibilität bieten, können Sie die Cookies auch direkt aus der globalen Servervariablen $_COOKIE ($HTTP_COOKIE_VARS) auslesen. Im folgenden Beispiel wird die globale Servervariable verwendet, um sämtliche Cookies auszugeben:

<?php

foreach ($_COOKIE as $key=>$element) {
  echo "$key: $element<br>";
}

?>

Ausgabe
cook_first_one: Ich bin dein Cookie!


Cookies mit mehreren Variablen

In der Praxis werden im Attribut value eines Cookies in der Regel die Inhalte mehrerer Variablen untergebracht. Hierzu sind einige Techniken erforderlich, bei denen die bereits beschriebenen Arrayfunktionen von PHP eingesetzt werden können.

Um die Inhalte von mehreren Variablen einem Cookie zu übergeben, kann wie folgt vorgegangen werden. Zunächst werden die Variablen mit der Funktion array() an ein Array übergeben.

Anschließend wird dieses Array mit der Funktion implode() in eine Zeichenfolge konvertiert. Diese Zeichenfolge wird dann dem Attribut value des Cookies als Wert zugewiesen.

Beispiel

<?php

// Prüfen – Cookie vorhanden?
if (isset($_COOKIE['cook_besucher'])) {
  // Cookie Daten extrahieren
  $cook_daten = explode("&",$_COOKIE['cook_besucher']);
  // Extrahierte Cookie Daten ausgeben und an dynamische
  // Variablen übergeben.
  foreach ($cook_daten as $key=>$element) {
    echo "$key: $element<br>";
    ${"co_$key"} = $element;
  }
  // Formatierte Ausgabe
  echo "
  <html>
    <head>
    <title>Personalisierte Website</title>
    </head>
  <body>
  <p><font color=$co_2>Herzliche Willkommen $co_0 $co_1<br>
  Ihre Lieblingsfarbe ist: $co_2</font>
  </body>
    </html>";
} else {
  // Formular aufrufen
  eingabe_form();
}

// Eingabeformular + Cookie-Generierung
function eingabe_form() {
  if (!$_POST['Submit']) {
    echo "
    <html>
    <head>
    <title>Personalisierte Website</title>
    </head>
    <body>
    <form method='post' action='$PHP_SELF'>
    <p>Vorname:
      <input type='text' name='vorname'>
    </p>
    <p>Nachname:
      <input type='text' name='nachname'>
    </p>
    <p>Hintergrund:
      <select name='farbe'>
        <option value='#FF0000'>Rot</option>
        <option value='#00FF00'>Grün</option>
        <option value='#0000FF'>Blau</option>
      </select>
    </p>
    <p>
      <input type='submit' name='Submit' value='Sichern'>
    </p>
  </form>
  </body>
    </html>";
  } else {
    $daten = array($_POST["vorname"],$_POST["nachname"],$_POST["farbe"]);
    $daten_string = implode("&",$daten);
    setcookie("cook_besucher", $daten_string, time()+600);
    echo "Cookie wurde gesetzt!";
    unset($_POST['Submit']);
  }
}

?>
{PSP}
Bild 4.6: Schritt 1: Eingabeformular



Bild 4.7: Schritt 2: Cookie wurde gesetzt.



Bild 4.8: Schritt 3: Cookie-Daten werden ausgegeben.

Um die im Cookie enthaltenen Daten verwenden zu können, müssen sie entsprechend behandelt werden. Hierzu überführen wir die Zeichenfolge des Cookies in die einzelnen Variablen $co_0, $co_1 und $co_2. Die Funktion, die Ihnen hierbei behilflich ist, ist explode(). Mit ihr und dem in der Cookie-Zeichenfolge enthaltenen Trennzeichen werden die Bestandteile in das Array $cookie_daten überführt.

Die in diesem Array abgelegten Werte können dann entweder direkt aus dem Array ausgelesen oder auch in die entsprechenden Variablen $co_0 bis $co_2 umgewandelt und dann weiterverwendet werden.{PSP}
Hinweis: Diese Vorlage kann Ihnen dazu dienen, Ihre eigene Website zu personalisieren. Ihre Besucher werden es Ihnen sicher danken.


Cookies im Array

Sie können auch ein Array an Cookies setzen, indem Sie die Array-Schreibweise verwenden. Hierdurch werden so viele Cookies gesetzt, wie Ihr Array Elemente hat. Sobald das Cookie von Ihrem Skript gelesen wird, werden sämtliche Werte in ein einziges Array mit dem Cookienamen eingelesen:
<?php
// Coookies im Array erzeugen
setcookie ("cookie[eins]", "Erster");
setcookie ("cookie[zwei]", "Zweiter");
setcookie ("cookie[drei]", "Dritter");

// Nach dem Neuladen der Seite wieder ausgeben
if (isset($_COOKIE['cookie'])) {
  foreach ($_COOKIE['cookie'] as $key=>$element) {
    echo "$key : $element<br>";
  }
}
?>

Ausgabe
eins : Erster
zwei : Zweiter
drei : Dritter