PHP Cookie setzen, auslesen und löschen

Letzte Aktualisierung : |  

Ein HTTP Cookie (Magic Cookie) ist ein kleines bzw. kurzes Datenpaket welches zwischen Webseite (Domain) und Klient (Surfer) ausgetauscht wird. Und hier geht es darum wie man mit PHP Cookie setzt. Dabei wird ein Cookie vom Server an den Browser gesendet und beim Klienten auf den Rechner platziert. Oder der Cookie wird direkt mit JavaScript erzeugt und so vom Browser beim Klienten platziert. Solange der Cookie sich auf dem Rechner des Klienten befindet, wird dieser bei jeder neuen Anforderung der Webseite (Domain) das Datenpaket an den Server senden. So kann dieser User Identifiziert werden und ist für uns kein unbekannter mehr, weil wir ein Profil erstellen können um so öfter er die Seite besucht.



Beispiele für Datenpakete

Die erste frage nachdem man wohl herausgefunden hat wie Cookies funktionieren, will man natürlich wissen was nun speichern. Deshalb hier ein paar Beispiele:


  • Nehmen wir ein HTTP_USER_AGENT und holen uns dort was wir für sinnvoll halten, wenn der User-Agent den existiert.
  • Wir könnten die Sprache dazu nehmen mit HTTP_ACCEPT_LANGUAGE
  • Wir könnten die IP-Adresse Verschlüsseln und Speichern, wenn sie den existiert.
  • Wir können alles mögliche für Daten sammeln, welche Seiten besucht, wie lange welche Seite, Verweildauer...
$_SERVER["HTTP_USER_AGENT"]$_SERVER["HTTP_LANGUAGE"]

Hier findest Du noch mehr Server Variablen  $_SERVER

Du kannst Cookies für einiges nutzen z.B. wie ein Login-System (hier wird auch bei der Session eine gesetzt automatisch) oder auch ein Online-Shop (für Warenkorb).



Datenschutz Grundverordnung

Beachte auch die DSGVO und erkundige Dich was für Dich notwendig ist, es kommt darauf an was Du für eine Webseite betreibst.



Cookie füllen und platzieren

Wir bauen uns eine Funktion die uns das erstellen eines Cookies vereinfacht und auch Prüft. In der ersten Lösung sind alle variablen einzeln aufgelistet jedoch reicht es wenn nur die $args variable reingeschickt wird.

Um später mit JavaScript auf die Cookies zuzugreifen müssen wir drei dinge beachten. Das ist zu einem das wir httponly auf false setzen und das wir mit json_encode so wie den Namen nicht mit irgendwelchen Sonderzeichen behandeln.

Hier eine Funktion um ein Cookie zu platzieren, diese Funktion kann überall sein in deinem Script jedoch muss der Aufruf dieser Funktion passieren bevor etwas ausgegeben wird. Also das bedeutet das nichts anderes davor an den Klienten (Browser) gesendet werden darf, weder mit echo noch pur HTML.


