tash: Counter mit IP-Sperre

Hallo!

Ich bin zur Zeit am Bauen eines Besucherzählers für eine Webseite. Dieser soll mit einer IP-Sperre funktionieren.
Bei einem Zugriff auf die Seite werden Zeit+IP-Adresse des Besuchers in die Datei "ip_new.txt" und der Zähler wird in die Datei "counter.txt" eingetragen. Nach dem Ablauf des zeitlichen Limits für die IP-Sperre wird der jeweilige Besucher wieder als neuer Besucher gezählt.

Nun habe ich folgenden Script zusammengebastelt:

<?php

$ipdatei = "ip_new.txt";
$zaehlerdatei = "counter.txt";
$zeitlimit = 10;

$ipliste = file($ipdatei);

foreach($ipliste as $zeile){
 $trennung = explode("|", $zeile);
}

if((time()>($trennung[0]+$zeitlimit))&&(trim($trennung[1]."\n")==($_SERVER['REMOTE_ADDR']))){

$FilePointerIP = fopen($ipdatei, "a+");

fwrite($FilePointerIP, time()."|".$_SERVER['REMOTE_ADDR']."\n");

fclose($FilePointerIP);

$datei= fopen("counter.txt", "r+");

$dateigroesse=filesize("counter.txt");

$counter=fread($datei, $dateigroesse);

fclose($datei);

$counter++;

echo"Sie sind der ".$counter.". Besucher auf der Seite. ";

$datei=fopen($zaehlerdatei,"w");

$output=fwrite($datei, $counter);
        fclose($datei);

echo "Schön dass Sie wieder da sind!";
 }

elseif((time()<($trennung[0]+$zeitlimit))&&(trim($trennung[1]."\n")==($_SERVER['REMOTE_ADDR']))){
  echo "Die Besucherzahl wird jetzt nicht erhöht, Sie waren schon heute da...";
 }

else{
        $FilePointerIP = fopen($ipdatei, "a+");

fwrite($FilePointerIP, time()."|".$_SERVER['REMOTE_ADDR']."\n");

fclose($FilePointerIP);

echo"Hallo! Sie sind das 1.Mal hier, nicht wahr?";

$datei= fopen($zaehlerdatei, "r+");

$dateigroesse=filesize($zaehlerdatei);

$counter=fread($datei, $dateigroesse);

fclose($datei);

$counter++;

echo"Sie sind der ".$counter.". Besucher auf der Seite. ";

$datei=fopen($zaehlerdatei,"w");

$output=fwrite($datei, $counter);

fclose($datei);
 }
?>

  1. Es wird immer auf den letzten Eintrag in der IP-Datei zugegriffen, die ganze Liste wird nicht durchgesucht. Wie ändere ich mein Script, damit es funktioniert?
  2. Außerdem wäre es schön, wenn die Einträge in dieser IP-Datei auch aktualisiert werden könnten (also keine Einträge mit gleicher IP und ungleicher Zeit). Wie geht das?
  3. Wie mache ich eine "Auffrischung" der IP-Datei, so dass zu einem bestimmten Zeitpunkt alle Einträge dieser Datei gelöscht werden?

Hoffentlich kann mir jemand von Euch helfen, ich komme einfach nicht mehr weiter :(

Schreibt bitte möglichst einfach, ich bin noch eine Anfängerin in PHP ;)

Vielen-vielen Dank im Voraus!!!

