Nils: Counter mit IP-Sperre

Hallo,
ich hätte gerne einen PHP-Counter der die IP logt und diese ca. 1 Stunde speichert.

Ich hab schon nen Counter gefunden, der die IP für immer speichert, aber ich hätte es gerne, wenn er die nach 60 Min. löscht.

Hier der Code:

<?php
$startnum = 1; //mit dieser Zahl fängt der Counter an zu zählen

$numip = "500"; //Anzahl der IP-Nummern, die gespeichert werden sollen

$anzfile = "anzahl.txt" ;
$ipfile = "ip.txt" ;

$userip = $_SERVER['REMOTE_ADDR'];
if(!file_exists($anzfile)){
        $fo = fopen($anzfile,"w+");
        fputs($fo, $startnum);
        fclose($fo);
}
if(!file_exists($ipfile)){
        $foip = fopen($ipfile, "w+");
        fputs($foip, $userip.":");
        fclose($foip);
}

$ipcont = fopen($ipfile,"r+");
$ipfile1 = fgets($ipcont,200);
$ipdata = explode(":",$ipfile1);

if(in_array($userip, $ipdata)){
        $anzahl = fopen($anzfile, "r+");
           $nummer = fgets($anzahl,9);
        fclose($anzahl);
}
else{
        $num = count($ipdata);
        if($num <= $numip){

fputs($ipcont,$userip.":");
                fclose($ipcont);
                $anzahl = fopen($anzfile, "r+");
                  $nummer = fgets( $anzahl, 9 );
                  $nummer++;
                  fseek($anzahl, 0);
                 fputs( $anzahl, $nummer );
                fclose($anzahl);
        }
        else{
                $pop = array_pop($ipdata);
                array_unshift($ipdata,$userip);
                $userip2 = implode(":",$ipdata);
                $ipcont = fopen($ipfile,"r+");
                fputs($ipcont,$userip2);
                fclose($ipcont);

$anzahl = fopen($anzfile, "r+");
                  $nummer = fgets( $anzahl, 9 );
                  $nummer++;
                  fseek($anzahl, 0);
                 fputs( $anzahl, $nummer );
                fclose($anzahl);
        }
}
?>

Könntet ihr bitte hier ein Code von einem Counter mit IP-Sperre reinschreiben, der die IP nach ca. 60 Min wieder löscht.

