Как определить по IP-адресу город посетителя (GEO IP)

Определение города (географического положения) посетителя по его IP-адресу иногда бывает полезно для крупных проектов, порталов и, вообщем, везде, где требуется геотаргетинг. Собственно, чтобы что-то определить необходима база связей IP-город. До недавних пор нормальной и бесплатной базы в свободном доступе не было. Когда у меня возникла задача определения города посетителя я обратил свое внимание на руцентровский IpGeoBase. База постоянно пополняется и определяет город достаточно точно. Одно плохо – существующие примеры скриптов (для использования БД) на том же PHP какие-то тяжелые и неадекватные решаемой задаче :) . Пришлось немного преобразовать данные и написать свой скрипт:

  • собственно, SQL-дамп базы (MySQL).
  • скрипт, для определения города по IP-адресу (1 запрос к БД, входной параметр $dblink – результат, возвращаемый функцией mysql_connect):

    $dblink = mysql_connect('localhost', 'mysql_user', 'mysql_password');
    mysql_select_db('dbname');

    function geo_city_by_ip($dblink)
    {
    $ra = (isset($_SERVER['REMOTE_ADDR']))? $_SERVER['REMOTE_ADDR'] : '';
    if ($ra=='') return '';
    $ra = mysql_query("SELECT city, (ip2-ip1) as dst FROM geo WHERE INET_ATON('".$ra."')>=ip1 AND INET_ATON('".$ra."')<=ip2 ORDER BY dst ASC LIMIT 1", $dblink);
    if (mysql_num_rows($ra)>0)
    {
    $cn = mysql_fetch_array($ra);
    $cn = trim($cn['city']);
    }
    return $cn;
    }

Комментариев: 12

  1. Alex пишет:

    А насколько реальная БД?

  2. Николай Яровой пишет:

    По дате поста.

  3. Павел пишет:

    а где можно постоянно обновлять эту базу? Откуда-нибудь можно скачивать? В SQL.

  4. ksav пишет:

    В SQL-запросе «INET_ATON(‘».$ra.»‘)» лучше убрать, что сильно ускорит выборку.

    Само преобразование IP->long сделать до SQL-запроса:
    $IP = ip2long($ra);
    if ($IP < 0) $IP += pow(2,32);

    сам SQL-запрос будет выглядеть:
    SELECT city, (ip2-ip1) as dst FROM Geo WHERE ip1 =’$IP’ ORDER BY dst ASC LIMIT 1

    To Alex, Павел: – реальную БД легко скачать с офф. сайта GeoIP, занести её в MySQL дело 5 минут, тем более, что формат базы данных виден из SQL-дампа базы Николая (NickSpring).

    За идею «красивого» запроса к БД через «(ip2-ip1) as dst», спасибо, я сам как-то не догадался, что можно сделать так элементарно просто.

  5. Евгений пишет:

    А как сделать дам в SQL такой большой базы..!? У меня комп виснет, одним словом и в разы меньше дам не получается, а здесь говорите дело пяти минут …

  6. Николай Яровой пишет:

    Евгений, а Вы попробуйте не на экран дамп выводить, а послать в виде файла на скачку.

  7. Никита пишет:

    Здравствуйте
    А у вас нет дампа свежей базы?
    Было бы очень хорошо)

  8. SofTie пишет:

    ipgeobase.ru/cgi-bin/Archive_dop.cgi
    берем тут и всысываем, вот конвертилка в CSV:

  9. SofTie пишет:

    $handle = fopen(«./block_coord.db», «r»);
    $handle2 = fopen(«./block_coord_.db», «w»);
    while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    $buffer = str_replace(‘»‘, «‘», $buffer);
    $buffer = str_replace(‘ ‘, ‘»;»‘, $buffer);
    $buffer = str_replace(‘ – ‘, ‘»;»‘, $buffer);
    $buffer = trim($buffer);
    $buffer = ‘»‘.$buffer.’»‘;
    fwrite($handle2, $buffer.»\n»);
    }
    fclose($handle);
    fclose($handle2);
    echo «done!»;

  10. SEO Блог – оптимизация, раскрутка сайта. » Сервисы статистики на стороне интернет-магазинов пишет:

    [...] Как сделать определение страны/города по ip – здесь. [...]

  11. дядя вася пишет:

    А нахрена в конце запроса $dblink???

  12. дядя вася пишет:

    попробовал поставить параметр в запрос, и перестало работать.. данные неверные пишет …можа я чего низнамо.

Оставьте свой отзыв!