Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z licznikiem
Morek
post 11.08.2005, 14:23:00
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 28.05.2005

Ostrzeżenie: (0%)
-----


Wiem, że tamatów o licznikach było sporo.
Ale mam taki skrypt licznika:

  1. <?
  2. setcookie("odwiedziny", "1", time()+3600*2); 
  3. ?>
  4.  
  5.  
  6. <?
  7.  
  8. if(file_exists("licznik.txt"))  /* sprawdza czy plik istnieje */
  9. { 
  10. $file=fopen("licznik.txt", "r");  /* otwiera plik */
  11. flock($file, 1);  /* blokuje plik */
  12.  
  13. $ile=fgets($file, 100000);  /* odczytuje wartość */
  14.  
  15. flock($file, 3); /* odblokowuje plik */
  16. fclose($file);  /* zamyka plik */
  17.  
  18. if($odwiedziny!="1")  /* sprawdza plik cookie */
  19. {
  20. $ile++; /* zw. wartość o 1 tylko po pierwszym wejściu */
  21. }
  22. }
  23. else
  24. {
  25. $ile=1;  /* jeśli plik nie istnieje wyświetla wartość 1 i tworzy plik */
  26. }
  27.  
  28. $file=fopen("licznik.txt", "w");  /* otwiera plik do zapisu */
  29. flock($file, 2);  /* blokuje plik */
  30.  
  31. fwrite($file, $ile);  /* zapisuje wartość */
  32.  
  33. flock($file, 3);  /* odblokwuje plik */
  34. fclose($file);  /* zamyka plik */
  35.  
  36. ?>



i czasami zdarza się, że gdy stron się wgrywa i ktoś da "odśwież" licznik sie zeruje

W poście Mifczu znalazłem podobny problem i mike_mech poradził by

  1. <?php
  2. if( $visited != "1" ) /* sprawdza, czy użytkownik już odwiedzał stronę */
  3. {
  4. $ile++; /* zwiększa wartość o 1 tylko po pierwszym wejściu */
  5. }
  6. ?>


zmienić na

  1. <?php
  2. if( $_COOKIE[ 'visited' ] != "1" ) /* sprawdza, czy użytkownik już odwiedzał stronę */
  3. {
  4. $ile++; /* zwiększa wartość o 1 tylko po pierwszym wejściu */
  5. }
  6. ?>


ale gdy zamieniam to licznik przestał być odporny na odświeżanie i nie bardzo wiem, gdzie robie błąd?

Jeśli ktoś wie, jak sprawić by licznik był odporny na odswieżanie, nie zerował się tak jak to opisałem i nie potrzebował bazy danych,

lub chociaż gdzie jest błąd w kodzie to PLEASE pomocy!
Będe wdzięczny.

Ten post edytował Morek 11.08.2005, 14:24:49
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
yavaho
post 11.08.2005, 15:03:28
Post #2





Grupa: Zarejestrowani
Postów: 449
Pomógł: 0
Dołączył: 26.05.2004
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


Tez mialem kiedys problem z licznikiem. I zauwazylem ze w tego typu skryptach jak w Twoim gdzie plik zostaje dwa razy otwarty podczas jednego uzycia skryptu istnieje takie niebezpieczenstwo ze cos sie pokreci.
Moim zdaniem rozwiazanie jest takie ze: nalezy otworzyc plik tylko jeden raz, zrobic obiczenia i zapisac.

Teraz uzywam juz tylko takich licznikow - dzialajacych na sesjach, bo na ciasteczkach nie mozna polegac w 100% a zwlaszcza gdy na strone wpadnie robot generujacy duzy ruch w krotkim czasie, ktory z pewnoscia nie przyjmuje ciasteczek.
  1. <?php
  2. if(!isset($_SESSION['licznik'])){
  3.  $nazwa = "licznik.txt";
  4.  $licz='';
  5.  if($plik=fopen($nazwa, 'r+b')){
  6.  flock($plik, LOCK_EX);
  7.  $licz = fgets($plik,100);
  8.  $licz=$licz+1;
  9.  fseek($plik, 0, SEEK_SET);
  10.  fputs($plik, $licz);
  11.  flock($plik, LOCK_UN);
  12.  fclose($plik);
  13.  }
  14.  $_SESSION['licznik'] = $licz;
  15. }
  16. echo $_SESSION['licznik'];
  17. ?>
Podczas pierwszego uruchomienia skrypt moze nie utworzyc pliku (nie jestem pewien) wiec utworz sobie plik na serwerze oczywiscie z odpowiednim chmod'em.


--------------------
Książki informatyczneKsiążki biznesowe
Warsztat: notepad hardcore
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 15:43