// PHP CODE
     0  /**  1   * This function set the cookie  2   * @param array $agrs  3   */  4  function setMyCookie(array $agrs = array()) {  5      // Prüfen ob $args vorhanden und der header nicht gesendet wurde  6      if ($agrs && !headers_sent($filename, $linenum)) {  7          // @see http://php.net/manual/de/function.setcookie.php  8          setcookie(  9                  $agrs['name'], // Der Name des Cookies  10                  $agrs['value'], // Der Wert des Cookies  11                  $agrs['expire'], // Ablaufzeit des Cookies  12                  $agrs['path'], // Welche Pfade sind erlaubt für diesen Cookie auf dem Server  13                  $agrs['domain'], // Die Domain für den der Cookie erreichbar ist  14                  $agrs['secure'], // Der Cookie wird nur über Sichere Verbindungen gesetzt und gelesen  15                  $agrs['httponly'] // Wenn auf TRUE wird nur die unsichere Verbindung genutzt  16          );  17      }  18      //.. ist der header bereits gesendet  19      else {  20          // Prüfen ob hilfsvariablen vorhanden  21          if (isset($filename) && isset($linenum)) {  22              // Fehler ausspucken   23              //trigger_error("Cookie could not be set on $filename line $linenum while header sent", E_USER_ERROR);  24          }  25          return false;  26      }  27  } 

    Du kannst diese Funktion verkürzen in dem du einfach die $args variable nur platzierst, so wie hier im Beispiel.


    // PHP CODE
       0  /**  1   * This function set the cookie  2   * @param array $agrs  3   */  4  function setMyCookie(array $agrs = array()) {  5      // Check if $args and header not sent  6      if ($agrs && !headers_sent($filename, $linenum)) {  7          // @see http://php.net/manual/de/function.setcookie.php  8          setcookie($agrs);  9      }  10      //.. is header sent or no args then do this  11      else {  12          // Check if header variables  13          if (isset($filename) && isset($linenum)) {  14              // Send error to admin or write in log file  15              // trigger_error("Cookie could not be set on $filename line $linenum while header sent", E_USER_ERROR);  16          }  17          return false;  18      }  19  } 

      So könnte dann Dein array aussehen was Du reinschicken wirst, siehe oben, dort haben wir alles beschriftet mit Kommentaren.


      // PHP CODE
         0  $agrs = array(  1     "name" => 'Visitor',  2     "value" => json_encode(array("totalvisits" => 0, "sites" => array())), // Dynamische variablen, die bei jedem Aufruf oder in bestimmten Zeit abständen aktualisiert werden können  3     "expire" => (time() + 2592000),  4     "path" => "/",  5     "domain" => "localhost",  6     "secure" => false,  7     "httponly" => false // Wenn nicht false dann können wir mit JavaScript nicht drauf zugreifen  8  );  9    10  // Aufruf unserer Funktion  11  setMyCookie($agrs); 

        Wir füllen alles was wir benötigen und schicken diese rein um diese Daten zu speichern die sich in value befinden. Mit expire legen wir die Ablaufzeit fest. Bei path erlauben wir mit dem slash das dieser Cookie auf der ganzen Webseite zugriff hat, jedoch könnten wir den Zugriff einschränken auf bestimmte Seiten. Domain ist glaub ich selbsterklärend :) so wie diese, secure ist für HTTPS für sichere Verbindungen und httponly nur für HTTP zugriffe.


        Auslesen des Cookies

        Natürlich möchten wir auch unsere Cookies auslesen und auswerten. Und dafür gibt es auch eine Lösung von PHP, Du kannst ein Cookie direkt ansprechen oder auch alle auf einmal.


        // PHP CODE
           0  /**  1   * This function gets the cookie   2   * @param type $args   3   * @return type   4   */  5  function getMyCookie($args = array()) {  6      return (isset($args["name"]) && isset($_COOKIE[$args["name"]]) ? json_decode($_COOKIE[$args["name"]]) : $_COOKIE);  7  }  8    9  // Alle Cookies  10  echo '<pre>';  11  var_dump(getMyCookie());  12  echo '</pre>';  13    14  // Ein bestimmter Cookie, der den wir gesetzt haben oben mit den Namen visitor  15  echo '<pre>';  16  var_dump(getMyCookie(array("name" => 'Visitor')));  17  echo '</pre>'; 

          // OUTPUT CODE
          // Ein bestimmter Cookie, der den wir gesetzt haben oben mit den Namen visitor
          object(stdClass)#1 (2) {
            ["totalvisits"] => int(0)
            ["sites"] => string(0)
          }

          // OUTPUT CODE
          // Nach erneutem Aufruf in Kombination mit hasMyCookie() und updateMyCookie()
          object(stdClass)#1 (2) {
            ["totalvisits"] => int(2)
            ["sites"]=>
            object(stdClass)#3 (2) {
              ["second"]=>
              object(stdClass)#2 (2) {
                ["url"] => string(36) "Sites/NetBeans/PHP-Cookie/second.php"
                ["hits"] => int(1)
              }
              ["index"]=>
              object(stdClass)#4 (2) {
                ["url"] => string(35) "Sites/NetBeans/PHP-Cookie/index.php"
                ["hits"] => int(1)
              }
            }
          }

          // OUTPUT CODE
          // In JavaScript
          {totalvisits: 2, 
              sites: 
                  index: hits: 1 url: "Sites/NetBeans/PHP-Cookie/index.php" 
                  second: hits: 1 url: "Sites/NetBeans/PHP-Cookie/second.php"
          }


          Aktualisieren des Inhalts

          Wir möchten auch die Information in unserem Cookie aktuell halten und so gut wie möglich Profilern in dem wie den User verfolgen und jeden seiner schritte festhalten.


          // PHP CODE
             0  /**  1   * This function update the cookie by name  2   * @param type $name   3   * @return type   4   */  5  function updateMyCookie($name = '') {  6    7      $cookie = getMyCookie(array('name' => $name));  8      $uribase = trim(basename(str_replace(array('-', '.php'), '', $_SERVER["REQUEST_URI"])), '/');  9    10      if (is_object($cookie->sites->$uribase)) {  11          $cookie->sites->$uribase->url = $_SERVER["REQUEST_URI"];  12          $cookie->sites->$uribase->hits = ($cookie->sites->$uribase->hits + 1);  13      }  14    15      $args = array();  16      $agrs['name'] = $name;  17      $agrs['value'] = json_encode(array("totalvisits" => ($cookie->totalvisits + 1), "sites" => $cookie->sites));  18      $agrs['expire'] = (time() + (365 * 24 * 60 * 60 * 1000));  19      $agrs['path'] = "/";  20      $agrs['domain'] = "localhost";  21      $agrs['secure'] = false;  22      $agrs['httponly'] = false;  23    24      setMyCookie($agrs);  25  }  26    27  updateMyCookie("Visitor"); 


            Prüfen ob PHP Cookie vorhanden

            Nach dem wir mit setMyCookie unseren Cookie platziert haben updaten wir mit jedem Aufruf unseren Cookie, jedoch darf nicht mehr setMyCookie aufgerufen werden. Deshalb helfen wir uns mit dieser Funktion in dem wir prüfen ob unser Cookie bereits gesetzt wurde.


            // PHP CODE
               0  /**  1   * This function gets the cookie   2   * @param type $name   3   * @return type   4   */  5  function hasMyCookie($name = '') {  6      return (isset($_COOKIE[$name]) ? true : false);  7  }  8    9  // Wenn Cookie vorhanden, Du kannst dies natürlich jetzt auch dynamisch nutzen in dem Du z.B. eine hash versehene IP-Adresse hier reinschickst so hast du einen relative eindeutigen User, die Du mit anderen Daten verknüpfen kannst.  10  if (hasMyCookie("Visitor")) {  11      updateMyCookie("Visitor");  12  } else {  13      $args = array();  14      $args['name'] = 'Visitor';  15      $args['value'] = json_encode(array("totalvisits" => 0, "sites" => ''));  16      $args['expire'] = (time() + 2592000);  17      $args['path'] = "/";  18      $args['domain'] = "localhost";  19      $args['secure'] = false;  20      $args['httponly'] = false;  21      setMyCookie($args);  22  } 


              PHP Cookie wieder entfernen

              Du kannst den Cookie oder alle Cookie selbstverständlich auch wieder löschen. Dies können wir wie folgt machen.


              // PHP CODE
                 0  /**  1   * This function delete the cookie by name  2   * @param type $name  3   */  4  function deleteMyCookie($name = '') {  5    6      if ($name) {  7          unset($_COOKIE[$name]);  8          setcookie($name, null, -1, '/');  9      } else {  10          if (isset($_SERVER['HTTP_COOKIE'])) {  11              $cookies = explode(';', $_SERVER['HTTP_COOKIE']);  12              foreach ($cookies as $cookie) {  13                  $parts = explode('=', $cookie);  14                  $remove = trim($parts[0]);  15                  if (unserialize($_COOKIE[$remove]) != false) {  16                      unset($_COOKIE[$remove]);  17                  }  18              }  19          }  20      }  21  }  22    23  // Aufruf unserer Funktion, weil sonst passiert nichts wenn wir dies nicht aufrufen :)  24  deleteMyCookie("Visitor"); 

                Wenn wir einen Namen mit schicken dann wird nur dieser Cookie entfernt, rufen wir die Funktion jedoch ohne einen String auf so werden alle Cookie entfernt die einen serialize string besitzen, damit wir nicht andere Cookies anfassen.



                Ein Nachteil oder nicht ?

                Der Nachteil, weil wir serverseitig arbeiten können wir nur bei einem Refresh der Seite User Interaktionen verfolgen und auch aufzeichnen. Doch deshalb gibt es JavaScript und damit können wir den Selben Cookie auslesen und somit noch mehr festhalten ohne die Seite jedesmal neu laden zu müssen. Sogar bis auf die Mausbewegung und welche Positionen sich der User aufhält kann so ermittelt werden und noch vieles mehr. Hier kannst Du diesen Cookie den wir oben platziert haben JavaScript auslesen  JavaScript - Cookies setzen und nutzen



                Hier noch der Ganze Code jedoch in einer Klasse zusammengestellt und einsatzbereit, Du kannst den Namen der Klasse ändern und auch die Funktionen umbenennen. Lagere Deine Funktionen in Klassen und auch separat in Dateien so das Du den überblick nicht verlierst wenn Dein Projekt wächst.


                // PHP CODE
                   0  /**  1   * Description of Cookie  2   *  3   * @author      Samet Tarim  4   * @copyright   (c) 2018, Samet Tarim  5   * @package     MelAbu  6   * @subpackage  MB Tornado Ai  7   * @since       1.0  8   * @link        http://tnado.com/  9   */  10  class MyCookie {  11    12      /**  13       * This function set the cookie   14       * @param array $agrs   15       */  16      public function setMyCookie(array $agrs = array()) {  17          $filename = '';  18          $linenum = '';  19          // Check if $args and header not sent   20          if ($agrs && !headers_sent($filename, $linenum)) {  21              // @see http://php.net/manual/de/function.setcookie.php   22              setcookie($agrs);  23          }  24          //.. is header sent or no args then do this   25          else {  26              // Check if header variables   27              if (isset($filename) && isset($linenum)) {  28                  // Send error to admin or write in log file  29                  echo 'can not send cookie';  30  //            trigger_error("Cookie could not be set on $filename line $linenum while header sent", E_USER_ERROR);  31              }  32          }  33      }  34    35      /**  36       * This function check if cookie exists  37       * @param type $name   38       * @return type   39       */  40      public function hasMyCookie($name = '') {  41          return (isset($_COOKIE[$name]) ? true : false);  42      }  43    44      /**  45       * This function gets the cookie   46       * @param type $args   47       * @return type   48       */  49      public function getMyCookie($args = array()) {  50    51          return (isset($args["name"]) && isset($_COOKIE[$args["name"]]) ? json_decode($_COOKIE[$args["name"]]) : $_COOKIE);  52      }  53    54      /**  55       * This function update the cookie by name  56       * @param type $name   57       * @return type   58       */  59      public function updateMyCookie($name = '') {  60    61          $cookie = $this->getMyCookie(array('name' => $name));  62          $uribase = trim(basename(str_replace(array('-', '.php'), '', $_SERVER["REQUEST_URI"])), '/');  63    64          if (is_object($cookie->sites->$uribase)) {  65              $cookie->sites->$uribase->url = $_SERVER["REQUEST_URI"];  66              $cookie->sites->$uribase->hits = ($cookie->sites->$uribase->hits + 1);  67          }  68    69          $args = array();  70          $agrs['name'] = $name;  71          $agrs['value'] = json_encode(array("totalvisits" => ($cookie->totalvisits + 1), "sites" => $cookie->sites));  72          $agrs['expire'] = (time() + (365 * 24 * 60 * 60 * 1000));  73          $agrs['path'] = "/";  74          $agrs['domain'] = "localhost";  75          $agrs['secure'] = false;  76          $agrs['httponly'] = false;  77    78          $this->setMyCookie($agrs);  79      }  80    81      /**  82       * This function delete the cookie by name  83       * @param type $name  84       */  85      public function deleteMyCookie($name = '') {  86    87          if ($name) {  88              unset($_COOKIE[$name]);  89              setcookie($name, null, -1, '/');  90          } else {  91              if (isset($_SERVER['HTTP_COOKIE'])) {  92                  $cookies = explode(';', $_SERVER['HTTP_COOKIE']);  93                  foreach ($cookies as $cookie) {  94                      $parts = explode('=', $cookie);  95                      $remove = trim($parts[0]);  96                      if (unserialize($_COOKIE[$remove]) != false) {  97                          unset($_COOKIE[$remove]);  98                      }  99                  }  100              }  101          }  102      }  103    104  } 

                  So verwendest Du es als Objekt und es ist viel übersichtlicher ;) Du kannst natürlich attribute setzen mit setter und getter und so die arrays erstellen oder auch ausgelagert reinschicken etc...


                  // HTML CODE
                     0  <?php  1  require_once './php/cookie.php';  2  $COOKIE = new MyCookie();  3    4  // Löschen des cookies  5  // $COOKIE->deleteMyCookie("Visitor");  6     7  if ($COOKIE->hasMyCookie("Visitor")) {  8      $COOKIE->updateMyCookie("Visitor");  9  } else {  10      $args = array();  11      $args['name'] = 'Visitor';  12      $args['value'] = json_encode(array("totalvisits" => 0, "sites" => ''));  13      $args['expire'] = (time() + (365 * 24 * 60 * 60 * 1000));  14      $args['path'] = "/";  15      $args['domain'] = "localhost";  16      $args['secure'] = false;  17      $args['httponly'] = false;  18      $COOKIE->setMyCookie($args);  19  }  20  ?>  21  <!DOCTYPE html>  22  <html>  23      <head>  24          <meta charset="UTF-8">  25          <title>Cookies</title>  26          <link href="css/style.css" rel="stylesheet">  27          <script type="text/javascript" src="js/script.js"></script>  28      </head>  29      <body>  30          <div class="wrap">  31              <ul>  32                  <li><a href="index.php">Home</a></li>  33                  <li><a href="second.php">Second</a></li>  34              </ul>  35              <?php  36              // Alle Cookies wenn dieser cookie nicht vorhanden oder wenn funktion ohne parameter aufgerufen wird  37              // Ein bestimmter Cookie, der den wir gesetzt haben oben mit den namen visitor  38              echo '<pre>';  39              var_dump($COOKIE->getMyCookie(array("name" => 'Visitor')));  40              echo '</pre>';  41              ?>  42          </div>  43      </body>  44  </html> 


                    Anzeige

                    Dein Kommentar

                    * Diese Felder sind erforderlich, E-Mails werden nicht veröffentlicht
                    ?

                    Dieses Feld ist optional
                    Fülle dieses Feld aus und verbinde Dein Namen mit Deiner Website.

                    Die in dieses Kontaktformular eingegebenen Daten werden in unserem System gespeichert, um die Ausgabe des Kommentars sicherzustellen. Ihre E-Mail-Adresse wird gespeichert, um die Anzahl der Kommentare und die zukünftige Registrierung zu bestimmen

                    Ich habe gelesen die Datenschutzbestimmungen und Nutzungsbedingungen. Ich bestätige die Übermittlung des Formulars und die Übermittlung meiner Daten.
                    tnado © 2019 | Alle Rechte Vorbehalten
                    In Zusammenarbeit mit Hyperly