Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Dziwny problem w ostaniej iteracji pętli
mastergos
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 19.07.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mastergos
post
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 19.07.2010

Ostrzeżenie: (0%)
-----


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...

Ten post edytował mastergos 19.07.2010, 19:32:06
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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" (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
mastergos
post
Post #5





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 19.07.2010

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 07:39