Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Dziwny problem w ostaniej iteracji pętli
Forum PHP.pl > Forum > PHP
mastergos
Witam

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:
  1.  
  2. function filtr($ip,$tab_ip){
  3. $ip_t = explode(".",$ip);
  4. for($i =0;$i<count($tab_ip);$i++){
  5. $licznik = 0;
  6. echo("<BR>");
  7. $filtr_ip = explode(".",$tab_ip[$i]);
  8. for($a = 0;$a<4;$a++){
  9. if($filtr_ip[$a] == $ip_t[$a]){
  10. $licznik++;
  11. echo("<".$licznik."><br>");
  12. }
  13. echo($filtr_ip[$a]." ");
  14. echo($ip_t[$a]."|<br>");
  15. }
  16. if($licznik == 4){
  17. echo("<".$licznik."!><br>");
  18. return true;
  19. }
  20. }
  21. return false;
  22. }


Niżej:

  1. if($filtr == "TAK"){
  2. echo("<center><i>Filtrowanie włączone</i></center>");
  3. $tab_ip = file("filtr.cfg");
  4. }else{
  5. echo("<center><i>Filtrowanie wyłączone</i></center>");
  6. }
  7.  
  8. $licznik = 0;
  9. $wizyt = 0;
  10. $zapytanie = "SELECT wizyt,ip FROM licznik ORDER BY id;";
  11. $idzapytania = mysql_query($zapytanie);
  12. while($wiersz = mysql_fetch_row($idzapytania)){
  13.  
  14. if(isset($tab_ip) && ($filtr == "TAK")){
  15. if(filtr($wiersz[1],$tab_ip) == false){
  16. $licznik++;
  17. $wizyt = $wiersz[0] + $wizyt;
  18. }
  19. }else{
  20. $licznik++;
  21. $wizyt = $wiersz[0] + $wizyt;
  22. }
  23. }


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.
Fifi209
Zamień sobie ip na liczby ip2long

Pomysł dla unikalnych odwiedzin, sprawdzasz warunek jeżeli się zgadza to odejmujesz tablicę od tablicy array_diff i potem count w przeciwnym wypadku wystarczy count.
mastergos
Dziękuje funkcja idealna do mojego celu i znacznie powinna uprości kod.

Co do unikalnych odwiedzin to nie podany przez mnie licznik dba o to by nie zapisywać do bazy danych adresów IP które już w niej się znajdują a jedynie dodaje kolejna wizytę.

Edit:
Niestety coś dalej nie śmiga... =/ Znów nie wiem co jest grane....

  1.  
  2. function filtr($ip,$tab_ip){
  3. $ip_l = ip2long($ip);
  4. echo($ip."-!".$ip_l."<br>");
  5. for($i =0;$i<count($tab_ip);$i++){
  6. $ipt_l = ip2long($tab_ip[$i]);
  7. echo($tab_ip[$i]."-".$ipt_l."<br>");
  8. if($ip_l == $ipt_l){
  9. return true;
  10. }
  11. }
  12. return false;
  13. }


Otrzymujemy:

217.76.115.146-!3645666194
66.249.71.199 -
66.249.66.90 -
66.249.66.170 -
66.249.66.102 -
66.249.66.97 -
66.249.66.163 -

....

Prosił bym też na odpowiedz czemu mój poprzedni kod nie działał bo wolał bym w przyszłości nie przerabiać podobnego błędy ponownie...

Up...
thek
Nie wiem jak wygląda sprawa z Twoimi wpisami w tablicy licznik. Czy "wizyt" to od razu suma wizyt tego ip na stronie czy nie? Jeśli tak, zero problemu.
1. Sprawdzić czy filtr włączony.
2. Jeśli nie - sumujemy liczby z kolumny "wizyt"
3. Jeśli tak - w zapytaniu dodajemy warunek w zapytaniu: WHERE ip NOT IN ( $string_z_niechcianymi_IP_ujętymi_w_apostrofy_i_oddzielone_przecinkami ) i też sumujemy kolumne "wizyt" smile.gif
mastergos
Tak wizyty to ilość wejść danego IP na moja stronę... Licznik sprawdza czy dany IP jest już w bazie jeśli TAK: to zwiększa wartość pola wizyt o 1 jeśli NIE to dodaje IP do bazy.


Dziękuje za kolejną sugestie jednak jak nadal czekam na podpowiedz gdzie leży błąd w poprzednich wersjach funkcji filtr. Gdyż jak już pisałem wcześniej wole się uczyć na błędach i nie powtarzać ich w przyszłości.

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.