Nico: Sessionvariablen werden gelöscht

Hallo!

Ich habe aus dem SelfHTML-ForumsArchiv ein Script nach meinen Bedürfnissen angepasst und das ist dabei rausgekommen:

<?php
session_start();
$cfile = "count.txt";
$fh = fopen($cfile,'a');
fclose($fh);

$fh = fopen($cfile, 'rb+');
$count = intval(fgets($fh, 1024));
echo $_SESSION['lastvisit']."<br>";
if (time()-$_SESSION['lastvisit']>7200 OR $_SESSION['lastvisit']=""){
$_SESSION['lastvisit']=time();
$count++;
}
$_SESSION['lastvisit']=$_SESSION['lastvisit'];
fseek($fh, 0, SEEK_SET);
fputs($fh, $count);
fclose($fh);
echo $count;

phpinfo();
?>

Das soll also ein Besucherzähler werden. Die Session benutze ich um einen Besucher, der 10 mal die Seite aktualisiert nicht zehn mal mitgezählt wird.
Beim erstmaligen Ausführen des Scripts wird auch ordnungsgemäß der Zähler erhöht. Beim zweiten nicht. So weit, so gut.
Aber beim dritten Mal wird der Zähler erhöht, obwohl die Zeitspanne die 2 Stunden nicht überschreitet. Die angezeigte Sessionvariable 'lastvisit' ist dann auch plötzlich "".
Ich denke mir also, dass entweder die ganze Session bzw. der Cookie oder blos die eine Variable gelöscht wurde (Ersteres halte ich aber für wahrscheinlicher).
In der phpinfo() steht auch session.cookie_lifetime=0. Könnte das evt. etwas mit meinem Problem zu tun haben?
Das Problem ist übrigens, dass der Zähler beim mehrmaligen Ausführen des Scripts hintereinander alle zwei Male erhöht wird. Also beim dritten, fünten, siebten... Mal.
Ich hoffe, mir kann jemand helfen.

