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

Posty w temacie


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: 26.09.2025 - 02:09