PHP

Licznik dla poszczegolnych adresów IP

Kintaro

Licznik ten jest prosty jak budowa cepa wiec nie będę tu dużo mówił.

Oto kod:

// na początek sprawdzamy czy danego gościa już mamy
// zarejestrowanego w naszych tajnych aktach
<?
$czy_byl=false;
if (file_exists("bazaip.txt")){
$baza=fopen("bazaip.txt","r");
flock($baza,1);
while (!feof($baza)) {
    $linia=fgets($baza);
    $wartosc=explode("||",$linia);
    if ($wartosc[0]==$REMOTE_ADDR){ $czy_byl=true;}
}
flock($baza,3);
fclose($baza);
}
  • funkcja explode dzieli dany string według schematu (w tym wypadku „||”) i wkłada te części do tablicy ($wartosc);
  • $REMOTE_ADDR to zmienna zawierająca ip gościa
  • flock –blokuje dostęp do pliku – szczegóły : http://pl.php.net/manual/pl/function.flock.php
  • fopen, otwiera plik, feof – end of file – czyli czy koniec pliku (wartość true/false)

// teraz już wiemy czy był czy nie
// jest to typowa baza plaska, (jeśli tak to się nazywa) w plikach
// tekstowych, dzielona takim znakiem ||
// czy był czy nie mamy w zmiennej $czy_byl :)
// ***

// teraz jeśli jest to nowy gość to go dopisujemy do bazy danych

if (!$czy_byl)
{
$baza=fopen("bazaip.txt","a");
flock($baza,2);
fputs($baza,$REMOTE_ADDR."||1\n");
flock($baza,3);
fclose($baza);
}

// dopisaliśmy adres oraz 1 czyli liczbę jego aktualnych odwiedzin
// **

// ***teraz zaczyna się zabawa
// gość już był wiec tarza to obsłużyć

if ($czy_byl)
{
$i=0;
$baza=fopen("bazaip.txt","r");
flock($baza,1);
while (!feof($baza)) {
    $linia=fgets($baza);
$linia=trim($linia); //

trim usywa „\n” z konców zmiennej wiecej an http://pl.php.net/manual/pl/function.trim.php

if (!empty($linia)){  // empty sprawdza czy cos jest w zmiennej
    $wartosc=explode("||",trim($linia));
    if( $wartosc[0]==$REMOTE_ADDR) $wartosc[1]++;
    $nowy[$i][]=$wartosc[0];
    $nowy[$i++][]=$wartosc[1];
}
}
flock($baza,3);
fclose($baza);

// na górze, (czyli tam ^) skopiowaliśmy dotychczasowa bazę do
// tablicy $nowy, oczywiście dla odpowiedniego adresu
// podnieśliśmy wartość o jeden

$baza=fopen("bazaip.txt","w");
flock($baza,2);
if (!empty($nowy)){
foreach ($nowy as $temp)
    {
    fputs($baza,trim($temp[0])."||".trim($temp[1])."\n");
    }
}
flock($baza,3);
fclose($baza);
}
 

// teraz (na górze ^) zapisaliśmy ta bazę jeszcze raz
// *****

// a teraz standardowy licznik odwiedzin
// czyli czytamy ile już było wszystkich odwiedzin, poczym
// podnosimy o jeden i zapisujemy

if (file_exists("licznik.txt")) {
$licz=fopen("licznik.txt","r");
$stan=fgets($licz);
$stan=(!empty($stan))?$stan:0;
fclose($licz);
$licz=fopen("licznik.txt","w");
fputs($licz,++$stan);
fclose($licz);
} else {$licz=fopen("licznik.txt","w");
fputs($licz,"1");
fclose($licz);}
?>

i tu koniec

  * Update ********

Wkradł się bład do poprzedniego updatue :)
Tak to jest jak człowiek wierzy sam sobie, a nic nie sprawdzi.

Jak zrobic, aby nie liczyc odwiedzin dla ip np 10.0.0.1

Nad wszystkim definiujemy (czyli w jeszcze przed definicja $czy_byl)

 $czy_dodawac=true;

W pierwszej funkcji (tam gdzie tworzylismy zmienna $czy_byl) dodajemy linijkę, tak aby fragment tak wygladał

..
while (!feof($baza)) {
    $linia=fgets($baza);
    $wartosc=explode("||",$linia);
    if ($wartosc[0]==$REMOTE_ADDR) $czy_byl=true;
if ($wartosc[0]=="10.0.0.1") $czy_dodawac=false; //dodana linijka
}
..

Następnie, tam gdzie jest zapis do pliku licznik.txt, modyfikujemy tak, aby kod wyglądał w ten sposób:

..
if ($czy_dodawac) { //dodana linia
    if (file_exists("licznik.txt")) 
        {
        $licz=fopen("licznik.txt","r");
        $stan=fgets($licz);
        fclose($licz);
        if (!empty($stan)) //dodana linia
            {
$licz=fopen("licznik.txt","w");
            fputs($licz,++$stan);
            fclose($licz);
            }
        else    
                  {$licz=fopen("licznik.txt","w");
            fputs($licz,"1");
            fclose($licz);
            }
        } 
    else 
        {
        $licz=fopen("licznik.txt","w");
        fputs($licz,"1");
        fclose($licz);
        }
}
..

