Как определить по 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;
}



25 Июль 2008 в 13:03
А насколько реальная БД?
29 Июль 2008 в 8:44
По дате поста.
6 Август 2008 в 10:08
а где можно постоянно обновлять эту базу? Откуда-нибудь можно скачивать? В SQL.
17 Сентябрь 2008 в 16:44
В 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», спасибо, я сам как-то не догадался, что можно сделать так элементарно просто.
8 Март 2009 в 2:22
А как сделать дам в SQL такой большой базы..!? У меня комп виснет, одним словом и в разы меньше дам не получается, а здесь говорите дело пяти минут …
12 Март 2009 в 9:31
Евгений, а Вы попробуйте не на экран дамп выводить, а послать в виде файла на скачку.
20 Май 2009 в 21:06
Здравствуйте
А у вас нет дампа свежей базы?
Было бы очень хорошо)
25 Май 2009 в 11:08
ipgeobase.ru/cgi-bin/Archive_dop.cgi
берем тут и всысываем, вот конвертилка в CSV:
25 Май 2009 в 11:08
$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!»;
18 Июль 2009 в 17:19
[...] Как сделать определение страны/города по ip – здесь. [...]
23 Август 2009 в 23:46
А нахрена в конце запроса $dblink???
23 Август 2009 в 23:52
попробовал поставить параметр в запрос, и перестало работать.. данные неверные пишет …можа я чего низнамо.