Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Adres IP - skrypt
Forum PHP.pl > Forum > PHP
Szunaj85
Chciałbym się zapytać o jedną rzecz. Mianowicie chodzi mi o adres IP.
Napisałem skrypt, który wykonuje pewną czynność, gdy początek adresu IP użytkownika jest równy temu w zmiennej. Dokładnie chodzi o pogrubiony kawałek: xxx.xxx.xxx.xxx

  1. <?php
  2. $ip = $_SERVER[&#092;"REMOTE_ADDR\"];
  3. $poczatek_ip = '83';
  4. $czesc_ip = $poczatek_ip;
  5. $czesc_ip = &#092;".[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}\";
  6. if (ereg($poczatek_ip,$ip))
  7. echo &#092;"działa\";
  8. ?>


Ten skrypt działa bo sprawdzałem. Gdy w zmiennej wpisałem początek IP równe mojemu działał, natomiast gdy
w zmiennej wpisałem początek IP inny niż mój nie działał. Jednak każdy kraj ma więcej niż jeden początkowy numer IP,
a do jednej zmiennej chyba nie da się przypisać kilku liczb. Pomyślałem więc o tablicy.

Chodzi o skrypt, który odczytyłałby IP użytkownika, następnie przeszukiwałby tablicę i jeżeli początek adresu IP użytkownika jest równy liczbie znajdującej się w tablicy wykonywałby pewną czynność, gdy taki numer nie znajduje się w tablicy nic by nie robił albo zwracał false.

  1. <?php
  2. $ip = $_SERVER[&#092;"REMOTE_ADDR\"];
  3. $czesc_ip = $poczatek_ip;
  4. $czesc_ip = &#092;".[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}\";
  5.  
  6. $ip2 = $tablica;
  7. $tablica = array();
  8. $tablica[0] = '62';
  9. $tablica[1] = '67';
  10. $tablica[2] = '81';
  11. $tablica[3] = '83';
  12. $tablica[4] = '84';
  13.  
  14. $szukaj_ip = array_search($ip2, $tablica);
  15. if ($szukaj_ip == $poczatek_ip){
  16. if (ereg($poczatek_ip,$ip))
  17. {echo &#092;"działa\";}
  18. else {echo &#092;"nie działa\";}}
  19. else {echo &#092;"nie działa podwójnie\";}
  20. ?>


Ten skrypt już nie działa. Nie wiem czy dobrze się za to wziołem i gdzie są błędy. Interesuje mnie również rozwiązanie z kilkoma tablicami (kilka krajów). Prosiłbym o pomoc w tej sprawie.
Dopiero początkuje w PHP (z forum włącznie), więc proszę o wyrozumiałość. sad.gif
Babcia@Stefa
Powinno działać :]

  1. <?php
  2. $ip = $_SERVER['REMOTE_ADDR'];
  3. $blocked = array('83', '88');
  4. $exp = explode('.', $ip);
  5.  
  6. if(in_array($exp[0], $blocked))
  7. {
  8.  echo 'Działa';
  9. } else
  10.  echo 'Twoje ip nie jest zablokowane';
  11. ?>


@edit
Przed chwilą sprawdzałem, działa.

Dziękuję, Babcia@Stefa
marcio
Zrob to na bazie albo na plikach a nie dajesz do zmiennej w skrypcie nie bedzie tak lepiej?
Szunaj85
Babcia@Stefa dziękuję za ekspresową odpowiedź. Masz u mnie plus. biggrin.gif
Faktycznie twój przykład działa i może warto przy tym zostać.
Chciałbym zapytać jak w tym przykładzie umieścić kilka tablic tak aby każda z nich wyświetlała swój własny komunikat.
Postaram się jaśniej:
Chodzi o skrypt, który odczytyłałby IP użytkownika, następnie przeszukiwałby tablicę i jak w pierwszej tablicy nie znalazłby liczby równej początku IP użytkownika przechodziłby do następnej tablicy, i takby szukał. I jeżeli w którejś
z kolei tablicy znalazłby liczbę równą początku adresu IP wykonywałby pewną czynność, przypisaną dokładnie tej tablicy. Gdy taki numer nie znajduje się w żadnej tablicy nic by nie robił albo zwracał false.
Sam też spróbuje wykonać ten wyżej wymieniony skrypt. Może się uda.
marcio
Nie rozumiem potrzeby dawac tego do kilku tablic

Najlatwiej to w sumie bedzie tak:
  1. <?php
  2. $ip = $_SERVER['REMOTE_ADDR'];
  3. $blocked = array('83', '88');
  4. $blocked2 = array('84', '89');
  5. $exp = explode('.', $ip);
  6. $exp2 = explode('.', $ip);
  7.  
  8. if(in_array($exp[0], $blocked) || in_array($exp2[0], $blocked2)) echo('Działa'); else echo('Twoje ip nie jest zablokowane');
  9. ?>


EDIT: chcesz aby kazda tablica miala swoj komunikat wiec dawaj if na kazda tablice napewno mozna to lepiej napisac ale tak bedzie chyba najlatwiej
Szunaj85
Tak jak wyżej napisałem. Chodzi o to żeby każdy zbiór początkowych numerów adresów IP (każdy kraj) wykonywał inną czynność. Dlatego mówie o kilku tablicach.
Każda tablica to inny kraj.
Każda tablica wykonuje inną czynność. (np. każda tablica wyświetla inny komunikat).

Jednak mogę się mylić i jest inne zupełnie prostrze rozwiązanie. Oczywiście jestem otwarty na propozycje.
marcio
No to napisalem ci jak bedzie najlatwiej zamiast
  1. <?php
  2. if(in_array($exp[0], $blocked) || in_array($exp2[0], $blocked2)) echo('Działa'); else echo('Twoje ip nie jest zablokowane');
  3. ?>

Daj
  1. <?php
  2. if(in_array($exp[0], $blocked)) echo('Działa'); else echo('Twoje ip nie jest zablokowane');
  3. if(in_array($exp2[0], $blocked2)) echo('Good'); else echo('Sorry your ip was banned');
  4. ?>

Czy jakos tak po angielsku nie wymiatam w nim biggrin.gif
Szunaj85
O to właśnie chodziło! Kilka linijek kodu, a cieszy.
Dziękuję Ci marcio. Temat uważam za zamknięty.
Babcia@Stefa
Ja mam chyba najlepsze rozwiązanie z opisem:

  1. <?php
  2. $ip = $_SERVER['REMOTE_ADDR']; // pobiera adres ip
  3. $blocked = array('127' => 'Neostrada!', '88' => 'Nie wiem jakiś inny haha.gif'); // lista początków adresu IP
  4. $exp = explode('.', $ip); // rozbija adres ip i wrzuca do tablicy (4 części najczęściej - jak się trafi dziwny adres ip, to będzie inna ilość ale takie coś się chyba nie
     zdarza)
  5. $echo = NULL; // początkowa wartość zmiennej $echo, tak aby nie było nawet notice'a jeśli masz full error_reporting - co nie powinno mieć miejsca publicznie, null, NULL oznacza pustkę, 0 ;) 
  6.  
  7. if(in_array($exp[0], $blocked) OR isset($blocked[$exp[0]])) // sprawdza czy element $exp[0] istnieje w tablicy (ten element to pierwszy element tablicy $exp czyli pierwszy blok IP dla 127
    .0.0.1 będzie 127) a isset sprawdza czy wiadomość jest a jeśli jest wiadomość to i jest począ
    tek w tablicy :] - jedna funkcja in_array zwróci false gdy jest wiadomość, ale za to isset zwróci 
    true ;)
  8. {
  9. $echo .= 'IP: ' .$ip; // pokazuje adres ip (szybsze działanie daje zapisywanie do zmiennej - tak robią systemy szablonów)
  10. if(isset($blocked[$exp[0]])) // sprawdza czy jest dostepna wiadomość
  11. $echo .= '<br/>Wiadomość: ' .$blocked[$exp[0]]; // jeśli jest dostępna dodaje do zmiennej $echo
  12. } else // jeśli początek ip nie znajduje się w tablicy $blocked to doda do zmiennej $echo
     komunikat
  13.  $echo .= 'Twoje ip nie jest zablokowane';
  14.  
  15. echo $echo; // wyświetla zmienną $echo
  16. ?>


Dziękuję, Babcia@Stefa
Szunaj85
Zastanawiałem się czy odpisać bo problem teoretycznie został rozwiązany, ale po dłuższym namyśle postanowiłem to zrobić. Może ktoś ma inne rozwiązanie.
Chce zauważyć, że miło jest gdy ktoś tak dokładnie opisuje kod, który napisał. To bardzo ułatwia zielonym w PHP analizę jego zawartości. Myślę tu o Babcia@Stefa.
Jednak wracając do problemu chce zwrócić uwagę na kilka rzeczy.
Babcia@Stefa nie jestem pewien czy dokładnie przeczytałeś wszystkie posty. Wyżej dokładnie jest napisane na czym polega problem (starałem się opisać go zrozumiale i ze szczegółami).
Sprawdziłem twój skrypt i jak początek IP znajduje się w tablicy to wyświetla np.:
IP: xxx.xxx.xxx.xxx
Wiadomość: Neostrada

A jeżeli nie:
Twoje ip nie jest zablokowane
Oczywiście skrypt działa i może ktoś z niego skorzysta, jednak moje wymagania są trochę inne.
1. W moim przypadku jest potrzebna więcej niż jedna tablica - (każdej tablicy odpowiada np. inny komunikat) szczegóły są we wcześniejszych postach wyżej. Rozwiązanie mniej więcej coś na wzór marcio.
2. W moim przypadku nie jest potrzebne wyświetlanie adresu IP.
3. Piszecie o zabanowaniu lub zablokowaniu adreu IP. A ja wcale nie chcę nikogo banować ani blokować.
Ogólnie rzecz biorąc chodzi o porównanie adresu IP z tablicami i wyświetlenie np. komunikatu w zależności od tego
w jakiej tablicy znajduje się początek adresu IP.
Ale jeszcze raz! Szczegóły są we wcześniejszych postach wyżej. Mniej więcej coś na wzór marcio. W razie wątpiliwości pisać. biggrin.gif
Babcia@Stefa
Może napisz po co Ci te dwie tablice, być może nawet pomożemy Ci zintegrować ten kod (zapewne nie będzie to trudne)...

Rozwiązanie marcio'a nie jest wcale lepsze, a pozatym to są tylko instrukcje warunkowe.

Dziękuję, Babcia@Stefa
marcio
Cytat
Rozwiązanie marcio'a nie jest wcale lepsze, a pozatym to są tylko instrukcje warunkowe

A co mo twoje rozwiazanie do tego tematu nastukales troche kodu i co??

Ogolnie @Szunaj85 moje rozwiazanie nie jest ani szybkie ani profesjonalne ale zrob cos na wzor tego co ci napisalem jak nie to pokombinuj bo nie wiem zabardzo jak ci pomoc
Szunaj85
Wcześniej tego nie dostrzegłem, ale chcąc wypełnić tablice numerami zauważyłem, że inne kraje też mają np. 83 na początku. To rujnuje mój plan, ponieważ nie mogę tak wykonać skryptu. Chciałem zapytać jak zlokalizować kraj z którego łączy się użytkownik na podstawie jego adresu ip. Może wystarczy coś takiego: xxx.xxx.xxx.xxx, a nie jak wcześniej sądziłem xxx.xxx.xxx.xxx. Sumując chcę być w stanie stwierdzić z jakiego kraju użytkownik połączył się z moją stroną odczytując jego adres ip i na tej podstawie wyświetlić odpowiedni komunikat (opierając się na powyższych skryptach). sadsmiley02.gif
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.