PHP/Cookies in PHP

Aus Mikiwiki
< PHP
Zur Navigation springen Zur Suche springen

Cookies werden in PHP durch die Funktion "setcookie" unterstützt. Wie schon bei Formularen und "GET"-Daten fragt PHP alle Daten im Header des HTTP-Request automatisch ab und erstellt entsprechend gefüllte Variablen. Die Funktion hat folgenden Aufbau. Ausser dem Namen "Name" sind alle Argumente optional. Werden Parameter weggelassen, so müssen die Angaben "Pfad" und "Domain" durch leere Zeichenketten "" ersetzt, "Verfallsdatum" und "secure" durch 0 ersetzt werden. Der "Inhalt" wird automatisch mit "urlencode" behandelt - diese Funktion muss also nicht ausdrücklich angewendet werden. Entsprechend erfolgt auch eine automatische Rückumwandlung der Cookies.

setcookie("Name", "Inhalt", Verfallsdatum, Pfad, Domain, secure);

Eine einfache Anwendung ist die Speicherung der Farbe einer Seite. Das folgende Skript fragt beim ersten Start die gewünschte Seitengestaltung ab, speichert diese in einem Cookie und zeigt die Farbangabe beim nächsten Aufruf automatisch an. Das Cookie verfällt nach einer Minute (60 Sekunden). Da Cookies im Kopf der HTTP-Antwort gesendet werden, kann der Seiteninhalt also erst danach geschrieben werden. Deshalb steht der Sendebefehl - die Funktion "setcookie" - vor dem ersten Zeichen in der Skriptdatei. Die Übertragung der Daten erfolgt mit dem Ausführen der Seite. Der erste Aufruf geht dabei noch ins Leere: Zuerst muss das Formular abgesendet werden. Beim zweiten Mal wird dann das Cookie geschrieben und beim dritten Mal kann es bis zum Ablauf des Verfallszeitpunkts immer wieder gelesen werden.

<?php
if (isset($_POST['setcolor']))
{
  setcookie("color", $_POST['setcolor'], time()+60); 
}
?>
<h3>Personalisierte Seite</h3>
<?php
## Abfrage, ob das Cookie bereits gesetzt wurde
if (!isset($_COOKIE['color']))
{
  echo "Cookie nicht gesetzt";
}
else 
{
  echo "Cookie sagt: Farbe {$_COOKIE['color']}";
}
?>
<p>
<form method="post" action="<?=$_SERVER['PHP_SELF']?>">
<select name="setcolor" size="1">
  <option value="">Farbauswahl</option>
  <option value="red">Rot</option>
  <option value="green">Grün</option>
  <option value="blue">Blau</option>
</select>
<p>
<input type="submit">
</form>

Die primitive Vorgehensweise führt zu einem merkwürdigen Verhalten. Um tatsächlich eine Farbausgabe hervorzurufen, muss zweimal auf "Daten absenden" geklickt werden. Alternativ kann beim zweiten Mal auch der "Neu laden"-, "Aktualisieren"- oder "Refresh"-Schalter des Webbrowsers angeklickt werden. Beim zweiten Senden des Formulars geschehen gleich zwei Dinge gleichzeitig. Einerseits wird das im letzten Schritt gesendete Cookie vom Browser zurückgeliefert. Zusätzlich wird aber auch der nun aktuelle Wert im Formular übertragen und vom Skript ausgewertet, was zur Erzeugung eines neuen Cookies führt. Wird die Liste nach der ersten Auswahl im Grundzustand belassen, so scheint das Cookie immer wieder zu verschwinden.

Um grössere Datenmengen in Cookies zu speichern, können Arrays verwendet und mit den Befehlen "implode" und "explode" von und in Zeichenketten umgewandelt werden. Cookies werden dabei direkt aus dem Superarray "$_COOKIE" ausgelesen. Dieses assoziative Array "$_COOKIE" enthält als Indizes die Namen aller Formularelemente und als Werte deren Inhalte.

<?php
## Name     cookie_setarray.php

function setCArray($cookieArray, $name, $expires) 
{
  $cookstring = implode("@@@", $cookieArray);
  setcookie($name, $cookstring, time()+3600);
}
function getCArray($name) 
{
  return explode("@@@", $name);
}
$myarray[] = "Farbe";
$myarray[] = "Name";
$myarray[] = "Ort";
$myarray[] = "Interesse";
$myarray[] = "E-Mail";
setCArray($myarray, "profile", time()+86400);
?>
<h3>Arrays in Cookies speichern</h3>
<p>Cookie wurde gesetzt, <a href="cookie_getarray.php">Cookies auslesen</a></p>
<?php
## Name     cookie_getarray.php

function getCArray($name) 
{
  return explode("@@@", $name);
}
?>
<h3>Arrays aus Cookies auslesen</h3>
<?php
$myarray = getCArray($_COOKIE['profile']);
for ($i = 0; $i < count($myarray); $i++) 
{
  echo "{$myarray[$i]}<br />\n";
}
?>
<p><a href="cookie_setarray.php">Zurück zum Listing 'cookie_setarray'</a></p>

Das folgende Beispiel zeigt alle Cookies an. Alternativ kann dabei auch "while" in Kombination mit "list" und "each" verwendet werden, um auf die Arrayelemente zuzugreifen.

<?php
foreach($_COOKIE as $key => $val)
{
  echo "<b>$key</b> = $val<br />\n";
}
?>
profile = Farbe@@@Name@@@Ort@@@Interesse@@@E-Mail

Im Zusammenhang mit Cookies sind auch folgende Funktionen von Bedeutung.

Funktion Beschreibung
setrawcookie Arbeitet genau wie "setcookie", allerdings wird der Wert nicht URL-kodiert.
headers_sent(&$file, &$line) Prüfung, ob bereits Header gesendet wurden, entsprechend wird "TRUE" oder "FALSE" zurückgegeben. Die beiden referentierten Parameter sind optinal. Werden Variablen übergeben, so enthalten diese anschliessend Datei und Zeile der Position, an der die Header gesendet wurden.
headers_list Gibt eine Liste der bereits gesendeten Header als Array zurück. Damit kann die Funktion "setcookie" überprüft werden. Die Ausgabe ist eine gute Erfolgskontrolle für gesendete Header.
<?php
setcookie("color", "brown", time()+180); 
$headers = headers_list();
if ($headers !== FALSE)
{
  foreach ($headers as $head => $cont)
  {
    echo "$head = $cont<br />";
  }
}
?>

0 = X-Powered-By: PHP/5.2.4-2ubuntu5.3
1 = Set-Cookie: color=brown; expires=Wed, 10-Sep-2008 20:30:03 GMT