Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Licznik - cos nie tak w skrypcie (oparty na plikach)
Forum PHP.pl > Forum > Gotowe rozwiązania
xmarko
Witam,
Jestem w zasadzie "nowy w php".
Stworzyłem skrypt w php - licznik odwiedzin - niestety nie działa prawidłowo. Ma być odporny na odświeżanie (zapis czasu na IP odwiedzającego).
[php:1:e01299dbba]<?php
$nabij = FALSE;
$ip=$_SERVER['REMOTE_ADDR'];
$czas_teraz=date('U');
$plik_l="licznik_gl.in";
$plik_g="licznik.in";
$plik_l_tab=file($plik_l);
for ($i=0; $i< count($plik_l_tab); $i++)
{
$linia=explode("|&&|", $plik_l_tab[$i]);
if ($linia[0]==$ip)

$czas_roznica= ($czas_teraz)-($linia[1]);
$czas_nabijaj= "3600";

if ($czas_roznica <= $czas_nabijaj)
{
$wpis_po="$ip.'|&&|'.$czas_teraz.'|&&|'n";
$plik=file_get_contents($plik_l);
$plik=str_replace($plik[$i],$wpis_po,$plik);
$odczyt=fopen($plik_l,"w");
flock($odczyt,LOCK_EX);
fputs($odczyt,$plik);
flock($odczyt,LOCK_UN);
fclose($odczyt);

$plik=fopen($plik_g,"r");
$ile=fgets($plik,80);
$ile++;
fclose($plik);
$plik=fopen($plik_g,"w");
flock($plik,LOCK_EX);
fputs($plik,$ile);
flock($plik,LOCK_UN);
fclose($plik);

$nabij=TRUE;

}
}
if (!$nabij)
{
$odczyt=fopen($plik_l,"a");
flock($odczyt,LOCK_EX);
fputs($odczyt,"$ip|&&|$czas_teraz|&&|n");
flock($odczyt,LOCK_UN);
fclose($odczyt);
$plik=fopen($plik_g,"r");
$ile=fgets($plik,80);
$ile++;
fclose($plik);
$plik=fopen($plik_g,"w");
flock($plik,LOCK_EX);
fputs($plik,$ile);
flock($plik,LOCK_UN);
fclose($plik);

}
?>[/php:1:e01299dbba]
Założenia:
Jeden plik służy do zapis numeru IP i czasu $plik_l="licznik_gl.in"
a drugi do ilości odwiedzin. $plik_g="licznik.in";
jeżeli nie ma zapisu numeru IP dopisuje do pliku numer IP i czas
jeżeli czas IP jest równy lub większy od czasu zadeklarowanego "3600" to ma zostac zmieniony czas dla konkretnego IP na czas bieżący i zwiększony licznik o 1.
Jezeli czas jest mniejszy to ma zostać zminiony tylko czas na czas bieżący
Problem
Niestety nie mam pojęcia gdzie robie błąd w skrypcie. Może ktoś mi pomoże go rozwiązać.
iggi
mysle, ze skrypt na licznik z blokada bedzie duzo lepszy jezeli zamiast zapisaywania IP w plikach uzyjesz ciasteczek.

ciasteczka bardzo latwo sie robi wec jesli nic nie bedziesz pogl wykabinowac to daj znac gg:2077194
xmarko
ja jednak nie chce licznika opartego na ciasteczkach.
iggi
nie wiem co moze byc zle ale zaraz sprawdze i ci odpowiem

a to wszystko dlatego, ze nie chcesz ciasteczek tongue.gif

---------------------------------------------------------------

dobra zaraz napisze bo to rzeczywiscie kiepsko dziala tongue.gif

bede to robic na zasadzie:

1.podanie wszytkich zmiennych do edycji
2.sprawdzenie czy dane IP jest w pliku
3. jesli jest to sprawdzimy czas
4.jesli godzina w pliku jest wieksza lub rowna to naliczamy i zmieniamy czas
5.jesli nie nic nie robimy
6.jesli nie ma to naliczamy goscia to dodajemy do pliku
3.konczymy skrypt
iggi
oto w nowej odpowiedzi umieszczam kod dwóch plików.

1. plik licz.php - glowny plik skryptu

[php:1:00afeadd0d]<?php
###########################
##Autor:iggi###############
##Mail:iggi@kgb.pl#########
##gg:2077194###############
###########################

## KONFIKURACJA ## MOŻNA EDYTOWAĆ ##

$plik_licznika = "licznik.in"; //liczba typa
$plik_ip = "ip.in"; //dane o IP i godzinie
$czas_blokady=3600; //w sekundach

## KONFIGURACJA DALSZA ## NIE EDYTOWAĆ ##

