ФорумПрограммированиеПыхнуть хотите?Готовые решения → Geo Country - Определение страны по IP

Geo Country - Определение страны по IP

  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2009 г. 14:40

    Мля, расстроился что база не совсем точная и полная. Даже не захотелось код к нормальному виду приводить =(
    Более полная стоит 50$.

    но всеже, мож кому пригодиться
    function geo_ip($IP)
    {
    // проверяем формат переменной
    if(preg_match("#^([0-9]{0,3})\.([0-9]{0,3})\.([0-9]{0,3})\.([0-9]{0,3})$#",$IP))
    {
    // преобразовываем IP в число необходимым способом
    list($w,$x,$y,$z)=explode(".",$IP);
    $ip_num = 16777216*$w + 65536*$x + 256*$y + $z;

    // ищем соответствие
    $sql=mysql_query("SELECT * FROM Geo WHERE {$ip_num} >=ip_start_num AND {$ip_num} <= ip_end_num LIMIT 1");
    $row=mysql_fetch_assoc($sql);

    //возвращаем результат
    return $row;
    }

    return false;
    }
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 14:43, спустя 2 минуты 47 секунд


    Мля, расстроился что база не совсем точная и полная. Даже не захотелось код к нормальному виду приводить =(
    Более полная стоит 50$.

    но всеже, мож кому пригодиться
    function geo_ip($IP)
    {
    // проверяем формат переменной
    if(preg_match("#^([0-9]{0,3})\.([0-9]{0,3})\.([0-9]{0,3})\.([0-9]{0,3})$#",$IP))
    {
    // преобразовываем IP в число необходимым способом
    list($w,$x,$y,$z)=explode(".",$IP);
    $ip_num = 16777216*$w + 65536*$x + 256*$y + $z;

    // ищем соответствие
    $sql=mysql_query("SELECT * FROM Geo WHERE {$ip_num} >=ip_start_num AND {$ip_num} <= ip_end_num LIMIT 1");
    $row=mysql_fetch_assoc($sql);

    //возвращаем результат
    return $row;
    }

    return false;
    }

    мудак мудака видит из далека.

    http://hell.phpdude.ru/archives/59

    поюзай это полюбишь ;)
    Сапожник без сапог
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2009 г. 14:47, спустя 4 минуты 32 секунды

    Я читал, но мне это

    Просматриваю тут БД от http://www.maxmind.com… хм, не все диапазоны с 0 начинаются
    4.20.73.16,”4.20.73.31″,”68438288″,”68438303″,”CA”,”Canada”
    4.20.73.32,”4.23.128.183″,”68438304″,”68649143″,”US”,”United States”
    4.23.128.184,”4.23.128.191″,”68649144″,”68649151″,”CA”,”Canada”

    не понравилось
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2009 г. 14:48, спустя 36 секунд

    А вот базу посмотрю, мож получше =)
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 14:49, спустя 57 секунд


    А вот базу посмотрю, мож получше =)
    можешь поучавствовать ;)

    собрать базу получше. от меня только метод хранения и работы с базой важен, остальное - мелочи :)
    Сапожник без сапог
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2009 г. 14:52, спустя 3 минуты 25 секунд

    Так в том то и дело что метод не совсем точный
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 14:55, спустя 2 минуты 27 секунд


    Так в том то и дело что метод не совсем точный
    а ты пробовал разбить в блоки поменьше? по 16 ипов к примеру? ;) ведь 31 = 0-15, 16-31 блок. то бишь по 16 - второй блок. а вообще тут анализировать надо и смотреть чо да каг. если конечно задача интересна в теоретическом плане))) а на мускуль такие выборки класть - надо выпороть этих программистов
    Сапожник без сапог
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2009 г. 15:03, спустя 8 минут 9 секунд

    тоды, 2 вопроса:
    как твою базы в Mysql засунуть?
    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 15885918 bytes) in S:\home\localhost\www\Tools\phpmyadmin\libraries\sqlparser.lib.php on line 101


    и намного сильней отличается

    "SELECT * FROM Geo WHERE {$ip_num} >=ip_start_num AND {$ip_num} <= ip_end_num LIMIT 1"

    от

    "SELECT * FROM Geo WHERE {$ip_num} =ip_num LIMIT 1"

    ?
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 22:31, спустя 7 часов 28 минут 28 секунд

    http://www.cn-software.com/ru/cngeoip/
    http://geoiptool.com/
    http://www.ip2city.ru/
    http://rmcreative.ru/blog/post/ipgeobase

    http://ipgeobase.ru/
    и обрати внимание на архивы баз http://ipgeobase.ru/cgi-bin/Archive.cgi
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 30 апреля 2009 г. 1:34, спустя 3 часа 2 минуты 23 секунды

    Спасибо конечно, но все это уже видел.
    Не подходять по разным причинам.
    Платная, только россия, не полные версии, хочется не лазить за инфой на другие саййты, а иметь свою базу. и. т. д
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 12 мая 2009 г. 18:33, спустя 12 дней 16 часов 58 минут

    Вопрос про оптимизацию =)

    "SELECT * FROM Geo WHERE {$ip_num} >=ip_start_num AND    {$ip_num} <= ip_end_num LIMIT 1"
    если я столбцы ip_start_num и ip_end_num индексами сделаю, то насколько увеличется скорость обработки данных и насколько увеличется вес базы (хотябы примерно предположите) если в базе 200 000 записей
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 12 мая 2009 г. 18:37, спустя 4 минуты 7 секунд


    Вопрос про оптимизацию =)

    "SELECT * FROM Geo WHERE {$ip_num} >=ip_start_num AND    {$ip_num} <= ip_end_num LIMIT 1"
    если я столбцы ip_start_num и ip_end_num индексами сделаю, то насколько увеличется скорость обработки данных и насколько увеличется вес базы (хотябы примерно предположите) если в базе 200 000 записей
    ответ про оптимизация - для такой задачи не используй бд СОВСЕМ
    Сапожник без сапог
  • ubica

    Сообщения: 530 Репутация: N Группа: Кто попало

    Spritz 12 мая 2009 г. 18:52, спустя 15 минут 40 секунд

    Professor, если 200,000 записей, то на размер бд похуй

    WHERE {$ip_num} >=ip_start_num AND {$ip_num} <= ip_end_num

    не слыхал про BETWEEN?
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 12 мая 2009 г. 18:53, спустя 47 секунд

    Лучше xml файл парсить? или как? Обьясни мне  глупому как поступить?
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 12 мая 2009 г. 18:55, спустя 1 минуту 27 секунд


    не слыхал про BETWEEN?

    он же вроде как поле сравнивает с 2 значениями, а мне наоборот, значение с 2 полями сравнить надо.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!