Недавно я выкладывал спаршенную мной Базу мобильных операторов всего мира. Но так как мне, как и любому человеку свойственно ошибаться, я немного накосячил с кодами и префиксами Казахстана (спасибо некоему Isis за то что указал на эти ошибки).
Ну и также поступило предложение добавить в базу российские префиксы (они и были раньше, но вот только не совсем детализированные, и многие диапазоны пересекались). И еще немного изменил формат базы (разбил на разные таблицы).
Вообщем теперь в БД хорошая детализация по России, так что для каждого номера будет опеределятся конкретный оператор, а не список возможных.
Структура
countries— таблица соответствия сокращения и полных названий стран
- short — двубуквенное сокращение страны
- full_rus — полное название на русском
- full_eng — полное название на английском
opsos— таблица с описанием операторов
- opsos_country — сокращенное название страны оператора
- opsos_name — имя оператора
- opsos_keywords — «дополнительные» имена оператора
- opsos_image — имя картинки-логотипа оператора
opsos_prefix— таблица с описанием всех сотовых префиксов
- prefix_country — телефонный код
- prefix_def — Def-код
- prefix_range_start — начало диапазона префиксов
- prefix_range_end — конец диапазона префиксов
- prefix_opsos_id — ID оператора из таблизы opsos
Поиск оператора
Так как теперь введено понятие диапазона префиксов, то теперь необходимо немножно изменить функцию поиска по телефонному номеру:
function GetOpsosByNumber($number){
$number=preg_replace('#[^\d]#', '', $number);
for($i=8; $i>=3; $i--){
$tmp=substr($number, 0, $i);
$data=mysql_query('SELECT * FROM `opsos_prefix` LEFT JOIN `opsos` ON `opsos`.`opsos_id`=`opsos_prefix`.`prefix_opsos_id` WHERE \''.$tmp.'\' BETWEEN `prefix_range_start` AND `prefix_range_end`');
if(mysql_num_rows($data)){
return $data;
}
}
return null;
}
Как видите изменился только запрос к БД.
Скачать
Дамп БД: opsoses.sql.zip (54 кб)
Архив с картинками: opsos.images.rar (667 кб)
PS: в архив с картинками добавленна 1 новая картинка.
Все поставил.
Но на номера +79031234567 Выдает Resource id #5
а на номер +79161234567 Выдает Resource id #8
но это не Россия!?
Можете пояснить сам sql запрос, пожалуйста.
Как это не россия? А что это по вашему?
Нет, к сожалению, уже пояснить запрос не могу — не помню =(
Спасибо за ответ.
Да, номера России, но ответы
Resource id #5 и Resource id #8 с Россией связи не имеют ни по одной из трех таблиц.
Или я не верно трактую ответ функции?
Эм… Да, пожалуй вы не верно трактуете ответ функции. Результат функции нужно подставлять в mysql_fetch_array. А «Resource id #8» и «Resource id #5» это попытка привести ресурс запроса mysql к строковому виду.
Ой красава. Как собирал данные? Пасил или ручной набор. И еще countries никак не связана с диапазонами. Поясни если я не прав. В countries еще должно быть полк кода страны допустим Россия — 7.
В выписке по операторам России есть 999 перфиксы а в базе нету. Если не сложно не добавишь. У тебя же всеравно технология отработана. Очень надо. Можно списаться в личке, есть предложение.
И еще по улучшению. Чем короче диапазон тем ниже приоритет выборки. Можно ввести поле order в зависимости от длинны, сделать сортировку результата по order, и ограничить выборку LIMIT 1. Тогда у тебя будет сразу ответ одним запросом. :)
Андрей, гляньте предыдущую статью «База мобильных операторов всего мира» там я писал откуда я спарсил данные.
Насчет обновления и добавления новый префиксов, увы нет, я уже что к чему в этой БД. Поэтому вам прийдется разбираться самому.
Не понимаю — зачем так сложно?
Лет 10 назад тоже делал для одной гостинницы систему оплаты международных звонков.
Телефон состоит из Код страны + Код оператора или региона, в результет имеем таблицу:
Prefix — Strana — Cena
7840 — абхазия — 1$
7940 — абхазия — 1$
76 — казахстан — 1$
77 — казахстан — 1$
7 — Россия — 2$
7929 — южная осетия — 3$
7995344 — южная осетия — 3$
и одним запросом выясняем что у нас за цена разговора:
select * from Table where ‘79291111’ like CONCAT(Prefix,’%’) order by length(Prefix) DESC limit 1
Тоесть посмотрели у каких строк совпал префикс, и из них выбрали один с самым длинным совпадением.
По аналогии у вас в этой таблице было бы всего два поля: Префих и КодОператора.
А у вас зачем-то куча дублирующихся полей, диапазоны, и ещё зачем-то много запросов.
Меня остановило от предложенного вами варианта, то что в результате такая таблица будет иметь огромное колличество строк.
К примеру один оператор в какой то стороне имеет кучу префиксов. В моей БД эта куча максимальна ужата по диапазонам. А если сделать как предлагаете вы, то размер этой таблицы вырастет раз в 20-30. Тогда, когда я создавал этот пост, для меня это оказалось критичным) Хотя сейчас я бы сделал так как предлагаете вы.
Удивительная работа, распарсить вовремя то, что надо именно сейчас- это здорово.
Срочно понадобился список операторов и вот он! Спасибо громаднющее, искал часов пять….
но, есть некое артефакто…
появляется Казахстан в первых рядах? Я не против, но разве так должно быть? ))
а вот так все отлично!!
в общем, если это решение, то здорово, а если нет, может Вы поделитесь где можно взять данные, чтобы парсить их время от времени, для актуальности базы? Кстати в этой базе нет оператора CYTA у которого префикс 99 и код страны 357, если я не ошибаюсь…
Дружище, прости, но я делал эту базу давно, и уже непомню как она вообще выглядит. Помочь не смогу, попробуй разобраться сам.
Откуда я ее парсил — посмотри в предыдущей статье, ссылка на нее в начале. Но там данные не обновляются по-моему.
Да, большое спасибо еще раз! И до предыдущей статьи добрался, откуда на самом деле и пришел в эту статью )) Все отлично, очень полезно! Очень приятно получить оперативный ответ от автора!
Здравствуйте.
А как можно узнать какой длины должен быть номер целиком в каждой стране?
Ведь получается, что для РФ можно ввести и 11 цифр и 12 цифр и будет корректно…
Чесно говоря, не знаю. Попробуйте погуглить. Если не ошибаюсь, номер может быть различной длины.
Судя по твоему запросу, таблица countries вообще не используется
В запросе она может и не используется. Но она здесь для тех кому нужно сопоставление вида — «код — страна».