kostenloser Webspace werbefrei: lima-city


Cookies und Session Cookies werden falsch gesetzt

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    mehralsnurradio

    mehralsnurradio hat kostenlosen Webspace.

    Hallo, ich teste gerade ein Tool welches messen soll wie viele Benutzer eine Seite hat. außerdem soll gezeigt werden wie viele neue Benutzer die Seite an einem z.B. Tag gekriegt hat. Dafür wird ein Cookie gesetzt, der zehn Jahre lang halten soll und der die Benutzer wiedererkennen soll. außerdem wird ein Session-Cookie gesetzt um zu gucken wie lange die Session dauert, das heißt der timestamp wird gespeichert und der letzte timestamp. Nun habe ich aber zwei große Probleme: erstens erkennt die Seite die Nutzer nicht wieder, wenn Sie ein zweites Mal nach einiger Zeit die Seite besuchen. Die Seite erkennt die Nutzer aber wieder, wenn sie innerhalb von kurzer Zeit die Seite besuchen Punkt das zweite Problem ist, dass die Session anscheinend viel zu lange dauert. Das führt dazu, das Benutzer die Seite am Morgen aufrufen und sie haben abend noch mal aufrufen immer noch die gleiche session verwenden. Das ist problematisch weil so die Session Dauer auf einem ganzen Tag aufgezeichnet wird.
    Das ganze läuft im Prinzip so ab das erste prüft wird ob der Cookie vorhanden ist, wenn ja wird ein Session-Cookie gesetzt und eine Session Zeile in die Datenbank hinzugefügt, wenn nicht wird zusätzlich noch der 10 Jahre Cookie gesetzt und der User in die Datenbank eingefügt. Hat irgendjemand eine Idee was ich falsch gemacht haben könnte?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    Hallo mehralsnurradio,

    ich kann leider nicht genau darauf eingehen was du falsch gemacht hast ohne deinen Code genau zu kennen. Ich kann dir aber einen alternativen Vorschlag machen, wie du anders und garantiert an die Daten kommst, die du haben möchtest. Du möchtest also sehen wann welcher Benutzer deine Seite besucht und wie lange er das tut, richtig? Dann würde ich folgendes tun:

    Setze einen Cookie, der eine eindeutige ID des Benutzers enthält. Mehr musst du nicht setzen und nicht bei deinen Besuchern speichern. Dann formulierst du einen DSGVO-gerechten Text zur Aufklärung deiner Seitenbesucher und blendest ihn auf deiner Seite ein, bevor dieses Cookie gesetzt wird. :wink:
    Anschließend erstellst du ein JavaScript, das einmal pro Minute per AJAX oder jQuery (kannst dir eins aussuchen) eine Seite im Hintergrund aufruft, die als Parameter die Benutzer-ID aus dem Cookie erhält. Diese Seite kann z. B. ein PHP- Skript sein (es geht auch Python o. Ä., das spielt im Grunde keine Rolle, aber PHP dürfte erstmal das Einfachste sein). Dieses PHP-Skript kann jetzt auf 2 weisen funktionieren, je nachdem was deine Serverleistung, Infrastruktur und deine Anforderungen hergeben:

    Möglichkeit 1)
    Das Skript prüft nun in der Datenbank, ob es einen Eintrag mit dieser Benutzer-ID bereits vor maximal 2 Minuten gab (das Skript wird zwar alle 60 Sekunden ausgeführt, aber es ist immer besser einen längeren Zeitrahmen zu nehmen, damit Lags und sonstige Verzögerungen das Ergebnis nicht verfälschen können. Ich habe deshalb mal noch eine Minute oben drauf gelegt.) und verlängert den Zeitraum dann in dessen Datenbank-Eintrag. Auf diese Weise wird geprüft, ob 2 Signale eine zusammenhängende Session ergeben. Falls kein entsprechender Eintrag existiert, legt es einen neuen für ihn/sie an und startet somit einen neuen Besuchszeitraum.

    Diese Möglichkeit erzeugt also pro Minute pro Besucher 1 SELECT und 1 INSERT oder UPDATE auf der Datenbank und verteilt die Rechen- und Datenbanklast damit über den Tag. Bei sehr vielen Besuchern ist die Last etwas höher als bei Möglichkeit 2 und du erhälst deine statistischen Daten augenblicklich.

    Möglichkeit 2)
    Das Skript schreibt jedes mal stur einen "Online"-Eintrag in eine seperate Tabelle und prüft rein garnichts. Hier brauchst du also noch ein weiteres Skript.
    Dieses zweite Skript lässt du per Cronjob alle 12 oder 24 Stunden ausführen. Du kannst auch andere Zeiträume wählen, je nach Anforderung, aber 24 Stunden erscheint mir erstmal ein guter Wert zu sein.
    Das Skript ist nun dazu da die gesammelten Rohdaten in zusammenhängende Besuchszeiträume zusammenzufassen. Es sammelt also erstmal alle "Online"-Einträge eines jeden Besuchers aus der seperaten Tabelle und prüft jeweils, ob die Einträge maximal 2 Minuten auseinander liegen. Ist dem so, wird der Zeitraum zwischen dem ersten und letzten Eintrag berechnet und in deine Statistik eingefügt. Liegen die Zeiträume weiter als 2 Minuten auseinander werden die Einträge seperat behandelt und 2 oder noch mehr kleinere Zeiträume (die dann jeweils zusammenhängen) in deine Statistik eingefügt.
    Nachdem alle Rohdaten verarbeitet wurden löschst du diese, damit sie bei der nächsten Verarbeitung kein zweites mal verarbeitet werden und beugst somit Duplikaten vor.

    Diese Möglichkeit erzeugt pro Minute pro Besucher 1 INSERT auf der Datenbank und alle 24 Stunden 1 weiteres SELECT und (je nach Besuchszahlen) mehrere bis sehr viele UPDATES in kurzer Zeit. Die Rechen- und Datenbanklast über den Tag ist hierbei geringer als bei Möglichkeit 1 und eignet sich damit besonders bei sehr vielen Besuchern (ich schätze mal so 1000-2000+ am Tag, genaueres musst du selbst mal in nem Benchmark herausfinden). Einmal pro 24 (oder X) Stunden (je nach dem was du wählst) gibt es dann eine Lastspitze, die du allerdings auf die Nacht legen könntest, falls deine Seite hauptsächlich aus Deutschland oder einem anderen Land besucht wird. Nachts stört es dann niemanden wie lange die Berechnung dauert. Letzteres trifft natürlich nicht zu, wenn deine Besucher aus allen möglichen Zeitzonen kommen, dann müsstest du wiederrum mal einen Benchmark laufen lassen, wann ein geeigneter Zeitpunkt mit wenig Lastanforderungen im Durchschnitt ist. Du erhälst deine statistischen Daten dann verzögert, also immer erst wenn deine Rohdaten vollständig verarbeitet wurden.

    So viel erstmal nur zur grundsätzlichen Technik dahinter. Wenn du noch weitere Fragen hast oder Code-Beispiele brauchst, gerne fragen.
  4. Autor dieses Themas

    mehralsnurradio

    mehralsnurradio hat kostenlosen Webspace.

    Das Problem ist ja gar nicht unbedingt die Session Dauer, das eigentliche Problem ist, dass der Cookie mit der eindeutigen UserID gar nicht gesetzt wird.
    Auch die Session wird nicht gesetzt.
  5. witze-dschungel

    witze-dschungel hat kostenlosen Webspace.

    mehralsnurradio schrieb:
    die Session wird nicht gesetzt.

    Wie schon von @vampiresilence erwähnt lässt sich ohne Code nur begrenzt Hilfestellung leisten.

    Allgemein gesagt lässt sich häufig eine nicht funktionierende Session auf ein fehlendes
    session_start();
    zurückführen. Wichtig ist auch dass dies direkt nach dem öffnenden <?php-Tag eingefügt wird.

    Siehe: Meine Sessions funktionieren nicht! | lima-city Hilfe

    Beitrag zuletzt geändert: 30.3.2020 23:47:16 von witze-dschungel
  6. Autor dieses Themas

    mehralsnurradio

    mehralsnurradio hat kostenlosen Webspace.

    <?php
    include 'config/datas.php'; 
    
    $browser = get_browser(null, true);
    
    $uagent = $_SERVER['HTTP_USER_AGENT'];
    
    ;
    
    //Android
    
    if (strpos($uagent, "Android")){
    
    $pos = strpos($uagent,"Android");
    $rest = substr($uagent, $pos);
    
    $teiler1 = explode(";", $rest);
    $teiler2 = explode(")", $teiler1[1]);
    $teiler3 = explode(" Build", $teiler2[0]);
    $teiler4 = explode("/", $teiler3[0]);
    
    $teilerx = explode(")", $teiler1[0]);
    
    $teiler1lol = $teiler1[1] . "lol";
    
    if(strpos($uagent, ")") <= 41){
    $version = $teilerx[0];
    $device = "Unknown";
    }
    
    elseif(strpos($teiler1[1], "-") == 3 AND (strpos($teiler1lol, "lol") == 6 OR strpos($teiler1lol, "lol") == 4 OR strpos($teiler1lol, "lol") == 3)){
    $teiler2x = explode(")", $teiler1[2]);
    $teiler3x = explode(" Build", $teiler2x[0]);
    $teiler4x = explode("/", $teiler3x[0]);
    
    $version = $teiler1[0];
    $device = $teiler4x[0];
    }
    
    else{
    $version = $teiler1[0];
    $device = $teiler4[0];
    }
    
    }
    
    
    //iOS
    
    if (strpos($uagent, "iPod") OR strpos($uagent, "ipod")) {
     $iosbrand = "iPod";
    }
    elseif (strpos($uagent, "iPhone") OR strpos($uagent, "iphone")) {
     $iosbrand = "iPhone";
    }
    elseif (strpos($uagent, "iPad") OR strpos($uagent, "ipad")) {
     $iosbrand = "iPad";
    }
    elseif (strpos($uagent, "WeatherReport")) {
     $iosbrand = "iPhone";
    }
    
    if($iosbrand == "iPad" OR $iosbrand == "iPhone" OR $iosbrand == "iPod"){
    
    if (strpos($uagent, $iosbrand) != 13 AND strpos($uagent, $iosbrand) != 14){
     if(strpos($uagent, "WeatherReport")){
      $device = $iosbrand;
      $version = "Unknown";
      $br = TRUE;
      $browserx = "WeatherReport";
     }
     elseif(strpos($uagent, "Outlook")){
      $device = $iosbrand;
      $version = "Unknown";
      $browserx = "Outlook";
      $br = TRUE;
     }
    
    else{
     $device = $iosbrand;
     $version = "Unknown";
    }
    }
    
    else {
    
    $pos = strpos($uagent,"OS");
    $rest = substr($uagent, $pos);
    
    $resty = str_replace("_", ".", $rest);
    
    $teiler1 = explode(" like", $resty);
    $version = "i".$teiler1[0];
    $device = $iosbrand;
    
    }
    }
    
    
    //Windows
    
    if(strpos($uagent, "Windows NT")){
     $pos = strpos($uagent,"Windows NT");
     $rest = substr($uagent, $pos);
     $device = "Computer (Windows)";
     $teiler1 = explode(";", $rest);
     $teiler2 = explode(")", $teiler1[0]);
     switch ($teiler2[0]){
      case "Windows NT 5.1":
       $version = "Windows XP";
       break;
      case "Windows NT 5.2":
       $version = "Windows XP Professional";
       break;
      case "Windows NT 6.0":
       $version = "Windows Vista";
       break;
      case "Windows NT 6.1":
       $version = "Windows 7";
       break;
      case "Windows NT 6.2":
       $version = "Windows 8";
       break;
      case "Windows NT 6.3":
       $version = "Windows 8.1";
       break;
      case "Windows NT 6.4":
       $version = "Windows 10";
       break;
      case "Windows NT 10.0":
       $version = "Windows 10";
       break;
     }
    }
    
    //Linux
    
    if(strpos ($uagent, "Ubuntu")){
     $version = "Linux Ubuntu";
     $device = "Unknown";}
    elseif(strpos ($uagent, "inux-gnu") OR strpos ($uagent, "Debian")){
     $version = "Linux Debian/GNU";
     $device = "Unknown";}
    elseif(strpos ($uagent, "Tizen")){
     if(strpos ($uagent, "SMART-TV")){
     $version = "SMART-TV (Tizen/Linux)";
     $device = "Unknown";}
     else{
     $version = "Linux Tizen";
     $device = "Unknown";}}
    elseif(strpos ($uagent, "Fedora")){
     $version = "Linux Fedora";
     $device = "Unknown";}
    
    else{
    if(strpos($uagent, "inux") AND strpos($uagent, "Android") === FALSE AND strpos($uagent, "Windows") === FALSE){
     $version = "Linux";
     $device = "Unknown";
    }}
    
    
    //Mac (+iOS 13)
    
    if(strpos($uagent, "Macintosh")){
     $device = "Computer (Apple Mac)";
    
    $pos = strpos($uagent,"OS X");
    $rest = substr($uagent, $pos+4);
    $resty = str_replace("_", ".", $rest);
     $teiler1 = explode(";", $resty);
     $teiler2 = explode(")", $teiler1[0]);
     $teiler3 = explode(".", $teiler2[0]);
     $teilxyx = "10." . $teiler3[1];
    
     switch ($teilxyx){
      case 10.0:
       $version = "macOS X Cheetah 10.0";
       break;
      case 10.1:
       $version = "macOS X Puma 10.1";
       break;
      case 10.2:
       $version = "macOS X Jaguar 10.2";
       break;
      case 10.3:
       $version = "macOS X Panther 10.3";
       break;
      case 10.4:
       $version = "macOS X Tiger 10.4";
       break;
      case 10.5:
       $version = "macOS X Leopard 10.5";
       break;
      case 10.6:
       $version = "macOS X Snow Leopard 10.6";
       break;
      case 10.7:
       $version = "OS X Lion 10.7";
       break;
      case 10.8:
       $version = "OS X Mountain Lion 10.8";
       break;
      case 10.9:
       $version = "OS X Mavericks 10.9";
       break;
      case 10.10:
       $version = "OS X Yosemite 10.10";
       break;
      case 10.11:
       $version = "OS X El Capitan 10.11";
       break;
      case 10.12:
       $version = "macOS Sierra 10.12";
       break;
      case 10.13:
       $version = "macOS High Sierra 10.13";
       break;
      case 10.14:
       $version = "macOS Mojave 10.14";
       break;
      case 10.15:
       $version = "macOS Catalina 10.15";
       break;
      defaukt:
       $version = "Unknown";
       break;
     }
    }
    elseif(strpos($uagent, "mac") OR strpos($uagent, "Mac")){
     $device = "Computer (Apple Mac)";
     $version = "Unknown";
    }
    
    
    //Bots
    
    if(strpos($uagent, "http://") OR strpos($uagent, "https://") OR strpos($uagent, ".com") OR strpos($uagent, "Bot") OR strpos($uagent, "bot")){
    
    if(strpos($uagent, "compatible")){
    $pos = strpos($uagent,"compatible");
    $rest = substr($uagent, $pos);
     $teiler1 = explode(";", $rest);
     if(strpos($teiler1[2], "http")){
      $teiler2 = explode(")", $teiler1[2]);
      $boturlz = explode("+", $teiler2[0]);
    if(strpos($boturlz[1], "ttp")){
     $boturl = $boturlz[1];
    } //
    elseif(strpos($boturlz[0], "ttp")){
     $boturl = $boturlz[0];
    } //
    else{
     $boturl = "Unknown";
    } //
      $botnamey = explode("/", $teiler1[1]);
      $botname = $botnamey[0];
    if(is_int($botnamey[1])){
      $botversion = $botnamey[1];}else{
    $res = preg_replace("/[^a-zA-Z]/", "", $botnamey[1]);
      $botversion = $botnamey[1];
    } //
     } //
    
    $device = "Bot (Name: $botname, URL: $boturl)";
     $version = $botversion;
    
    } //
    
    elseif(strlen ($uagent) <= 45){
     if(strpos($uagent, "/")){
      $botv = explode("/", $uagent);
      $device = "Bot ($botv[0])";
      $version = $botv[1];
     }
     else{
      $device = "Bot ($uagent)";
      $version = "Unknown";
     }
    }
    
    elseif(strpos($uagent, "http")){
     $pos = strpos($uagent,"http");
     $rest = substr($uagent, $pos);
     $teiler1 = explode(";", $rest);
     $teiler2 = explode(")", $teiler1[0]);
     $device = "Bot (URL: $teiler2[0])";
     $version = "Unknown";
    }
    
    else{
     $device = "Bot";
     $version = "Unknown";
    }
    
    if($stripx == 1 AND $strip != 1 AND strpos($uagent, "http")){
     $pos = strpos($uagent,"http");
     $rest = substr($uagent, $pos);
     $teiler1 = explode(";", $rest);
     $teiler2 = explode(")", $teiler1[0]);
     $device = "Bot (URL: $teiler2[0])";
     $version = "Unknown";
    }
     
    
    } //x
    
    
    if($br === TRUE){
    }
    else{
     $browserx = $browser[browser];
    }
    
    
    $langteiler = explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
    
    //MYSQLI PDO
    
     $pdo = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
    
    $comefrom = $_SERVER['HTTP_REFERER'];
    if(empty($comefrom)){$comefrom = "Direct";}
    
    $cometo = $_SERVER['SCRIPT_NAME'];
    $hostname = $_SERVER['HTTP_HOST'];
    
    $timestamp = time();
    $code = rand(1,9999999999);
    
    if(isset($_COOKIE["poo-id"])){
              $statement = $pdo->prepare("SELECT * FROM POODLE_users WHERE id =
     :cookie");
              $statement->execute(array(':cookie' => $_COOKIE["poo-id"]));
                        while($row = $statement->fetch()) {
                          if(!isset($_SESSION["sess-id"])){
                            session_start();
                            }
                            $statement = $pdo->prepare("INSERT INTO POODLE_sessions (user, hostname, timestamp, newuser, header, comefrom, cometo, klicks, sites, browser, endtime)
                                                        VALUES (:cookie, :hostname, :timestamp, :newuser, :header, :comefrom, :cometo, :klicks, :sites, :browser, :endtime) WHERE id = :cookie");
                            $statement->execute(array(':cookie' => $_COOKIE["poo-id"], ':hostname' => $hostname, ':timestamp' => $timestamp, ':newuser' => 'no', ':header' => $uagent,
                                                         ':comefrom' => $comefrom, ':cometo' => $cometo, ':klicks' => '0', 'sites' => $cometo, ':browser' => $browserx, ':endtime' => $timestamp));
                        $statement = $pdo->prepare("SELECT * FROM POODLE_sessions WHERE user = :cookie ORDER BY id DESC LIMIT 1");
                        $statement->execute(array(':cookie' => $_COOKIE["poo-id"]));
                        while($row = $statement->fetch()) {                                                
                         $_SESSION["sess-id"] = $row["id"];
                        }
    
       }
                          if(isset($_SESSION["sess-id"])){
                               $statement = $pdo->prepare("SELECT * FROM POODLE_sessions WHERE id = :sessid");
                               $statement->execute(array(':sessid' => $_SESSION["sess-id"]));
                               while($row = $statement->fetch()) {
                               if(empty($row['klicks'])){$klicks = 1;}else{
                               $klicks = $row['klicks'] + 1;}
                               if(empty($row['sites'])){$sites = 1;}else{
                               $sites = $row['sites'] . ", " . $cometo;
                               }}
                               $statement = $pdo->prepare("UPDATE POODLE_sessions SET klicks = :klicks, sites = :sites, endtime = :endtime WHERE id = :sessid");
                               $statement->execute(array(':sessid' => $_SESSION["sess-id"], ':klicks' => $klicks, 'sites' => $sites, ':endtime' => $timestamp));
                          }
    }
    else{
                               $statement = $pdo->prepare("INSERT INTO POODLE_users (language, device, system, code)
                                                        VALUES (:language, :device, :system, :code)");
                               $statement->execute(array(':language' => $langteiler[0], ':device' => $device, ':system' => $version, ':code' => $code));
    
              $statement = $pdo->prepare("SELECT * FROM POODLE_users WHERE code = :code");
              $statement->execute(array(':code' => $code));
              while($row = $statement->fetch()) {    
               setcookie("poo-id", $row["id"], time() + (10 * 365 * 24 * 60 * 60),"/", $_SERVER["HTTP_HOST"], 0);                     
               $ersatz = $row["id"];     
              }
              session_start();
    
                            $statement = $pdo->prepare("INSERT INTO POODLE_sessions (hostname, user, timestamp, newuser, header, comefrom, cometo, klicks, sites, browser, endtime)
                                                        VALUES (:hostname, :cookie, :timestamp, :newuser, :header, :comefrom, :cometo, :klicks, :sites, :browser, :endtime)");
                            $statement->execute(array(':hostname' => $hostname, ':cookie' => $ersatz, ':timestamp' => $timestamp, ':newuser' => 'yes', ':header' => $uagent,
                                                         ':comefrom' => $comefrom, ':cometo' => $cometo, ':klicks' => '1', 'sites' => $cometo, ':browser' => $browserx,
                                                         ':endtime' => $timestamp));
                        $statement = $pdo->prepare("SELECT * FROM POODLE_sessions WHERE user = :cookie ORDER BY id DESC LIMIT 1");
                        $statement->execute(array(':cookie' => $ersatz));
                        while($row = $statement->fetch()) {                                                
                         $_SESSION["sess-id"] = $row["id"];
                        }
    
    }


    Das ist der Code.
    Der Anfang ist für die Cookies irrelevant, dort werden nur die gängigsten Modelle überprüft.
  7. witze-dschungel

    witze-dschungel hat kostenlosen Webspace.

    mehralsnurradio schrieb:
    [...]
    if(!isset($_SESSION["sess-id"])){
        session_start();
    }

    [...]
    $ersatz = $row["id"];     
     }
    session_start();


    Das session_start() gehört an den Anfang deines PHP-Skripts, direkt nach dem öffnenden <?php-Tag. Später wird es seinen Zweck nicht mehr erfüllen. Momentan ist es an mehreren Stellen in deinem Skript verteilt.

    Siehe: Meine Sessions funktionieren nicht! | lima-city Hilfe
  8. Autor dieses Themas

    mehralsnurradio

    mehralsnurradio hat kostenlosen Webspace.

    witze-dschungel schrieb:
    mehralsnurradio schrieb:
    [...]
    if(!isset($_SESSION["sess-id"])){
        session_start();
    }

    [...]
    $ersatz = $row["id"];     
     }
    session_start();


    Das session_start() gehört an den Anfang deines PHP-Skripts, direkt nach dem öffnenden <?php-Tag. Später wird es seinen Zweck nicht mehr erfüllen. Momentan ist es an mehreren Stellen in deinem Skript verteilt.

    Siehe: Meine Sessions funktionieren nicht! | lima-city Hilfe


    Also kann ich die Session immer am Anfang des Scripts starten egal ob sie schon gesetzt ist?
    Und wieso wird mein Cookie nach dem schließen des Browsers gelöscht?

    Beitrag zuletzt geändert: 31.3.2020 13:00:41 von mehralsnurradio
  9. witze-dschungel

    witze-dschungel hat kostenlosen Webspace.

    mehralsnurradio schrieb:
    Also kann ich die Session immer am Anfang des Scripts starten egal ob sie schon gesetzt ist?

    Richtig, ein session_start() am Anfang reicht. Falls bereits eine session existiert wird sie wieder mit aufgegriffen.

    mehralsnurradio schrieb:
    Und wieso wird mein Cookie nach dem schließen des Browsers gelöscht?

    Kann ich mit deinem Code so nicht reproduzieren. Dein Code erstellt problemlos einen Cookie der bis 29.03.2030 gültig ist (sichtbar mit der Browser-Extension "EditThisCookie"). Auch nach einem Neustart des Browsers ist der Cookie noch vorhanden. Das Problem muss also an anderer Stelle liegen.

    Folgenden Code habe ich zum Testen genutzt:
    <?php
    setcookie("poo-id", "id", time() + (10 * 365 * 24 * 60 * 60),"/", $_SERVER["HTTP_HOST"], 0);



    Beitrag zuletzt geändert: 31.3.2020 13:33:02 von witze-dschungel
  10. witze-dschungel schrieb:
    Das session_start() gehört an den Anfang deines PHP-Skripts, direkt nach dem öffnenden <?php-Tag. Später wird es seinen Zweck nicht mehr erfüllen.
    Was so zwar nicht falsch, aber auch nicht ganz richtig ist. Die Session muss gestartet werden, vor jeglicher Ausgabe, kann bei entsprechender Berücksichtigung allerdings an jeder Stelle im Code ausgeführt werden. In einigen Fällen ist es sogar notwendig oder zumindest ratsam, die Session erst später zu starten.
    Nehmen wir beispielsweise die Tatsache, dass du aus Datenschutzgründen genau genommen die Session erst starten darfst, nachdem der Benutzer sein Okay dazu gegeben hat.
    Hierbei ist zu beachten, dass man dies vor jeglicher Ausgabe machen muss. Gerne passiert hier der Fehler, dass bei per
    include
    oder
    require
    eingebundenen Dateien hinter einem schließenden
    ?>
    noch ein Leerzeichen oder eine Leerzeile folgt, was als Ausgabe wiedergegeben wird. Umgehen kann man dies, indem man bei entsprechenden Dateien das schließende
    ?>
    einfach weg lässt. Zudem sorgen natürlich Fehler- oder Warnmeldungen dafür, dass Ausgaben erzeugt werden.

    Allgemein würde ich empfehlen, einen eher Objektorientierten Weg zu gehen. Zum einen zugunsten der Les- und Wartbarkeit, zum anderen, weil dadurch gewisse Fehler verringert werden, wie ein mehrfaches
    session_start
    . Zudem bietet es sich an, sämtliche Ausgaben in einen Buffer zu speichern um diesen am Ende des Skripts dann zu flushen.(s. Output-Buffering, Output Control Functions)
    Da hier offenbar allgemein kein Output gewünscht ist, kann man das auch gleich auf
    null
    umleiten. Dann spielt es im wesentlichen keine Rolle mehr, wann oder wo die Session gestartet oder der Cookie gesetzt wird.
  11. michaelhoffmann

    michaelhoffmann hat kostenlosen Webspace.

    Hallo mehralsnurradio,

    Deine Aussage: Erstens erkennt die Seite die Nutzer nicht wieder, wenn Sie ein zweites Mal nach einiger Zeit die Seite besuchen. Die Seite erkennt die Nutzer aber wieder, wenn sie innerhalb von kurzer Zeit die Seite besuchen

    Ist die Cookie-Dauer denn auch tatsächlich auf 10 Jahre festgesetzt?
    Was sagen die Chrome- oder Firefox-Entwicklertools?


    Deine Aussage: Das zweite Problem ist, dass die Session anscheinend viel zu lange dauert

    Was genau das Ende einer Session ist, ist nicht fest definiert. Hier kocht jeder Browser sein eigenes Süppchen. Man sollte sich also nicht auf ein einheitliches Verhalten der Browser verlassen.
    Um serverseitig eine Lebensdauer für Session-Cookies zu setzen, gibt es die PHP-Option session.gc_maxlifetime


    https://www.php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime

    Ich hoffe, dass ich helfen konnte.
  12. Autor dieses Themas

    mehralsnurradio

    mehralsnurradio hat kostenlosen Webspace.

    michaelhoffmann schrieb:
    Hallo mehralsnurradio,

    Deine Aussage: Erstens erkennt die Seite die Nutzer nicht wieder, wenn Sie ein zweites Mal nach einiger Zeit die Seite besuchen. Die Seite erkennt die Nutzer aber wieder, wenn sie innerhalb von kurzer Zeit die Seite besuchen

    Ist die Cookie-Dauer denn auch tatsächlich auf 10 Jahre festgesetzt?
    Was sagen die Chrome- oder Firefox-Entwicklertools?


    Deine Aussage: Das zweite Problem ist, dass die Session anscheinend viel zu lange dauert

    Was genau das Ende einer Session ist, ist nicht fest definiert. Hier kocht jeder Browser sein eigenes Süppchen. Man sollte sich also nicht auf ein einheitliches Verhalten der Browser verlassen.
    Um serverseitig eine Lebensdauer für Session-Cookies zu setzen, gibt es die PHP-Option session.gc_maxlifetime


    https://www.php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime

    Ich hoffe, dass ich helfen konnte.



    Mein Problem ist ja nicht dass die session gleich bleibt wenn der Benutzer noch einmal auf die Seite zurückkehrt, das wäre ja nicht wirklich schlimm, das Problem ist nur dass die Sessions teilweise durchschnittlich pro Tag bei 25 Benutzern bei 6 Stunden pro session liegen. Außerdem werden alte Benutzer nie wieder erkannt so dass ich genauso viele neue Nutzer wie Nutzer habe was für ein Analytics Tool nicht so sinnvoll ist. Was würdet ihr da empfehlen? Ich kenne außer Cookies nichts.
    https://poodletest.hundretsix.de/IMG_20200407_172316.jpg

    Beitrag zuletzt geändert: 7.4.2020 17:24:51 von mehralsnurradio
  13. Browser-Fingerprinting wäre noch so ne Möglichkeit die unabhängig von Cookies funktioniert.
    Kann natürlich aber auch schlechtere Ergebnise liefern.
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!