Od pewnego czasu pracuje nad licznikiem odwiedzin opartym o MySQL. Licznik napisałem bez problemów jednak zachciało mi się dodać do niego możliwość odfiltrowywania niechcianych adresów IP (chodzi tu głównie o boty google) jednak nie chciałem usuwać ich z bazy danych dając użytkownikowi wybór czy chce by wyniki działa licznika był filtrowany czy nie. Filtrowanie oparłem o plik tekstowy który zawiera niechciane adresy IP. Zasada działa filtra jest taka:
- wczytuje niechciane adresy IP z pliku
- wczytuje w petli kolejne adresy IP z bazy danych które zliczam
- adresy z bazy danych porównuje w funkcji z niechcianymi adresami IP
- w zależności od bool'owskiej wartości jaka zwraca funkcja doliczam lub nie dany adres.
Tak to wygląda w praniu:
function filtr($ip,$tab_ip){ for($i =0;$i<count($tab_ip);$i++){ $licznik = 0; for($a = 0;$a<4;$a++){ if($filtr_ip[$a] == $ip_t[$a]){ $licznik++; } } if($licznik == 4){ return true; } } return false; }
Niżej:
if($filtr == "TAK"){ }else{ } $licznik = 0; $wizyt = 0; $zapytanie = "SELECT wizyt,ip FROM licznik ORDER BY id;"; if(filtr($wiersz[1],$tab_ip) == false){ $licznik++; $wizyt = $wiersz[0] + $wizyt; } }else{ $licznik++; $wizyt = $wiersz[0] + $wizyt; } }
echa'a w funkcji dodałem w celach testowych...
I tak dla tylko jednego adresu IP w pliku filtr.cfg
Mamy takie wyniki:
66 217|
249 76|
71 115|
199 146|
<1>
66 66|
<2>
249 249|
<3>
71 71|
199 202|
66 80|
249 48|
71 178|
199 2|
<1>
66 66|
<2>
249 249|
<3>
71 71|
199 101|
....
<1>
66 66|
<2>
249 249|
<3>
71 71|
199 199|
<1>
66 66|
<2>
249 249|
71 66|
199 90|
...
Tu tkwi problem... przy ostatniej iteracji pętli warunek jak by nie był sprawdzany... testowałem to dla odwróconej kolejności wynik był taki:
<1>
199 199|
<2>
71 71|
<3>
249 249|
66 66|
Nie potrafię tego wyjaśnić ani zrozumieć czemu się tak dzieje...
P.S Jestem świadom że funkcja nie jest jeszcze optymalnie napisana bo np. pętla działa nadal nawet jeśli pierwsza części adresu IP się nie zgadza.