Как определить регион по 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 сайтом проблемы? нужен дополнительный функционал? нестандартный плагин или сверстать новую страницу?
Тогда напишите мне через форму обратной связи, и я постараюсь вам помочь.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *