Як визначити регіон IP на PHP використовуючи БД

Як визначити регіон IP на PHP використовуючи БД

У цій статті розглянемо один із варіантів визначення локації користувача за його IP-адресою. А саме — з використанням існуючої бази регіонів та присвоєних їм IP-адрес мережі.

Існуючих баз даних доволі багато. Але мені довелося мати справу з базою від сайту ip2location.com. Нічого поганого про цю базу сказати не можу, оскільки моя область і регіони деяких моїх клієнтів були успішно знайдені.

Перше, що нам знадобиться — це завантажити файл з базою даних. Вони надають його у форматі 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 були знайдені в інтернеті. У коді вище відсутнє підключення до бази даних, тому не слід бездумно копіювати його без адаптації.

Пости на схожі теми

З вашим WordPress сайтом проблеми? потрібний додатковий функціонал? нестандартний плагін чи згорнути нову сторінку?
Тоді напишіть мені через форму зворотного зв'язку, і я намагатимусь вам допомогти.

Напишіть коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *