База номеров по регионам на PHP


Возникла тут задача: написать API для партнерской программы. При этом в партнёрской программе принимается и обрабатывается номер телефона – как мобильный, так и стационарный. Необходимо было на PHP написать скрипт, который будет по номеру (коду) определять регион. Что ж надо – значит сделаем.

Сначала я решил задачу до смешного просто. Нашел сайт, который делает тоже самое (определяет оператора и регион по номеру) и стал слать ему запросы курлом – затем парсить ответы. Получился такой код:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://phonenum.info/phone/'.$phone);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parameters));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);

$html = str_get_html($result);
foreach($html->find('.itemprop_answer') as $element)  {
$region = $element->innertext;
$region = mb_substr($region, mb_strpos($region, "Регион: "));
$region = mb_substr($region, 8);
$region = mb_substr ($region, 0, mb_strrpos($region, "Местное время"));
$region = strip_tags ($region);

if ($region=="") $region = "Неизвестен";
} 
Ну реально код простейший. Шлем пост запрос, затем с помощью simple html dom парсим, немного обрезаем и получаем ответ в формате: Вологодская обл



Однако, заказчик совсем не обрадовался такому решению. В общем, его можно понять – зависеть от постороннего сайта не очень правильно, даже если сайт не собирается закрываться и не имеет защиты. Ладно, ищем другое решение. Собственно, оно только одно: нужна своя база и поиск по ней.

База нашлась. В формате страницы html, но это совсем не проблема. Распарсиваем и заносим её в таблицу:



Ну а остальное уже дело техники. Просто сравниваем коды, а оставшаяся часть чтобы входила в емкость (находилась между от и до):

$kod = mb_substr($phone,0,3);
$otdo = mb_substr($phone,3,9);

$result_tel = $conn->query("SELECT * FROM `region` WHERE `kod` = '".$kod."' AND  `ot` < '".$otdo."' AND  `do` > '".$otdo."'  ");
$row_tel = $result_tel->fetch_assoc();

$region = $row_tel["region"];

if ($region=="") $region = "Неизвестен";
Казалось бы, теперь задача решена. Однако, не совсем. В поле номер телефона человек же может указать и не мобильный, верно? То есть нужна аналогичная база для стационарных телефонов по определению региона.

Создаем почти аналогичную базу данных



А вот код будет немного другим.

$region = "Неизвестен";
$result_tel = $conn->query("SELECT * FROM `regiondom` ");
while ($row_tel = $result_tel->fetch_assoc()) {
$pos2 = false;
$pos2 = stripos($phone, $row_tel["kod"]);
if ($pos2 !== false) {
	if ($pos2==0) $region = $row_tel["region"];
		}
}
Здесь мы уже напротив, сравниваем код в базе, входит ли он в часть номера телефона. И обязательно чтобы он был в начале.

Все, задача решена. Если вам требуется запустить сервис на сайте (необязательно использующий номера телефонов), то вы можете обратиться ко мне. За небольшую сумму я вам с удовольствием помогу.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, php, базы данных, телефоны




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Вопросы и ответы на собеседовании PHP программиста
Движение круга в замкнутой плоскости на флеш as3
Преобразование числа в римские цифры на C#