MFG
Nils

  1. Hallo du da draußen,

    Könntet ihr bitte hier ein Code von einem Counter mit IP-Sperre reinschreiben, der die IP nach ca. 60 Min wieder löscht.

    Nein, das könnten wir nicht. Hättest du die </faq/> gelesen, wüsstest du, dass dieses Forum nicht dazu da ist, komplette Lösungen zu geben, sondern nur Lösungsansätze oder Referenzen auf Quellen, mit denen man sich selbst seine Lösung zusammenbasteln kann.

    An deiner Stelle würde ich entweder eine neue Datei mit Zeitstempeln anlegen oder in die IP-Adressen-Datei zusätzlich die Zeitstempel hineinschreiben. Dann kannst du bei jedem Aufrufen des Counters jeden Zeitstempel vom aktuellen Zeitstempel abziehen, und wenn das Ergebnis größer oder gleich 3600, also eine Stunde, ist, löscht du einfach die Zeile oder was auch immer.

    Grüße von hier drinnen, aus Biberach an der Riss (http://www.stadt-biberach.de/),
    Candid Dauth (Dogfish)

    --
    Verantwortlich für Falschaussagen ist ausschließlich mein Gehirn. Hinweise auf solche gebe ich ihm aber gerne weiter.
    Let's close our eyes and see what happens.
    http://dogfish.net.tc/
    1. Hallo,
      und wie erstellt man sowas?

      1. Hallo du da draußen,

        und wie erstellt man sowas?

        Weil mit gerade langweilig ist, verstoße ich mal gegen die Forumsregeln und schreibe dir eine Funktion, die den Counterstand bei Bedarf erhöht und den erhöhten zurückliefert. Die Datei "counter" wird bei Nicht-Existieren erzeugt, andere Dateien brauchst du nicht. Du kannst natürlich auch einen anderen Dateinamen von "; # Der Dateiname  und nach $filename = " angeben.

        function counter()
        {
         $filename = "counter"; # Der Dateiname
         $trenner = "\t";

        global $_SERVER;
         if(!is_file($filename))
         {
          if(file_exists($filename))
           return false;
          else
          {
           if(!$fh = @fopen($filename, "w") || !@fwrite($fh, "1\n".$_SERVER['REMOTE_ADDR'].$trenner.time()."\n"))
            return false;
           else
           {
            @fclose($fh);
            return 1;
           }
          }
         }
         else
         {
          $counter_file = @file($filename);
          if(!$counter_file)
           return false;
          else
          {
           $counterstand = trim(array_shift($counter_file));
           $inside = false;
           $new_file = "";
           foreach($counter_file as $line)
           {
            $spl = explode($trenner, trim($line));
            if($spl[0] == $_SERVER['REMOTE_ADDR'])
             $inside = true;
            if(time()-$spl[1] < 3600)
             $new_file .= $line;
            elseif($spl[0] == $_SERVER['REMOTE_ADDR'])
             $inside = false;
           }
           if(!$inside)
           {
            $new_file .= $_SERVER['REMOTE_ADDR'].$trenner.time()."\n";
            $counterstand++;
           }
           if($fh = @fopen($filename, "w"))
           {
            @fwrite($fh, $counterstand."\n".$new_file);
            @fclose($fh);
           }
           return $counterstand;
          }
         }
        }

        Wenn du den Counterstand erhöhen willst (oder, wenn die IP-Adresse eingetragen ist, auch nicht), rufst du die Funktion counter() auf. Willst du den Counterstand erfahren, machst du es folgendermaßen:
        $counterstand = counter();
        if(!$counterstand)
         die("Ein Fehler trat auf!");

        Kann nicht in die Counterdatei geschrieben werden, wird der Counterstand nicht erhöht (wie auch?) aber er wird trotzdem zurückgeliefert.

        Man möge mich um meinen Verstoß gegen die Regeln lünchen...

        Grüße von hier drinnen, aus Biberach an der Riss (http://www.stadt-biberach.de/),
        Candid Dauth (Dogfish)

        --
        Verantwortlich für Falschaussagen ist ausschließlich mein Gehirn. Hinweise auf solche gebe ich ihm aber gerne weiter.
        Let's close our eyes and see what happens.
        http://dogfish.net.tc/
        1. Hallo Candid,

          Die Datei "counter" wird bei Nicht-Existieren erzeugt,

          aber nur, wenn die Rechte entsprechend gesetzt sind

          andere Dateien brauchst du nicht.

          natürlich - die Datei, in der die Funktion drinsteht :-)

          $trenner = "\t";

          warum \t? (da du es zum in-der-Zeile-trennen verwendest:) warum nicht '#' o.ä.?

          global $_SERVER;

          *räusper* $_SERVER _ist_ global - verdammt global sogar: http://de3.php.net/manual/en/language.variables.predefined.php...

          Man möge mich um meinen Verstoß gegen die Regeln lünchen...

          steinigt ihn!!!1 :-)

          Grüße aus Nürnberg
          Tobias

          --
          Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
          1. Hallo du da draußen,

            Die Datei "counter" wird bei Nicht-Existieren erzeugt,
            aber nur, wenn die Rechte entsprechend gesetzt sind

            Vermutlich schon. Aber was einem so alles beim Zugriff auf Dateien passieren kann, da kann man sich ja nicht mehr sicher sein.
            Da passiert es doch manchmal, dass man versucht, den Inhalt eines Verzeichnisses auszulesen, und dann findet er die Dateien drinnen nicht, auch wenn es ganz sicher ist, dass sie drinnen sind. Und dann fragt man zig-tausend Leute und keiner weiß, woran das liegt. Naja, vielleicht ist ja im binären Rechencode des Computers zwischen den Einsen und Nullen mal eine Zwei aufgetaucht?! ;-)

            andere Dateien brauchst du nicht.
            natürlich - die Datei, in der die Funktion drinsteht :-)

            Komisch, normalerweise regen sich die anderen immer auf, das ich so "logisch" bin, aber diesmal hab ich's irgendwie übersehen.

            $trenner = "\t";
            warum \t? (da du es zum in-der-Zeile-trennen verwendest:) warum nicht '#' o.ä.?

            Irgendwie ist mir nichts besseres eingefallen.

            global $_SERVER;
            *räusper* $_SERVER _ist_ global - verdammt global sogar: http://de3.php.net/manual/en/language.variables.predefined.php...

            Bei mir nicht. Da muss sich irgendein Hacker auf meinen Rechner eingehackt und an meinem PHP-Modul rumprogrammiert haben :-). Nein, aber ehrlich, bei mir kamen schon oft Warnungen, dass irgendwelche $_SERVER-Werte nicht definiert werden, und nachdem ich global $\_SERVER eingegeben hatte, kamen die nicht mehr.

            Man möge mich um meinen Verstoß gegen die Regeln lünchen...
            steinigt ihn!!!1 :-)

            Jetzt geht das wieder los... Aber ich hab doch garnicht Jehova gesagt! ;-)

            Grüße von hier drinnen, aus Biberach an der Riss (http://www.stadt-biberach.de/),
            Candid Dauth (Dogfish)

            --
            Verantwortlich für Falschaussagen ist ausschließlich mein Gehirn. Hinweise auf solche gebe ich ihm aber gerne weiter.
            Let's close our eyes and see what happens.
            http://dogfish.net.tc/
            1. Hallo Candid,

              global $_SERVER;
              *räusper* $_SERVER _ist_ global - verdammt global sogar: http://de3.php.net/manual/en/language.variables.predefined.php...
              Nein, aber ehrlich, bei mir kamen schon oft Warnungen, dass irgendwelche $_SERVER-Werte nicht definiert werden, und nachdem ich global $\_SERVER eingegeben hatte, kamen die nicht mehr.

              Keine Warnungen, sondern Notizen, oder? Dass kann ich mir aber nicht so ganz vorstellen - vielleicht war der entsprchende Wert in $_SERVER nicht gesetzt? Ohne Testseit mit Code glaub ich garnix :-)

              Candid Dauth (Dogfish)

              darf man fragen, warum du nicht mehr unter "Dogfish" postest?

              Grüße aus Nürnberg
              Tobias

              --
              Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
              1. Hallo du da draußen,

                Candid Dauth (Dogfish)
                darf man fragen, warum du nicht mehr unter "Dogfish" postest?

                Nein, darf man nicht ;-)
                Wieso? Stört es dich irgendwie?

                Grüße von hier drinnen, aus Biberach an der Riss (http://www.stadt-biberach.de/),
                Candid Dauth (Dogfish)

                --
                Verantwortlich für Falschaussagen ist ausschließlich mein Gehirn. Hinweise auf solche gebe ich ihm aber gerne weiter.
                Let's close our eyes and see what happens.
                http://dogfish.net.tc/
                1. Hallo Candid,

                  Candid Dauth (Dogfish)
                  darf man fragen, warum du nicht mehr unter "Dogfish" postest?
                  Nein, darf man nicht ;-)
                  Wieso? Stört es dich irgendwie?

                  nein, natürlich nicht - ich bin halt neugierig :-)
                  Ich muss mich nur daran gewöhnen - wobei ich zugeben muss, das ich auch schon zweimal meinen Namen geändert habe, allerdings ist meiner lediglich länger geworden und nicht wie bei dir von Nick- auf Realname.

                  Grüße aus Nürnberg
                  Tobias

                  --
                  Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
                  1. Hallo du da draußen,

                    Wieso? Stört es dich irgendwie?
                    nein, natürlich nicht - ich bin halt neugierig :-)

                    Ach so. Hätte ja auch sein können, dass es irgendetwas mit deiner Blacklist zu tun gehabt hätte ;-).

                    Grüße von hier drinnen, aus Biberach an der Riss (http://www.stadt-biberach.de/),
                    Candid Dauth (Dogfish)

                    --
                    Verantwortlich für Falschaussagen ist ausschließlich mein Gehirn. Hinweise auf solche gebe ich ihm aber gerne weiter.
                    Let's close our eyes and see what happens.
                    http://dogfish.net.tc/
  2. Hi Nils,

    Du hast ja schon ein paar Hinweise bekommen, _wie_ Du die IP für eine Stunde sperren kannst. Du hast nicht genau gesagt, wofür Du das machen willst.
    Wenn das für Statistik sein soll, denke ich, das ist der völlig falsche Weg. Mal ganz abgesehen davon, ob und wie es geht!
    Wenn Du verhindert willst, daß Leute z.B. aus Spaß Deinen Zähler nicht hochjubeln gibt es einen einfachen Weg: Provozier sie nicht dazu, indem Du einen Zählerstand anzeigst. Wenn Du aber statische Zählerstände (also nur immer einen von jedem Besucher) brauchst, beschäftige Dich mal mit dem Themen, was ein Pageimpression/-view und was ein Visit ist.
    Wenn Du Visits berechnen kannst, so gibt es auch ohne künstliche Sperre darin viel bessere Möglichkeiten.

    Gruß
    Reiner