Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: licznik
Forum PHP.pl > Forum > Gotowe rozwiązania
kalinowski
napisalem sobie prosty licznik odwiedzin ktory wyglada tak:
[php:1:538d098489]<?php //licznik oparty na plikach tekstowych winksmiley.jpg
if (!(file_exists("licznik.txt"))) {
$plik = fopen ("licznik.txt", "w+");
fputs ($plik, "-");
fclose ($plik);
}
$ile = filesize ("licznik.txt");
$plik = fopen ("licznik.txt", "a");
flock ($plik, 2);
fputs ($plik, "-");
flock ($plik, 3);
fclose ($plik);
print "Licznik odwiedzin: <b>$ile</B><br><i>(od 20.07.2003)</I>";
?>
[/php:1:538d098489]

jakzrobic aby licznik ten nie dzialal na odswierzanie
zulus
użyj cookies
Omega
Stwórz oddzielny plik, licznikip.txt i zapisuj do niego datę oraz IP. Następnie przy każdym odświerzaniu sprawdzaj czy już dzisiaj przypadkiem nie było takiego IP.

np.:
plik licznikip.txt
Kod
64534563 // znacznik czasu unixa

246.54.233.5

246.54.654.87


dalej...

[php:1:375e2cef56]<?php
$data = file("licznikip.txt");
if ($data[0] > time()+(60*60*24)) {
fopen("licznikip.txt", "w");
}
$plik = implode(" " file("licznikip.txt"));
if ( eregi("$ip", $plik)) {
//tutaj kod licznika jeżeli danego ip nie było
} else {
echo "sory ale już dzisiaj tu byłeś...";
}
?>[/php:1:375e2cef56]
Myślę że to powinno działać, chociaż nie testowałem... biggrin.gif
GeoS
Uzyc sesji tongue.gif
Kinool
hmm cookie jest chyba najprostrszym i najlepszym rozwiazaniem bo:

1. w przypadku dynamicznego IP ktos kto obladal strone zostanie zaliczony potem ktos inny moze miec te IP i co?questionmark.gif nie zostanie zaliczony
2. niektre kompy sa w sieci lokalne z wyjsciem na net tylko z jednego kompa (udostepnianie polaczenia) i kazdy z tych kompow na zewnatrz ma takie same IP wiec nawet jesli w takiej sieci jest 100 kompow i kazdy z nich bedze wchodzil na strone to zaliczony zostanie tylko jeden.

3. Niekotry wchodza na strone kilkakrotnie np, 2, 3, 10 razy dzienni i to jest wizyta danego usera (co innego jest nabijanie licznika przez odswierzanie)

przydatnosc ciasteczka do sporzycia mozna ustawic np na 15-20 minut (mozna powiedziec ze tyle mniejwiecej osoba siedzi sobie na stronie i cos przeglada)

jezeli po godzinie wejdzie na strone to zostanie zaliczona ale jezeli w cigu tych 15-20 minut bedzie chodzila po stronie to niebedzie zaliczana wiec nie bedzie sztucznych nabic licznika
kalinowski
Cytat
hmm cookie jest chyba najprostrszym i najlepszym rozwiazaniem bo:

1. w przypadku dynamicznego IP ktos kto obladal strone zostanie zaliczony potem ktos inny moze miec te IP i co?questionmark.gif nie zostanie zaliczony
2. niektre kompy sa w sieci lokalne z wyjsciem na net tylko z jednego kompa (udostepnianie polaczenia) i kazdy z tych kompow na zewnatrz ma takie same IP wiec nawet jesli w takiej sieci jest 100 kompow i kazdy z nich bedze wchodzil na strone to zaliczony zostanie tylko jeden.

3. Niekotry wchodza na strone kilkakrotnie np, 2, 3, 10 razy dzienni i to jest wizyta danego usera (co innego jest nabijanie licznika przez odswierzanie)

przydatnosc ciasteczka do sporzycia mozna ustawic np na 15-20  minut (mozna powiedziec ze tyle mniejwiecej osoba siedzi sobie na stronie i cos przeglada)

jezeli po godzinie wejdzie na strone to zostanie zaliczona ale jezeli w cigu tych 15-20 minut bedzie chodzila po stronie to niebedzie zaliczana wiec nie bedzie sztucznych nabic licznika


moze jakis przyklad z cookie
Kinool
ja mam zrobione tak:

kod pliku do liczenia:
[php:1:d099b041d8]<?php

$fp=fopen("./coun/licznik.txt","r");
flock($fp,1);
$count=fgets($fp,20);
flock($fp,3);
fclose($fp);


if($odwiedziny!="tak") { // to jest sprawdzenie czy cooki jest na dysku klienta

$fw=fopen("./coun/licznik.txt","w");
flock($fw,2);
$count=$count+1;
fputs($fw,$count);
flock($fw,3);
fclose($fw);
}

echo ("Ilosc odwiedzin<br> od 14.07.2003: $count");


?>[/php:1:d099b041d8]


a na glownej stronie dajesz cos takiego
[php:1:d099b041d8]<?php

setcookie("odwiedziny",tak,time()+600);

?>[/php:1:d099b041d8]

600 = 10 minut

acha i pamietaj zeby ciasteczko wpisac na samym poczatku przed <head>
kalinowski
Cytat
ja mam zrobione tak:

