Programowanie w języku PHP

Licznik dla poszczegolnych adresów IP

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 &#8222;||&#8221;) i wkłada te części do tablicy ($wartosc);
- $REMOTE_ADDR to zmienna zawierająca ip gościa
- flock &#8211;blokuje dostęp do pliku &#8211; szczegóły : http://pl.php.net/manual/pl/function.flock.php
- fopen, otwiera plik, feof &#8211; end of file &#8211; 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 &#8222;\n&#8221; z konców zmiennej wiecej an 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);">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 ;)

6 komentarzy

Łukasz 2003-09-29 12:50

Witam.

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

Marooned 2003-09-27 15:26

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

Kintaro 2003-09-27 12:24

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)

Adam Boduch 2003-09-27 11:18

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]

Kintaro 2003-09-26 22:28

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

Drajwer 2003-09-26 14:59

server-side = strona servera = php :-P