lg tash

  1. Hello,

    versuche es doch mal mit einem abgespeicherten Array.
    Da macht dann PHP für Dich schon fast alles von alleine ;-)

    Funktion zur Kontrolle der IP und des Timestamp
    -----------------------------------------------

    • Datei öffen
    • Datei exclusiv sperren
    • serialisiertes Array auslesen
    • Array wieder herstellen (Funktion unserialize)
    • Schauen, ob IP schon drinsteht, wenn ja Timestamp auslesen
    • Neuen Timestamp auf IP zuweisen
    • Array serialisieren
    • serialisiertes Array zurückschreiben in Datei
    • Dateilänge anpassen
    • Datei schließen und damit das Lock automatisch wieder freigeben

    Funktion zum Aufräumen
    -----------------------

    • Datei öffen
    • Datei exclusiv sperren
    • serialisiertes Array auslesen
    • Array wieder herstellen (Funktion unserialize)
    • Array mit foreach durchgehen, und alle überalterten Einträge löschen
    • Array serialisieren
    • serialisiertes Array zurückschreiben in Datei
    • Dateilänge anpassen
    • Datei schließen und damit das Lock automatisch wieder freigeben

    Zähler schreiben
    ----------------

    • Datei öffen
    • Datei exclusiv sperren
    • Zähler auslesen
    • Zähler hochzählen
    • Zähler zurückschreiben
    • Dateilänge anpassen
        ## kann hier ggf. entfallen, da der Zähklerstring
        ## garantiert immer länger wird.
    • Datei schließen und damit das Lock automatisch wieder freigeben

    Datei zum Lesen des Zählers
    ---------------------------

    • Datei öffen
      (- Datei shared sperren) kann entfallen, wenn man gelegentliche Anzeigefehler in Kauf nimmt
    • Zähler auslesen
    • Datei schließen und damit das Lock automatisch wieder freigeben

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. Danke Euch allen, für die große und schnelle Hilfe!

      Der Zähler läuft jetzt einwandfrei!

      lg tash

  2. Hallo

    Ich bin zur Zeit am Bauen eines Besucherzählers für eine Webseite. Dieser soll mit einer IP-Sperre funktionieren.
    Bei einem Zugriff auf die Seite werden Zeit+IP-Adresse des Besuchers in die Datei "ip_new.txt" und der Zähler wird in die Datei "counter.txt" eingetragen. Nach dem Ablauf des zeitlichen Limits für die IP-Sperre wird der jeweilige Besucher wieder als neuer Besucher gezählt.

    Dass eine solche Zählung nur bedingte Aussagekraft hat, da z.B. AOL-Nutzer über Proyies surfen und alle paar Sekunden mit einer anderen IP daherkommen, ist dir hoffentlich klar. Soweit zum Manko dieser Zählmethode.

    foreach($ipliste as $zeile){
    $trennung = explode("|", $zeile);
    }
    if((time()>($trennung[0]+$zeitlimit))&&(trim($trennung[1]."\n")==($_SERVER['REMOTE_ADDR']))){

    1. Es wird immer auf den letzten Eintrag in der IP-Datei zugegriffen, die ganze Liste wird nicht durchgesucht. Wie ändere ich mein Script, damit es funktioniert?

    Du liest das Array der Einträge in einer Schleife in das Array $trennung ein. Dieses ist nun ein zweidimensionales Array.

    $trennung[0][0] // Zeitstempel des ersten Eintrags
    $trennung[0][1] // IP des ersten Eintrags
    $trennung[1][0] // Zeitstempel des zweiten Eintrags
    $trennung[1][1] // IP des zweiten Eintrags

    ... u.s.w.

    Du gehst das neue Array bei der Prüfung nicht erneut durch. Du brauchst an dieser Stelle eine neue Schleife oder du prüfst die Werte in der Schleife, in der du $trennung füllst.

    1. Außerdem wäre es schön, wenn die Einträge in dieser IP-Datei auch aktualisiert werden könnten (also keine Einträge mit gleicher IP und ungleicher Zeit). Wie geht das?

    Weise dem Element von $trennung, dass momentan geprüft wird, einen neuen Zeitstempel in $trennung[n][0] zu ('n' steht hier für eine beliebige Zahl, die dem Index des Arrayelements entspricht), wenn die gespeicherte IP mit der aktuell vorliegenden übereinstimmt.

    1. Wie mache ich eine "Auffrischung" der IP-Datei, so dass zu einem bestimmten Zeitpunkt alle Einträge dieser Datei gelöscht werden?

    Prüfe alle IPs, ob deren letzter Eintrag älter als ein Zeitlimit ist. Lösche alle betroffenen Elemente aus dem Array und speichere die gesamte Datei mit den übrigbleibenden Einträgen neu ab.

    PHP Arrayfunktionen: http://www.php.net/manual/de/ref.array.php

    Tschö, Auge

    --
    Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
    (Victor Hugo)
    <dingdong /><dingdong /><toc /><toc /><toc /><shout>Florence!</shout>
    Veranstaltungsdatenbank Vdb 0.2
    1. Hello,

      1. Wie mache ich eine "Auffrischung" der IP-Datei, so dass zu einem bestimmten Zeitpunkt alle Einträge dieser Datei gelöscht werden?

      Prüfe alle IPs, ob deren letzter Eintrag älter als ein Zeitlimit ist. Lösche alle betroffenen Elemente aus dem Array und speichere die gesamte Datei mit den übrigbleibenden Einträgen neu ab.

      Die Löschfunktion könntest Du z.B. aller 100 gezählten Besucher aufrufen.

      if ($counter % 100 == 0)
      {
        aufruf_loeschfunktion('dateiname');
      }

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. Hallo

        1. Wie mache ich eine "Auffrischung" der IP-Datei, so dass zu einem bestimmten Zeitpunkt alle Einträge dieser Datei gelöscht werden?

        Prüfe alle IPs, ob deren letzter Eintrag älter als ein Zeitlimit ist. Lösche alle betroffenen Elemente aus dem Array und speichere die gesamte Datei mit den übrigbleibenden Einträgen neu ab.

        Die Löschfunktion könntest Du z.B. aller 100 gezählten Besucher aufrufen.

        if ($counter % 100 == 0)
        {
          aufruf_loeschfunktion('dateiname');
        }

        Rychtig, zumal ich da etwas missverständlich formuliert habe. Vorher (Thema: neuer Zeitstempel für bereits eingetragene IP) schreibe ich noch, dass man den Zeitstempel ersetzen kann, und hier schreibe ich vom letzten Eintrag der IP, was impliziert, dass es mehrere Einträge geben kann.

        Also zur Konkretisierung: Eine Möglichkeit besteht darin, den Zeitstempel auszutauschen, womit jede IP nur einmal in der Datei steht, die andere Möglichkeit ist es, bei jedem Aufruf einen neuen Eintrag in der Datei anzulegen, egal, wie oft eine IP vertreten ist.

        In letzerem Fall muss bei der Prüfung, wann mit dieser IP der letzte Aufruf der Seite erfolgte nicht nach _dem_einen_ sondern nach _dem_letzten_ Eintrag gesucht werden.

        Das Löschen abgelaufener Einträge, also der Einträge, die über dem Zeitlimit liegen, funktioniert in beiden Fällen gleich.

        Tschö, Auge

        --
        Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
        (Victor Hugo)
        <dingdong /><dingdong /><toc /><toc /><toc /><shout>Florence!</shout>
        Veranstaltungsdatenbank Vdb 0.2