Aby wyświetlić wartość na końcu piszemy:

$licz=fopen("licznik.txt","r");
flock($licz,1);
$stan=fgets($licz);
flock($licz,3);
fclose($licz);
if (!empty($stan)) echo $stan; else echo "1";

Tutaj jest cały gotowy kod:

<?
$dane="bazaip.txt";
$licznik="licznik.txt";
$czy_dodac=true;
$w=0;
$czy_byl=false;
if (file_exists($dane)){
$baza=fopen($dane,"r+");
flock($baza,1);
while (!feof($baza)) {
    $linia=fgets($baza);
    $wartosc=explode("||",$linia);
    if ($wartosc[0]==$REMOTE_ADDR) $czy_byl=true;
    if ($wartosc[0]=="10.0.0.1") $czy_dodac=false;
}
flock($baza,3);
fclose($baza);
}
 
if (!$czy_byl)
{
$baza=fopen($dane,"a");
flock($baza,2);
fputs($baza,$REMOTE_ADDR."||1\n");
flock($baza,3);
fclose($baza);
}
 
if ($czy_byl)
{
$i=0;
$baza=fopen($dane,"r");
flock($baza,1);
while (!feof($baza)) {
    $linia=fgets($baza);
$linia=trim($linia);
if (!empty($linia)){
                $wartosc=explode("||",trim($linia));
                if( $wartosc[0]==$REMOTE_ADDR) $wartosc[1]++;
                $nowy[$i][]=$wartosc[0];
                $nowy[$i++][]=$wartosc[1];
}
 
}
flock($baza,3);
fclose($baza);
$baza=fopen($dane,"w");
flock($baza,2);
if (!empty($nowy)){
foreach ($nowy as $temp)
                {
    fputs($baza,trim($temp[0])."||".trim($temp[1])."\n");
    }
}
flock($baza,3);
fclose($baza);
}
if ($czy_dodac) {
    if (file_exists($licznik)) 
        {
        $licz=fopen($licznik,"r");
        $stan=fgets($licz);
        fclose($licz);
        if (!empty($stan))
            {$licz=fopen($licznik,"w");
            fputs($licz,++$stan);
            fclose($licz);
            }
        else    
                  {$licz=fopen($licznik,"w");
            fputs($licz,"1");
            fclose($licz);
            }
        } 
    else 
        {
        $licz=fopen($licznik,"w");
        fputs($licz,"1");
        fclose($licz);
        }
}
$licz=fopen("licznikpaj.txt","r");
flock($licz,1);
$stan=fgets($licz);
flock($licz,3);
fclose($licz);
if (!empty($stan)) echo $stan; else echo "1";
?>

To na tyle. Pozdrawiam :)
ps. Dziękuje Łukasz ;)

PHP

6 komentarzy

znacznka <php na pocztaku rzeczywiscie nie ma :P, jakos zle wycialem, a o znaczniku nie wiedzialem :(
polskich znakow nie stosuje bo nawet mi sie one nie wyswietlaja, ale ok, na przyszlosc bede stosowal.
zdanie sa od duzej litery (przynajmniej teraz sa, bo moze ktos to zmienil, nie wiem ;)
to nie artykul uczacy podstaw php, tylko przedstawiajacy jak mozna napisac licznik, przedstawia pomysl, daje gotowy przyklad do zastosowania - przyklad ktorego ja nigdzie w sieci nie znalazlem, uzyte tytuj funkcje i skladnie jezyka sa bardzo proste - nalezace do podstaw jezyka, i dokladnie opisane w kazdym artykule o pisaniu w php (wiem bo chyba wszystkie przeczytalem :))
napisalem duzo bo sie nie zgadzam z okresleniem olewkowy (od niechcenia) (reszta jest ok)

Witam.

Co i gdzie dodac żeby licznik niezwiekszał się o 1 gdy wchodzi ktoś z IP np. 10.1.1.3 ???
THX

Tak przy okazji: nie ma dużych liter - są wielkie i małe ;)

Ode mnie 2.
Po pierwsze: ludzie stosujcie znaczniki < php > aby jakos uwidocznic kod!

Caly artykul jest malo czytelny, olewkowy. Autor podchodzi do tematu od niechcenia. No i prosze stosowac polskie znaki. To nie jest forum, gdzie mozna pisac jak sie chce, ale artykul, wiec zaczynamy zdanie od duzej litery, piszemy polskimi znakami.

Po prawej stronie jest link 'Pomoc', tutaj jest napisane jak powinno wygladac tworzenie artykulow: [url]http://4programmers.net/coyote/coyote.html#10.4[/url]

hmm....
a o co do kladnie chodzi z tym przypisaniem wartosci ???
ale jesli o moj komentarz, to brakuje mi dzialu wskazowek !!!, a tak swoja droga to nie wiem nawet gdzie ten dzial jest ?? ;) :P

server-side = strona servera = php :-P