Counter mit IP-Sperre
tash
- php
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);
}
?>
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
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
-----------------------------------------------
Funktion zum Aufräumen
-----------------------
Zähler schreiben
----------------
Datei zum Lesen des Zählers
---------------------------
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Danke Euch allen, für die große und schnelle Hilfe!
Der Zähler läuft jetzt einwandfrei!
lg tash
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']))){
- 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.
- 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.
- 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
Hello,
- 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
Hallo
- 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