$now = date("U");
$block = $now+$czas_blokady;
$ip=getenv("REMOTE_ADDR");
$ajpi=file("$plik_ip");
include("functions.php");

## FUNKCJE WYKONYWALNE ##

if(checkip($ip, $plik_licznika, $plik_ip, $now, $block, $ajpi)==1)
{
}
else
{
addguest($plik_licznika);
adduser($ip, $plik_ip, $block);
}


## WYPISUJE LICZBĘ TYPA ##

readfile("$plik_licznika");

?>[/php:1:00afeadd0d]


2. plik functions.php - funkcje potrzebne do dzialania skryptu

[php:1:00afeadd0d]<?php
// dodaj gościa
function addguest($plik)
{
$fp = fopen($plik, "r+");
$count = fgets($fp, 10);
$count ++;
fseek($fp, 0);
fwrite($fp, $count, 10);
fclose($fp);
}

//uaktualnij usera
function updateuser($ip, $plik)
{
$zmiennik = "$ip|$now";
str_replace($ajpi[$i],$zmiennik,$plik, $new);
}

//dodaj usera
function adduser($ip, $plik1, $block)
{
$fp = fopen($plik1, "r+");
fputs($fp, "$ip|$blockn");
fclose($fp);
}

function checkip($ip, $plik, $plik1, $now, $block, $ajpi)
{
for($i=0 ; $i < count($ajpi) ; $i++)
{
$a = split("[|]", $ajpi[$i]);

if(eregi($ip, $ajpi[$i]))
{
if($a[1] <= $now)
{
addguest($plik_licznika);
updateuser($ip, $plik_ip, $now);
$r=1;
}
else
{
$r=1;
}
}
else
{
$r=0;
}
}
return($r);
}

?>
[/php:1:00afeadd0d]

dodatkowo sa jeszcze 2 pliki:
-licznika.in - liczba gosci
-ip.in - IP odwiedzajcych.

w celu wyswietlenia zawartosci nalezy zaincludowac plik licz.php (on wyswietla tongue.gif)

gdydby gtos czegos nie kapowal to zapraszam na gg:2077194 lub tlen: ig_gi

dzieki temu skryptowi sprawdzilem siebie:P
xmarko
Trochę powalczyłemze skryptem i oto wynik. Może ktoś przetestuje czy działa.
Ewntualnie poprawi
[php:1:438fba8b32]
<?php.
#############
## xmarko ###
#############
$nabijaj=FALSE;
$ip=$_SERVER['REMOTE_ADDR'];
$czas_teraz=date('U');
$plik_d="licznik_d.in"; // dane
$plik_g="licznik.in"; // zapisy ilosci odwiedzajacych
$czas_nabijaj="3600";
##########################
##### FUNKCJE #####
##########################

function zmien_odczyt()
{
global $plik_d;
global $czas_teraz;
global $ip;
$plik = file($plik_d);
for ($i=0; $i < count($plik); $i++)
{
$linia = explode("|&&|", $plik[$i]);
if ($linia[0] == $ip)
{
$wpis_po=$ip."|&&|".$czas_teraz."|&&|n";
$plik1=file_get_contents($plik_d);
$plik1=str_replace($plik[$i],$wpis_po,$plik1);
$odczyt=fopen($plik_d,"w");
flock($odczyt,LOCK_EX);
fputs($odczyt,$plik1);
flock ($odczyt,LOCK_UN);
fclose ($odczyt);
$nabijaj = TRUE;
break;
}
}
}



function nabij()
{
global $plik_g;
$odczyt=fopen($plik_g,"r");
$ile=fgets($odczyt,80);
$ile++;
fclose($odczyt);
$odczyt=fopen($plik_g,"w");
flock($odczyt,LOCK_EX);
fputs($odczyt,$ile);
flock($odczyt,LOCK_UN);
fclose($odczyt);
}

function dopisz()
{
global $plik_d;
global $ip;
global $czas_teraz;
$odczyt=fopen($plik_d,"a");
flock($odczyt,LOCK_EX);
fputs($odczyt,"$ip|&&|$czas_teraz|&&|n");
flock($odczyt,LOCK_UN);
fclose ($odczyt);
}

##########################
##### DZIAŁANIE #####
##########################

$plik_d_tab=file($plik_d);
for ($i=0; $i< count($plik_d_tab); $i++)
{
$linia=explode("|&&|",$plik_d_tab[$i]);

if ($linia[0]==$ip)
{
$czas_roznica=$czas_teraz - $linia[1];
if ($czas_roznica < $czas_nabijaj)
{
zmien_odczyt();
$nabijaj=TRUE;
}
else{
nabij();
zmien_odczyt();
$nabijaj=TRUE;
}
}
}

if(!$nabijaj)
{
nabij();
dopisz();
}
?>[/php:1:438fba8b32]
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.