База мобильных операторов. Исправления.

16 комментариев

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

  1. nau

    Все поставил.

    Но на номера +79031234567 Выдает Resource id #5
    а на номер +79161234567 Выдает Resource id #8

    но это не Россия!?

    Можете пояснить сам sql запрос, пожалуйста.

    1. Дмитрий Амиров Автор

      Как это не россия? А что это по вашему?
      Нет, к сожалению, уже пояснить запрос не могу — не помню =(

      1. nau

        Спасибо за ответ.
        Да, номера России, но ответы
        Resource id #5 и Resource id #8 с Россией связи не имеют ни по одной из трех таблиц.
        Или я не верно трактую ответ функции?

        1. Дмитрий Амиров Автор

          Эм… Да, пожалуй вы не верно трактуете ответ функции. Результат функции нужно подставлять в mysql_fetch_array. А «Resource id #8» и «Resource id #5» это попытка привести ресурс запроса mysql к строковому виду.

  2. Андрей

    Ой красава. Как собирал данные? Пасил или ручной набор. И еще countries никак не связана с диапазонами. Поясни если я не прав. В countries еще должно быть полк кода страны допустим Россия — 7.

    В выписке по операторам России есть 999 перфиксы а в базе нету. Если не сложно не добавишь. У тебя же всеравно технология отработана. Очень надо. Можно списаться в личке, есть предложение.

    И еще по улучшению. Чем короче диапазон тем ниже приоритет выборки. Можно ввести поле order в зависимости от длинны, сделать сортировку результата по order, и ограничить выборку LIMIT 1. Тогда у тебя будет сразу ответ одним запросом. :)

    1. Дмитрий Амиров Автор

      Андрей, гляньте предыдущую статью «База мобильных операторов всего мира» там я писал откуда я спарсил данные.
      Насчет обновления и добавления новый префиксов, увы нет, я уже что к чему в этой БД. Поэтому вам прийдется разбираться самому.

  3. Роберт

    Не понимаю — зачем так сложно?
    Лет 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

    Тоесть посмотрели у каких строк совпал префикс, и из них выбрали один с самым длинным совпадением.

    По аналогии у вас в этой таблице было бы всего два поля: Префих и КодОператора.
    А у вас зачем-то куча дублирующихся полей, диапазоны, и ещё зачем-то много запросов.

    1. Дмитрий Амиров Автор

      Меня остановило от предложенного вами варианта, то что в результате такая таблица будет иметь огромное колличество строк.

      К примеру один оператор в какой то стороне имеет кучу префиксов. В моей БД эта куча максимальна ужата по диапазонам. А если сделать как предлагаете вы, то размер этой таблицы вырастет раз в 20-30. Тогда, когда я создавал этот пост, для меня это оказалось критичным) Хотя сейчас я бы сделал так как предлагаете вы.

  4. maxim

    Удивительная работа, распарсить вовремя то, что надо именно сейчас- это здорово.
    Срочно понадобился список операторов и вот он! Спасибо громаднющее, искал часов пять….
    но, есть некое артефакто…

    SELECT *
    FROM opsos_prefix
    JOIN opsos ON opsos.opsos_id = opsos_prefix.prefix_opsos_id
    WHERE opsos_prefix.prefix_country = '7'
    LIMIT 0 , 1000
    

    появляется Казахстан в первых рядах? Я не против, но разве так должно быть? ))

    1. maxim

      а вот так все отлично!!

      SELECT *
      FROM opsos_prefix
      JOIN opsos ON opsos.opsos_id = opsos_prefix.prefix_opsos_id
      WHERE opsos.opsos_country = 'RU'
      LIMIT 0 , 1000
      

      в общем, если это решение, то здорово, а если нет, может Вы поделитесь где можно взять данные, чтобы парсить их время от времени, для актуальности базы? Кстати в этой базе нет оператора CYTA у которого префикс 99 и код страны 357, если я не ошибаюсь…

      1. Дмитрий Амиров Автор

        Дружище, прости, но я делал эту базу давно, и уже непомню как она вообще выглядит. Помочь не смогу, попробуй разобраться сам.

        Откуда я ее парсил — посмотри в предыдущей статье, ссылка на нее в начале. Но там данные не обновляются по-моему.

        1. maxim

          Да, большое спасибо еще раз! И до предыдущей статьи добрался, откуда на самом деле и пришел в эту статью )) Все отлично, очень полезно! Очень приятно получить оперативный ответ от автора!

  5. Елена

    Здравствуйте.
    А как можно узнать какой длины должен быть номер целиком в каждой стране?
    Ведь получается, что для РФ можно ввести и 11 цифр и 12 цифр и будет корректно…

    1. Дмитрий Амиров Автор

      Чесно говоря, не знаю. Попробуйте погуглить. Если не ошибаюсь, номер может быть различной длины.

    1. Дмитрий Амиров Автор

      В запросе она может и не используется. Но она здесь для тех кому нужно сопоставление вида — «код — страна».

Добавить комментарий

Прочли запись? Понравилась? Не стесняйтесь, оставьте, пожалуйста, свой комментарий. Мне очень интересно, что вы думаете об этом. Кстати в комментарии вы можете задать мне любой вопрос. Я обязательно отвечу.

Вы можете оставить коментарий анонимно, для этого можно не указывать Имя и email. Все комментарии проходят модерацию, поэтому ваш комментарий появится не сразу.