kod pliku do liczenia:
[php:1:b7da8b3d2f]<?php

   $fp=fopen("./coun/licznik.txt","r");
   flock($fp,1);  
   $count=fgets($fp,20);
   flock($fp,3);
   fclose($fp);


  if($odwiedziny!="tak") { // to jest sprawdzenie czy cooki jest na dysku klienta
     
   $fw=fopen("./coun/licznik.txt","w");
   flock($fw,2);
   $count=$count+1;
   fputs($fw,$count);
   flock($fw,3);
   fclose($fw);
}
 
   echo ("Ilosc odwiedzin<br> od 14.07.2003: $count");


?>[/php:1:b7da8b3d2f]


a na glownej stronie dajesz cos takiego
[php:1:b7da8b3d2f]<?php

setcookie("odwiedziny",tak,time()+600);

?>[/php:1:b7da8b3d2f]

600 = 10 minut

acha i pamietaj zeby ciasteczko wpisac na samym poczatku przed <head>


nie dziala tak jak ma bo jak odswierzam to i tak powieksza sie liczba na liczniku
spenalzo
1. Przez przesady z cytowaniem.
2. Zastosuj tablice globalne $_COOKIE.
kalinowski
Cytat
1. Przez przesady z cytowaniem.
2. Zastosuj tablice globalne $_COOKIE.


moze jakas podpowiedz
Omega
Muwię zrób na plikach z IP... Tak ja pisałem wcześniej, na pewno będzie działać... Do tak prostego skryptu pliki są lepszym rozwiązaniem...
spenalzo
Cytat
Cytat
2. Zastosuj tablice globalne $_COOKIE.

moze jakas podpowiedz

Zamiast odwoływać się do zmiennej zapisanej w ciastku poprzez $odwiedziny odwołaj się poprzez $HTTP_COOKIE_VARS["odwiedziny"]

Omega: a co jeżeli więcej osób korzysta z jednego ip, np. w małej sieci? Poza tym IP w Polsce często jest dynamicznie przydzielane, więc może się zdarzyć, że np. następnego dnia ktoś całkowicie mi obcy będzie chciał zagłosować, a nie bęzie mogł bo ma takie samo IP. I po trzecie - do Mozilli jest dodatek (chyba się proctor zwie), który umożliwia zmianę numeru IP - też odpada. Nie ma rozwiązania idealnego, ale ja proponuję:
1. sprawdzić czy użtkownik może zapisywać ciastka
2a. jeżeli tak to może głosować
2b. jeżeli nie to nie może
itd
Bakus
A nie można zrobić logowania użytkowników...
W bazie przechowujesz np. nazwę usera, hasło i inne potrzebne Ci dane i datę ostatniego głosowania...
Jest to chyba najskuteczniejsze rozwiązanie...
dragonballpj
Kod
<?

# Database server to connect to

$dbhost  =    "localhost";

# Database to use

$db  =    "mysql";

# Database username

$dbuser  =    "root";

# Database password

$dbpasswd    =    "krasnal";

# Table to use

$table  =    "counter";



mysql_connect("$dbhost","$dbuser","$dbpasswd")

    or die("Unable to connect to SQL server!");

@mysql_select_db("$db")

    or die("Unable to select database!");



if(!$name) { $name = "default"; }



$query = mysql_query("select * from $table where name="$name"");

while ($row  =  mysql_fetch_array($query)) {

  $start = $row[start];

  $count = $row[count];

}



if(!$count) {

    mysql_query("insert into $table values (current_date()+0,"1","$name")");

    $count = "1";

}



print("$count");

if($_COOKIE['glosowales']==1){



}else{

setcookie("glosowales", "1", time()+3600*24);



$count++;

mysql_query("update $table set count="$count" where name="$name"");



}

?>

[sql:1:cf27b94039]CREATE TABLE counter (
START date default NULL,
count int(20) unsigned default NULL,
name char(255) NOT NULL default '',
PRIMARY KEY (name)
) TYPE=MyISAM;
[/sql:1:cf27b94039]
Bakus
@dragonballpj: Zmień znaczniki [CODE] na [php]
cipojsza
Cytat
A nie można zrobić logowania użytkowników...
W bazie przechowujesz np. nazwę usera, hasło i inne potrzebne Ci dane i datę ostatniego głosowania...
Jest to chyba najskuteczniejsze rozwiązanie...

Tylko jeszcze musisz zmusi uzytkownikow do logowania, biorac pod uwage przypadkowych userow, raczej nie zda to egzaminu. biggrin.gif
cipojsza
kalinowski byc moze uzyles tego kodu w funkcji (tak jak ja), wtedy musisz pamietac o przekazaniu zmiennej ciasteczka => $odwiedziny do wnetrza funkcji, teraz mi dziala na zwykłych cookies bez zadnych tablic biggrin.gif

Mam teraz takie pytanie, w zwiazku z tym iz rozpocząłem prace nad wlasnym licznikiem i sa one zaawansowane,
mam problem jednak robiac projekt "admina" tych statystyk,
potzrebuje wygenerowac wykresy odwiedzin w miesiącach tygodniach czy dniach, jakiej tu funkcji bym musial uzyc?
bo z grafiki to jestem zielony 8)
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-2024 Invision Power Services, Inc.