У цій статті розглянемо один із варіантів визначення локації користувача за його IP-адресою. А саме — з використанням існуючої бази регіонів та присвоєних їм IP-адрес мережі.
Існуючих баз даних доволі багато. Але мені довелося мати справу з базою від сайту . Нічого поганого про цю базу сказати не можу, оскільки моя область і регіони деяких моїх клієнтів були успішно знайдені.
Перше, що нам знадобиться — це завантажити файл з базою даних. Вони надають його у форматі CSV. Завантажити файл можна з цієї сторінки.
Імпорт даних з файлу регіонів та IP
Дотримуйтесь інструкції в описі — це зекономить вам час. Я спочатку вирішив спробувати імпортувати дані через phpMyAdmin (використовуючи імпорт CSV), і це зайняло набагато більше часу, ніж консольний імпорт.
Продублюю на всякий випадок код. Створюємо базу даних і таблицю з локаціями:
CREATE DATABASE ip2location; USE ip2location; CREATE TABLE `ip2location_db11`( `ip_from` INT(10) UNSIGNED, `ip_to` INT(10) UNSIGNED, `country_code` CHAR(2), `country_name` VARCHAR(64), `region_name` VARCHAR(128), `city_name` VARCHAR(128), `latitude` DOUBLE, `longitude` DOUBLE, `zip_code` VARCHAR(30), `time_zone` VARCHAR(8), INDEX `idx_ip_from` (`ip_from`), INDEX `idx_ip_to` (`ip_to`), INDEX `idx_ip_from_to` (`ip_from`, `ip_to`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Імпортуємо дані (до речі, це можна зробити і через phpMyAdmin, вказавши повний шлях до CSV-файлу):
LOAD DATA LOCAL INFILE 'IP2LOCATION-LITE-DB11.CSV' INTO TABLE `ip2location_db11` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 'rn' IGNORE 0 LINES;
Визначення локації користувача за його IP
У прикладі нижче я перейменував таблицю «ip2location_db11» на «ip2location_v4». Лістинг коду:
$ip_user = '195.208.131.1'; /* Росія, Новосибірськ */ $ip_user = '5.101.112.0'; /* Естонія */ $sql = 'SELECT * FROM `ip2location_v4` WHERE "'.ip2long($ip_user).'" BETWEEN `ip_from` AND `ip_to` LIMIT 1'; $Result = mysqli_query($DB, $sql); $Data = mysqli_fetch_assoc($Result); echo "<pre dir='ltr'>";print_r($Data); echo "</pre>";
Де:
ip2long() — функція, що конвертує рядок з IPv4-адресою у ціле число.
Приклади IP були знайдені в інтернеті. У коді вище відсутнє підключення до бази даних, тому не слід бездумно копіювати його без адаптації.
