За последние 24 часа нас посетили 22610 программистов и 1014 роботов. Сейчас ищет 721 программист ...

Определение города по IP-адресу юзера

Тема в разделе "Прочие вопросы по PHP", создана пользователем EndoCrinolog, 5 фев 2012.

  1. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Может код и грубый, но рабочий. Точность определения города зависит НЕ от скрипта, а от данных, получаемые им. Вот, собственно, код. С объяснением:
    Код (PHP):
    1. <?php
    2. // Сначала получаем данные о сервере
    3. $dom = $_SERVER['HTTP_HOST'];
    4. $ipus = getenv('REMOTE_ADDR');
    5. // Если сервер - не localhost, то мы продолжим код
    6. /*
    7. Примечание: если хотите, можете эту проверку вырубить. Просто лично у меня она не прокатывала с денвера
    8. */
    9. if ($dom != "localhost"){
    10. // Формируем адрес подключения
    11. $fl = "http://ip-whois.net/ip_geo.php?ip=".$ipus;
    12. // Получаем эти данные через file_get_contents()
    13. /*
    14. Примечание: при использовании fopen() - не прокатывало...
    15. */
    16. $data = file_get_contents($fl);
    17. /*
    18. Получив данные, мы получили ОГРОМНУЮ страницу. Следовательно, нам нужно её обрезать так, чтобы осталась только надпись города (Город: [полученный город]). Если вы откроете страницу http://ip-whois.net/ip_geo.php?ip=какой-нибудь_IP, то Вы увидите, что страница обработала данные и получила город. Вскрыв исходный код страницы, вы увидите, что там присутствует 2 надписи "Город: [город]": первая - в JS-скрипте, вторая - ниже. Для обрезания мы используем функцию strstr(), и, чтобы обрезать ПРАВИЛЬНО, сначала обрежем до места </IFRAME>, чтобы перейти ЗА надпись в JS-скрипте...
    19. */
    20. $data = strstr($data, "</IFRAME>");
    21. // А теперь непосредственно обрезаем от надписи "Город: "
    22. $data = strstr($data, "Город: ");
    23. /*
    24. Теперь посмотрите: третье обрезание присвоил другой переменной. Это нужно для того, чтобы после того, как обрезать второй раз, мы заменили ТАКУЮ ЖЕ оставшуюся часть в $data по образцу из $data2
    25. */
    26. $data2 = strstr($data, "<br>");
    27. // Производим удаление, о котором я говорил выше
    28. $data3 = str_replace($data2, "", $data);
    29. // Выводим полученный город на экран
    30. echo $data3;
    31. // А это про localhost, о котором говорилось выше
    32. } else {
    33. $data3 = "Неподходящий хост";
    34. }
    35. ?>
    Вот и всё. Кому надо - пользуйтесь :)

    Добавлено спустя 1 минуту 46 секунд:
    Найдете ошибку в синтаксисе - сообщите
    1) Исправил ошибку echo $data3;
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    в этот раз без десятка экзитов? а что ж так слабо? :D
     
  3. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    А зачем тут экситы? :) Здесь они не нужны) А там были нужны для того, чтобы лишних действий не совершилось, если письмо не отправится ;)
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    они НИГДЕ не нужны и используются только в примерах. Ну может еще при логауте.
     
  5. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Да я понял-понял) Это же пример. Никто из научных работников не выкладывают свои работы доконца... они вечно намудрят или упустят вещь... или напишут лишную штуку)
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    т.е. это была задумка такая? ну ладно тогда =)
     
  7. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
  8. nikitOScher

    nikitOScher Активный пользователь

    С нами с:
    19 дек 2011
    Сообщения:
    38
    Симпатии:
    0
    забыл
    Код (PHP):
    1. ; 
    =)
     
  9. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Ну это не принципиально)) Валидатор не придрется ;)
     
  10. nikitOScher

    nikitOScher Активный пользователь

    С нами с:
    19 дек 2011
    Сообщения:
    38
    Симпатии:
    0
    Ну да, ага. Это как бы вообще синтаксис у языка такой, точка с запятой обязательна.
    Я не знаю как у вас может работать без нее. Лично у меня во время теста этого кода вместо страницы просто был белый лист пока не поставил недостающий знак.
    PHP 5.3.3
     
  11. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    у меня 5.2 стоит...
     
  12. virginkoks

    virginkoks Активный пользователь

    С нами с:
    11 мар 2013
    Сообщения:
    1
    Симпатии:
    0
    вместо стр тыр тыр предлагаю:

    preg_match('/(?<=Город:\s)[А-Яа-яA-Za-z-]*(?=<)/', $data, $result);

    echo $result[0];
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    некрофил...
     
  14. makerseo

    makerseo Новичок

    С нами с:
    17 июл 2013
    Сообщения:
    5
    Симпатии:
    0
    Привет! мне как чайнику можно подсказать как написать продолжение к
    preg_match('/(?<=Город:\s)[А-Яа-яA-Za-z-]*(?=<)/', $data, $result);
    echo $result[0];
    Нужно: если $result равен Москва то открыть (лучше во фрейме) определенную страницу, а если равен любому другому городу то другую страницу.

    Все никак не могу сам дописать.
    Мне даже стыдно показать что я там написал))
     
  15. shelestov

    shelestov Активный пользователь

    С нами с:
    25 авг 2011
    Сообщения:
    148
    Симпатии:
    0
    Адрес:
    Россия, Арзамас
  16. makerseo

    makerseo Новичок

    С нами с:
    17 июл 2013
    Сообщения:
    5
    Симпатии:
    0
    Все намного проще.
    Есть страница с определенной инфой, когда на эту страницу заходит посетитель из Москвы он видит то-что нужно для жителя Москвы, если он с другого региона или страны там другая информация.
    Например: Для жителей Москвы на этой странице написано про "яблоко" а для всех жителей из других регионов про "грушу". ))) Вот
     
  17. makerseo

    makerseo Новичок

    С нами с:
    17 июл 2013
    Сообщения:
    5
    Симпатии:
    0
    Помогите, плз! ))
     
  18. Sofia

    Sofia Активный пользователь

    С нами с:
    25 сен 2008
    Сообщения:
    963
    Симпатии:
    2
    вообще пустой лист )
     
  19. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
     
  20. Sofia

    Sofia Активный пользователь

    С нами с:
    25 сен 2008
    Сообщения:
    963
    Симпатии:
    2
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Разговор энтов.
     
  22. nikolaevevge

    nikolaevevge Новичок

    С нами с:
    5 июл 2020
    Сообщения:
    15
    Симпатии:
    2