Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] ip-to-country
Forum PHP.pl > Forum > PHP
dachu
cześć
zainstalowałem sobie tabele z zakresami IP krajów - ip-to-country, aby ładowała się odpowiednia wersja językowa strony.
Skrypt nie działa, może ktoś wie co może być nie tak? W ogóle nic się nie dzieje smile.gif Dla testu pobieram sobie rekord z bazy to działa (np. SELECT * FROM ip LIMIT 1), czyli połączenie z bazą jest ok, pola tabeli też sprawdzałem...

  1. $dbHost='localhost';
  2. $dbUser='root';
  3. $dbPass='krasnal';
  4. $dbName='baza';
  5.  
  6. @mysql_connect($dbHost,$dbUser,$dbPass);
  7. @mysql_select_db($dbName);
  8.  
  9. $IP = $_SERVER['REMOTE_ADDR'];
  10.  
  11. $query = "SELECT * FROM ip WHERE od<=INET_ATON('$IP') AND do>=INET_ATON('$IP')";
  12. $wynik=@mysql_query($query);
  13. $iWynik=@mysql_num_rows($query);
  14.  
  15. while ($dane=@mysql_fetch_array($wynik)) {
  16. $kraj = $dane["nazwa"];
  17. $kod2 = $dane["kod2"];
  18. $kod3 = $dane["kod3"];
  19. }
  20.  
  21. if ($kod2=='DE') {
  22. header('Location:http://de.strona.domena');
  23. } else if ($kod2=='EN') {
  24. header('Location:http://en.strona.domena');
  25. } else {
  26. header('Location:http://pl.strona.domena');
  27. }
  28.  
Quadina
Dodaj na początku


Wywal wszystkie @ sprzed funkcji od bazy danych i w 20 linii:
  1. print_r($dane);


Dzięki temu sprawdzisz co dostajesz z bazy i czy przypadkiem Twój krasnal albo @ nie ukryły Ci jakiegoś fatal errora przy połączeniu z bazą czy wyciąganiu danych.
dachu
nie mam, żadnych komunikatów o błedach, nic się nie wyświetla... zrobiłem tak jak napisałeś
Quadina
Na pewno wywalileś wsystkie znaki @ sprzed funkcji? Nie możliwe, żeby wywalało Ci skrypt nie informując o tym. Znaczniki @ nie drukują komnikatu błędu do standardowego wyjścia, można te błędy jedynie zobaczyć w error.log w logach apacha. Jak masz do nich dostęp to tak czy inaczej zaglądnij co tam się pojawia podczas uruchamiania Twojego skryptu.
dachu
Pojawia się teraz komunikat: Undefined variable: kod2
Quadina
To oznacza, że baza danych nie zwraca Ci żadnego rekordu. Twoja pętla while nie zadziała zatem nie ma zadeklarowanej wartości zmiennej $kod2. Twoje ify na końcu w takim wypadku nic nie robią i wykonuje się ostatni else. Spróbuj wydrukować sobie swoje zapytanie po 11 linijce (echo $query;) i potem wykonaj je ręcznie przez np. phpMyAdmina. Sprawdzisz dzięki temu czemu baza danych nie zwraca Ci żadnego komunikatu.
dachu
Pojawia się coś takiego:

  1. SELECT * FROM ip WHERE od_zakres<=inet_aton('109.190.117.27') AND do_zakres>=inet_aton('109.190.117.27')

Quadina
A co pokazuje phpMyAdmin na to zapytanie?
dachu
Cytat(Quadina @ 3.12.2010, 00:17:39 ) *
A co pokazuje phpMyAdmin na to zapytanie?


dziwne, "Zapytanie SQL zostało pomyślnie wykonane (Wykonanie zapytania trwało 0.0681 sekund(y))" a nic nie wyświetlił... coś jest nei tak...
Quadina
W takim razie zapytanie nie zwraca żądnych wyników, zatem skrypt działa poprawnie. Nie ma wyników, nie ma przypisania zmiennej $kod2, więc nic się nie dzieje. Popracuj nad zapytaniem, czy na pewno wyszukuje odpowiednie dane i czy te dane są.
dachu
Cytat(Quadina @ 3.12.2010, 00:32:07 ) *
W takim razie zapytanie nie zwraca żądnych wyników, zatem skrypt działa poprawnie. Nie ma wyników, nie ma przypisania zmiennej $kod2, więc nic się nie dzieje. Popracuj nad zapytaniem, czy na pewno wyszukuje odpowiednie dane i czy te dane są.



może to INET_ATON nie działa na danej wersji ... MySQL
Quadina
inet_aton('109.190.117.27') => 1841198363

W jakiej reprezentacji masz dane w swojej bazie? moze inet_aton potrzebujesz zadać po dwóch stronach zapytania? to jest dla Twojego sql:

  1. $query = "SELECT * FROM ip WHERE INET_ATON(od)<=INET_ATON('$IP') AND INET_ATON(do)>=INET_ATON('$IP')";
dachu
Cytat(Quadina @ 3.12.2010, 00:43:55 ) *
inet_aton('109.190.117.27') => 1841198363

W jakiej reprezentacji masz dane w swojej bazie? moze inet_aton potrzebujesz zadać po dwóch stronach zapytania? to jest dla Twojego sql:

  1. $query = "SELECT * FROM ip WHERE INET_ATON(od)<=INET_ATON('$IP') AND INET_ATON(do)>=INET_ATON('$IP')";


włąsnie w takiej np: 1841198363

ale nadal to samo sad.gif
Quadina
To może skopiuj tutaj nam 3-4 rekordy ze swojej bazy, a w między czasie w phpMyAdminie sprawdź czy Twoje zapytanie zwraca cokolwiek np. dla:
  1. SELECT * FROM ip WHERE od_zakres<=inet_aton('109.190.117.27')
Mephistofeles
Nie lepiej język sprawdzać w nagłówkach przeglądarki, a potem wyświetlić dodatkowo opcję zmiany języka?
Darti
Cytat(dachu @ 3.12.2010, 01:23:39 ) *
dziwne, "Zapytanie SQL zostało pomyślnie wykonane (Wykonanie zapytania trwało 0.0681 sekund(y))" a nic nie wyświetlił... coś jest nei tak...


A nie ma dodatkowo napisane że wynik zwrócił 0 rekordów ?
dachu
Cytat(Darti @ 3.12.2010, 14:13:20 ) *
A nie ma dodatkowo napisane że wynik zwrócił 0 rekordów ?


No 0 rekordów... nie ma jakiegoś łatwiejszego sposobu na to?
Dziwne jest jeszcze to, że koledze z krakowa przesłałem skrypt i jemu wyświetla skrót PL, a mi nie... Jakby mój IP nie mieścił się w szukanym zakresie... Ale podobnie sprawdzałem u innego kolegi z mojego miasta i również nie wyświetla skrótu PL.
Dziwne to...

Jeśli dam przykładowe zapytanie w PhpMyadmin:

  1. SELECT *
  2. FROM ip
  3. WHERE od_zakres <= inet_aton( '109.190.117.27' )
  4. LIMIT 0 , 30


to wyświetla mi rekordy:


2 50331648 69956103 US USA UNITED STATES
3 69956104 69956111 BM BMU BERMUDA
4 69956112 83886079 US USA UNITED STATES
5 94585424 94585439 SE SWE SWEDEN
6 100663296 121195295 US USA UNITED STATES
7 121195296 121195327 IT ITA ITALY
8 121195328 152305663 US USA UNITED STATES
9 152305664 152338431 GB GBR UNITED KINGDOM


itd...
Quadina
Kolego... Twój IP to po inecie 1841198363, nie masz takiego w swoim spisie, masz tylko mniejsze, zatem wynik jest poprawnie 0 rekordów smile.gif Kolega musiał mieć IP z miejsca gdzie masz akurat zakresy, zatem wszystko sprowadza się to tego, że nie masz pełnej bazy danych smile.gif
dachu
Cytat(Quadina @ 3.12.2010, 18:39:46 ) *
Kolego... Twój IP to po inecie 1841198363, nie masz takiego w swoim spisie, masz tylko mniejsze, zatem wynik jest poprawnie 0 rekordów smile.gif Kolega musiał mieć IP z miejsca gdzie masz akurat zakresy, zatem wszystko sprowadza się to tego, że nie masz pełnej bazy danych smile.gif


dokładnie tak, no i do czegoś doszliśmy, dzięki, znalazłem baze która jest obszerniejsza : ) nie tetowałem jeszcze, ale jest nadzieja : D
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.