Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Licznik odporny na odświeżanie przez 24h
Forum PHP.pl > Forum > Przedszkole
pawelg
Witam,
chciałbym mieć prosty skrypt do zliczania osób odwiedzających stronę, ale są dwa warunki które musi spełniać:
1. być odpornym na odświeżanie
2. po około 24 godzinach zliczyć ponownie wejście tego samego użytkownika.
Wiem, że można to zrobić na dwa sposoby - na ciasteczkach i na zbanowanych adresach IP.

mam dwa skrypty, ale w z każdym jest coś nie tak ;-)

  1. <?php
  2. if((!isset($_COOKIE['licznikowe-ciacho'])) && (!strstr($_SERVER['HTTP_REFERER'], "strona.pl"))) {
  3. $plik = fopen("licznik.txt", "r");
  4. $tekst = fread($plik, filesize("licznik.txt"));
  5. $dane = explode(";", $tekst);
  6. fclose($plik);
  7. $plik = fopen("licznik.txt", "w");
  8. flock($plik, 2);
  9. $dane[0]++;
  10. fwrite($plik, "$dane[0];", 15);
  11. flock($plik, 3);
  12. fclose($plik);
  13. setcookie("licznikowe-ciacho", "zliczono", "time()+86400");
  14. }
  15. else {
  16. $plik = fopen("licznik.txt", "r");
  17. $tekst = fread($plik, filesize("licznik.txt"));
  18. $dane = explode(";", $tekst);
  19. }
  20.  
  21. ?>
  22. <p>Jesteś <?php echo($dane[0]); ?> gosciem na mojej stronie.</p>

Nie wiem czemu ale skrypt ten nie działa - po odświeżaniu zawsze wertość w pliku licznika jest zwiększana oraz wyskakuje mi komunikat:
Warning: setcookie() expects parameter 3 to be long, string given in /home/site/15909/www/skrypt/z.php on line 19" title="Zobacz w manualu PHP" target="_manual
do tej lini:
  1. <?php
  2. setcookie("licznikowe-ciacho", "zliczono", "time()+86400");
  3. ?>


Drugi skrypt jaki mam działa, ale ma jedną wadę jak doda ip do listy zbanowanych to użytkownik zostanie zliczony tylko 1 raz (no chyba, że wyczyszcze ręcznie plik ze zbanowanimi adresami ip, ale chciałbym, żeby to odbywało się automatycznie)
  1. <?php
  2. function badIP($ip)
  3. {
  4. $end_line = "rn";
  5. if(file_exists("banned_ip.txt")){
  6. $fd = fopen("banned_ip.txt", "r+");
  7. }
  8. else{
  9. $fd = fopen("banned_ip.txt", "a+");
  10. }
  11. if(!$fd) return false;
  12. while (!feof ($fd)) {
  13. $line = trim(fgets($fd));
  14. if($line == $ip){
  15. fclose($fd);
  16. return true;
  17. }
  18. }
  19. fseek($fd, filesize("banned_ip.txt"));
  20. fputs($fd, $ip.$end_line);
  21. fclose($fd);
  22. return false;
  23. }
  24.  
  25. function getHits()
  26. {
  27. if(($fp = @fopen("counter.txt", "r+")) === false)
  28. return false;
  29. $count = fgets($fp);
  30. if(!badIP($_SERVER['REMOTE_ADDR'])){
  31. $count = $count + 1;
  32. fseek($fp, 0);
  33. fputs($fp, $count);
  34. }
  35. fclose($fp);
  36. return $count;
  37. }
  38. echo(getHits());
  39. ?>

Chciałbym aby ten skrypt potrafił czyść plik banned_ip z adresów ip, bądź nadpisywał pustym plikiem o odpowiednich atrybutach (666 lub 777), raz na dobę np o 4 w nocy.
qwaq
taki troche offtopic:
Cytat
if(file_exists("banned_ip.txt")){
$fd = fopen("banned_ip.txt", "r+");
}
else{
$fd = fopen("banned_ip.txt", "a+");
}


fopen("banned_ip.txt", "a+"); - ten kod zalatwia sprawe

po prostu jeśli nie ma pliku to go utworzy
pawelg
Cytat(qwaq @ 1.08.2007, 15:34:38 ) *
po prostu jeśli nie ma pliku to go utworzy

ale założenie, jest takie, że jest plik. Chodzi o nadpisanie go pustym plikiem o tej samej nazwie bądź wyczyszczeniem jego zawartości. Dodatko chciałbym aby odbywało się to raz na dobę
qwaq
Cytat
if(file_exists("banned_ip.txt"))

to skoro plik istnieje to po co sprawdzasz czy istnieje?questionmark.gif
pawelg
Cytat(qwaq @ 1.08.2007, 15:41:32 ) *
to skoro plik istnieje to po co sprawdzasz czy istnieje?questionmark.gif

jeśli jednak by ktoś nie utworzył to zostanie wygenerowy z automatu...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.