Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z licznikiem
Morek
post
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 (1 - 6)
crash
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 196
Pomógł: 2
Dołączył: 17.01.2004
Skąd: Sosnowiec

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


A nie masz przypadkiem:
  1. <?php
  2. setcookie("odwiedziny", "1", time()+3600*2);
  3. ?>

I odwołanie przez:
  1. <?php
  2. $_COOKIE[ 'visited' ]
  3. ?>
Go to the top of the page
+Quote Post
yavaho
post
Post #3





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.
Go to the top of the page
+Quote Post
Morek
post
Post #4





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

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


crash - no właśnie nie, zmieniałem nazwe, i dla tego byłem zdziwiony... Ale i tak dzięki za pomoc.


yavaho - Wielkie dzięki za informacje! Nie wiedziałem o tym, i faktycznie licznik się nie zeruje ale mam jeszcze pytanie... Wiem, że może dziwnie to zabrzmi ale czy on jest odporny na odswieżanie? Bo jak odświeżam stronę to dodaje mi kolejne oczko (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Nie bardzo jestem w stanie sam go rozgryźć bo jeszcze niegdy nic na sesjach nie robiłem (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif)

Ten post edytował Morek 11.08.2005, 21:24:13
Go to the top of the page
+Quote Post
mike
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Na moje oko to powinno być tak:
  1. <?
  2.  
  3. if( file_exists( 'counter.txt' ) )
  4. {
  5. $resFile = fopen( 'counter.txt', 'r' );
  6. flock( $resFile, 1 );
  7.  
  8. $intCounter = fgets( $resFile, 100000 );
  9.  
  10. flock( $resFile, 3 );
  11. fclose( $resFile );
  12.  
  13. if( $_COOKIE[ 'visited' ] !== '1' )
  14. {
  15. $intCounter++;
  16. setcookie( 'visited', '1', time() + 60 * 60 * 24 ); // ustawiamy "ciacho" na jedną dobę
  17. }
  18. }
  19. else
  20. {
  21. $intCounter = 1;
  22. }
  23.  
  24. $resFile = fopen( 'counter.txt', 'w' );
  25. flock( $resFile, 2 );
  26.  
  27. fwrite( $resFile, $intCounter );
  28.  
  29. flock( $resFile, 3 );
  30. fclose( $resFile );
  31.  
  32. echo 'Liczba odwiedzin: ' . $intCounter;
  33.  
  34. ?>


A jak masz php5 to możesz tak:
  1. <?
  2.  
  3. $intCounter = ( int ) file_get_contents( './counter.txt' );
  4.  
  5. if( $_COOKIE[ 'visited' ] !== '1' )
  6. {
  7. $intCounter++;
  8. file_put_contents( './counter.txt', $intCounter );
  9. setcookie( 'visited', '1', time() + 60 * 60 * 24 ); // ustawiamy "ciacho" na jedną dobę
  10. }
  11.  
  12. echo 'Liczba odwiedzin: ' . $intCounter;
  13.  
  14. ?>


@yavaho Twoje rozwiązanie ma małą wadę. Wyobraź sobie sytuacje kiedy wchodzisz na stronę, licznik pokazuje 100 odwiedzin. Chodzisz po stronce godzinę, dwie, w tym czasie przez strona przewinęło sie kolejne 100 osób. Ale ty widzisz 100 odwiedzin bo masz te dane w sesji.

A poza tym: Ranking.pl : Cookies. 98.2% akceptuje ciasteczka, więc nie ma czym się przejmować.
Go to the top of the page
+Quote Post
NuLL
post
Post #6





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Skrypty php -> php
Go to the top of the page
+Quote Post
Morek
post
Post #7





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

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


mike_mech Wszystko działa bez problemu, nie zlicza odświeżeń i się nie zeruje! Wielkie dzięki.
(IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 16:05