Nico

  1. Hi Nico,

    schalt mal alle Fehlermeldungen ein:

    <?php

    error_reporting(E_ALL);

    session_start();
    $cfile = "count.txt";
    $fh = fopen($cfile,'a');
    fclose($fh);

    $fh = fopen($cfile, 'rb+');
    $count = intval(fgets($fh, 1024));
    echo $_SESSION['lastvisit']."<br>";
    if (time()-$_SESSION['lastvisit']>7200 OR $_SESSION['lastvisit']=""){
    $_SESSION['lastvisit']=time();
    $count++;
    }

    #   $_SESSION['lastvisit']=$_SESSION['lastvisit'];

    PHP ist nicht JavaScript, wo sowas ggf. eine Aktion auslösen würde

    fseek($fh, 0, SEEK_SET);
    fputs($fh, $count);
    fclose($fh);
    echo $count;

    phpinfo();
    ?>

    LG
    Chris

  2. Hello,

    Ich habe aus dem SelfHTML-ForumsArchiv ein Script nach meinen Bedürfnissen angepasst und das ist dabei rausgekommen:

    <?php

    Error_reporting(E_ALL);

    session_start();
    $cfile = "count.txt";
    $fh = fopen($cfile,'a');
    fclose($fh);

    $fh = fopen($cfile, 'rb+');

    flock($fh,LOCK_EX);

    $count = intval(fgets($fh, 1024));

    beim ersten Mal ist hier $_SESSION['lasvisit'] nicht vorhanden.

    echo $_SESSION['lastvisit']."<br>";

    Die Funktion nur einmal aufrufen!

    $time = time();

    if (!empty($_SESSION['lastvisit']))
      {
        Echo "<p>Dein Letzter Besuch war am ".
              date('d.m.Y H:i:s',$_SESSION['lastvisit'])."</p>\n";
        if ( $time - $_SESSION['lastvisit'] > 7200 )
        {
          $count++;
        }
      }
      else
      {
        Echo "<p>Willkommen zu Deinem neuen Besuch: ".
              date('d.m.Y H:i:s',$_SESSION['lastvisit'])."</p>\n";
      }

    $_SESSION['lastvisit'] = $time;

    fseek($fh, 0, SEEK_SET);
    fputs($fh, $count);
    fclose($fh);

    Echo $count;

    ?>

    Die Echo-Texte sind nur als Beispiel gedacht, welcher Zustand an der Stelle besteht.

    Harzliche Grüße vom Berg
    esst mehr http://www.harte-harzer.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hello,

      <?php
        Error_reporting(E_ALL);
      session_start();
      $cfile = "count.txt";
      $fh = fopen($cfile,'a');
      fclose($fh);

      $fh = fopen($cfile, 'rb+');
        flock($fh,LOCK_EX);
      $count = intval(fgets($fh, 1024));

      beim ersten Mal ist hier $_SESSION['lasvisit'] nicht vorhanden.

      echo $_SESSION['lastvisit']."<br>";

      Die Funktion nur einmal aufrufen!

      $time = time();

      if (!empty($_SESSION['lastvisit']))
        {
          Echo "<p>Dein Letzter Besuch war am ".
                date('d.m.Y H:i:s',$_SESSION['lastvisit'])."</p>\n";
          if ( $time - $_SESSION['lastvisit'] > 7200 )
          {
            $count++;
          }
        }
        else
        {
          Echo "<p>Willkommen zu Deinem neuen Besuch: ".
                date('d.m.Y H:i:s',$_SESSION['lastvisit'])."</p>\n";

      $count++;

      }

      $_SESSION['lastvisit'] = $time;

      fseek($fh, 0, SEEK_SET);
      fputs($fh, $count);
      fclose($fh);

      Echo $count;

      ?>

      Sorry, aber sonst würde der Erstbesuch gar nicht gezählt werden.
      Wenn also nun jemand keine Cookies annimmt, wird trotzdem jeder Hit gezählt.
      Aber das weißt Du doch bestimmt...

      Harzliche Grüße vom Berg
      esst mehr http://www.harte-harzer.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Danke! etzt funktionierts.
        Danke auch an Chris. So hatte ichs auch schon probiert. Aber das hat nicht funktioniert.

        Nico

        1. Oh! Es geht doch nicht ganz. Ich hab das Script jetzt nach ca 1 Stunde nochmal ausgeführt und da kam
          Notice: Undefined index: lastvisit in ... on line 12
          Und da ja dann empty($_SESSION['lastvisit'])=true, wurde dann wieder gezählt.
          Kann das etwas mit dem session.cookie_lifetime=0 in der phpinfo() zu tun haben?

          Nico

          1. Hello,

            Notice: Undefined index: lastvisit in ... on line 12
            Und da ja dann empty($_SESSION['lastvisit'])=true, wurde dann wieder gezählt.
            Kann das etwas mit dem session.cookie_lifetime=0 in der phpinfo() zu tun haben?

            Genau das hat Dennis Dir gerade geschrieben.

            Harzliche Grüße vom Berg
            esst mehr http://www.harte-harzer.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Gut. Jetzt ist alles klar. Für alle, die den kompletten Quellcode nochmal sehen wollen:

              <?php
              error_reporting(E_ALL);
              session_start();
              $cfile = "count.txt";
              $fh = fopen($cfile,'a');
              fclose($fh);

              $fh = fopen($cfile, 'rb+');
              flock($fh,LOCK_EX);
              $count = intval(fgets($fh, 1024));
              $time=time();
              if (empty($_SESSION['lastvisit'])){
              echo "Willkommen zu deinem neuen Besuch<br>";
              $_SESSION['lastvisit']=time();
              $count++;
              fseek($fh, 0, SEEK_SET);
              fputs($fh, $count);
              fclose($fh);
              exit;
              }
              if (time()-$_SESSION['lastvisit']>7200){
              echo "Willkommen zu deinem neuen Besuch<br>";
              $_SESSION['lastvisit']=time();
              $count++;
              }
              Else{echo "Du warst schon mal hier seit den letzten 2 Stunden.<br>Dein letzter Besuch war am ".date('d.m.Y um H:i:s',$_SESSION['lastvisit']).".<br>";}
              $_SESSION['lastvisit']=$_SESSION['lastvisit'];

              fseek($fh, 0, SEEK_SET);
              fputs($fh, $count);
              fclose($fh);
              echo $count;
              ?>

              Das ist zwar ein bisschen anders als das, was wir - besser gesagt meine Helfer, denen ganz herzlich gedankt sei - hier fabriziert haben. Es funktioniert aber trotzdem. Nur wenn man den Browser schließt wird die Session gelöscht. Aber das ist ja auch nicht so schlimm. Wenn derjenige dann wieder auf die Seite kommt, wird er als neuer esucher gelistet. Das ist er dann ja im Prinzip auch.

              Nico

      2. Hi Tom,

        if (!empty($_SESSION['lastvisit']))
          {

        # [...]

        }
          else
          {
            Echo "<p>Willkommen zu Deinem neuen Besuch: ".
                  # date('d.m.Y H:i:s',$_SESSION['lastvisit'])."</p>\n";

        # an dieser Stelle existiert $_SESSION['lastvisit']
                                        # doch noch gar nicht, wie wir oben ja abgefragt
                                        # haben, deshalb müsste hier doch eigentlich $time
                                        # verwendet werden
                      date('d.m.Y H:i:s', $time) . "</p>\n";

        $count++;

        }

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Irre gehören ins Showgeschäft, sonst müsste ich da nicht sein. (Dieter Bohlen)
        1. Hello,

          else
            {
              Echo "<p>Willkommen zu Deinem neuen Besuch: ".
                    # date('d.m.Y H:i:s',$_SESSION['lastvisit'])."</p>\n";
                                          # an dieser Stelle existiert $_SESSION['lastvisit']
                                          # doch noch gar nicht, wie wir oben ja abgefragt
                                          # haben, deshalb müsste hier doch eigentlich $time
                                          # verwendet werden
                        date('d.m.Y H:i:s', $time) . "</p>\n";
                $count++;
            }

          Wo Du Recht hast...
          Stimmt auffallend.

          Harzliche Grüße vom Berg
          esst mehr http://www.harte-harzer.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau