Как то гуляя в интернете наткнулся на интересную ссылку — Коды мобильных операторов. И очень мне захотелось иметь такую базу локально.
Под катом дамп 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=®ion=&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.