Pull to refresh

Узнаем оператора и регион мобильного телефона

Reading time 4 min
Views 16K
image
Как то гуляя в интернете наткнулся на интересную ссылку — Коды мобильных операторов. И очень мне захотелось иметь такую базу локально.
Под катом дамп mysql базы, php код для её использования и скрипт парсер для обновления.

Для начала надо скачать базу.
После чего можно получать данные из базы примерно так:

<?php
$config['mysql_host'] = 'localhost';
$config['mysql_user'] = 'root';
$config['mysql_password'] = '';
$config['mysql_base'] = 'smsprice';

define("PREFIX","mtt_");

$mysql = new mysqli($config['mysql_host'],$config['mysql_user'],$config['mysql_password'],$config['mysql_base']);
$mysql->query("SET NAMES 'cp1251'");

$number = '+7(910)89-480-23';

$number = preg_replace('/[^0-9]+/','',$number);

if (strlen($number) == 11) {
  $number = substr($number,1);
}

if (strlen($number) == 10) {
  $def = substr($number,0,3);
  $code = substr($number,3);
  $stmt = $mysql->stmt_init();
  $stmt->prepare(
    'SELECT regions.name AS region, operators.name AS operator '.
    'FROM `'.PREFIX.'codes` AS codes '.
    'INNER JOIN `'.PREFIX.'regions` AS regions ON regions.id = codes.region '.
    'INNER JOIN `'.PREFIX.'operators` AS operators ON operators.id = codes.operator '.
    'WHERE `def` = ? '.
    'AND ? < `to` '.
    'AND ? > `from`'
  );
  $stmt->bind_param("iii", $def, $code, $code);
  $stmt->execute();
  $stmt->bind_result($region, $operator);
  while ($stmt->fetch()) {
    echo "Регион — ".htmlspecialchars($region)."<br/>\r\n";
    echo "Оператор — ".htmlspecialchars($operator)."<br/>\r\n";
  }
  $stmt->close();
} else {
  echo 'Ошибка: неправильный формат номера';
}
?>


* This source code was highlighted with Source Code Highlighter.

Я не уверен на счет скорости запросов и структуры базы, так что если кто то посоветуют как правильней можно сделать — буду очень благодарен.
Если не хочется мучиться с заливкой базой и php то посмотреть как работает можно тут.

UPD:
По просьбам трудящихся код парсера для обновления базы с mtt:

<?php
set_time_limit(0);

$config['mysql_host'] = 'localhost';
$config['mysql_user'] = 'root';
$config['mysql_password'] = '';
$config['mysql_base'] = 'smsprice';

define("PREFIX","mtt_");

$mysql = new mysqli($config['mysql_host'],$config['mysql_user'],$config['mysql_password'],$config['mysql_base']);
$mysql->query("SET NAMES 'cp1251'");

$regxp = '#'.
  '<tr>\s*'.
  '<td abbr=".*">(.*)</td>\s*'.
  '<td abbr=".*">(.*)</td>\s*'.
  '<td abbr="">(.*)</td>\s*'.
  '<td abbr="(.*)" align="right">\s*'.
  '.*'.
  '<td abbr="(.*)"><nobr>.*</nobr></td>\s*'.
  '</tr>'.
'#isU';

$page = file_get_contents('http://mtt.ru/info/def/index.wbp?def=&number=&region=&standard=&date=&operator=');
preg_match_all($regxp,$page,$result);

$mysql->query('TRUNCATE TABLE `'.PREFIX.'codes`');

for ($i=0,$l=count($result[0]);$i<$l;$i++) {
  $operator = $result[1][$i];
  $region = $result[2][$i];
  $def = $result[3][$i];
  list($range_from,$range_to) = explode("-",$result[4][$i]);
  $range_from = substr($range_from,3);
  $range_to = substr($range_to,3);
  $date = str_replace(".","-",$result[5][$i]);
  
  $stmt = $mysql->stmt_init();
  $stmt->prepare("SELECT id FROM ".PREFIX."operators WHERE name=?");
  $stmt->bind_param("s", $operator);
  $stmt->execute();
  $stmt->store_result();
  
  if ($stmt->num_rows > 0) {
    $stmt->bind_result($operator);
    $stmt->fetch();
    $stmt->close();
  } else {
    $stmt->close();
    $stmt = $mysql->stmt_init();
    $stmt->prepare("INSERT INTO ".PREFIX."operators VALUES ('', ?)");
    $stmt->bind_param("s", $operator);
    $stmt->execute();
    $operator = $stmt->insert_id;
    $stmt->close();
  }
  
  $stmt = $mysql->stmt_init();
  $stmt->prepare("SELECT id FROM ".PREFIX."regions WHERE name=?");
  $stmt->bind_param("s", $region);
  $stmt->execute();
  $stmt->store_result();
  
  if ($stmt->num_rows > 0) {
    $stmt->bind_result($region);
    $stmt->fetch();
    $stmt->close();
  } else {
    $stmt->close();
    $stmt = $mysql->stmt_init();
    $stmt->prepare("INSERT INTO ".PREFIX."regions VALUES ('', ?)");
    $stmt->bind_param("s", $region);
    $stmt->execute();
    $region = $stmt->insert_id;
    $stmt->close();
  }
  
  $stmt = $mysql->stmt_init();
  $stmt->prepare("INSERT INTO ".PREFIX."codes VALUES ('', ?, ?, ?, ?, ?, ?)");
  $stmt->bind_param("iiiiis", $operator, $region, $def, $range_from, $range_to, $date);
  $stmt->execute();
  $stmt->close();
}
?>


* This source code was highlighted with Source Code Highlighter.
Tags:
Hubs:
+54
Comments 57
Comments Comments 57

Articles