<MyRusakov.ru />

PHP и MySQL с Нуля до Гуру

PHP и MySQL с Нуля до Гуру

Данный курс - это более 20-ти часов видеоуроков по изучению PHP и MySQL. Ключевой момент курса - это создание движка для сайта с нуля. Каждая строчка комментируется. Практически для каждого урока имеются упражнения. Причём данные упражнения направлены не только на закрепление материала, но и на реализацию реальных задач, встающих перед Web-разработчиками при создании сайтов. После курса Вы сможете без проблем создавать движки для любых сайтов.

Также почти к каждому уроку идут упражнения для закрепления материала.

Просмотрев курс и выполнив упражнения, Вы сможете без проблем создавать функциональные движки для самых различных сайтов.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Определение страны по IP-адресу через БД

Определение страны по IP-адресу через БД

Пару месяцев назад я писал статью о том, как узнать страну пользователя по его IP-адресу. И ещё в той статье я указал основные минусы подхода, который там использовался. Если вдруг, кто забыл или не смотрел, то напомню. Там мы узнавали страну через сторонний сервис. Однако, как Вы понимаете, здесь имеется два больших минуса: зависимость от работы стороннего сервера (может быть, он исчезнет или просто отключится), а также постоянное изменение алгоритма парсинга при изменении вёрстки стороннего сервиса. Как Вы понимаете, второй минус - очень существенен. Так как Вы никогда заранее не знаете, когда сломается Ваш скрипт. Вот по этим двум причинам очень часто страну пользователя определяют по IP-адресу через собственную базу данных. Вот об этом способе мы и поговорим в этой статье.

Не буду долго тянуть и сразу приступлю к подробному описанию того, что Вам необходимо сделать:

  1. Скачайте архив c файлом, содержащим SQL-запрос, по этой ссылке: скачать соответствия IP-адресов и стран.
  2. Зайдите в PHPMyAdmin.
  3. Создайте базу данных.
  4. Импортируйте SQL-файл в созданную базу данных. Обратите внимание: SQL-файл достаточно большой, поэтому вполне вероятно Вам придётся изменить файл настроек интерпритатора PHP. В частности, увеличить значения следующих переменных (они все должны быть больше размера SQL-файла): "memory_limit", "post_max_size", "upload_max_filesize".

Так как база достаточно большая (более 100 000 записей), то в SQL-файл я решил добавить индекс для двух полей. Это значительно увеличело производительность. Вам ничего уже делать не надо, но чтобы Вы понимали в будущем, что если вдруг с базой данных происходят большие тормоза, то подумайте о добавлении индекса на некоторые поля.

А теперь привожу PHP-код, который позволит узнать страну посетителя по его IP-адресу через базу данных:

<?php
  $address = "localhost"; //Адрес базы данных
  $user = "root"; //Имя пользователя базы данных
  $password = ""; //Пароль пользователя
  $name_db = "mydb"; //Имя базы данных
  //Подключаемся к базе данных
  $db = new mysqli($address, $user, $password, $name_db);
  if (mysqli_connect_errno()) {
    echo "Ошибка подключения";
    exit();
  }
  $ip = "112.91.31.28"; //IP-адрес для проверки
  //Преобразуем IP-адрес в нужный нам формат
  $ip = sprintf("%u", ip2long($ip));
  //Делаем выборку
  $result_set = $db->query("SELECT `full_name` FROM `` WHERE ".$ip.">=`ip_from` AND ".$ip."<=`ip_to`");
  //Получаем результат выборки
  $row = $result_set->fetch_assoc();
  //Выводим результат
  echo "Страна - ".$row["full_name"];
?>

Здесь всё достаточно подробно прокомментировано, поэтому проблем с понимаем кода не должно возникнуть. Однако, хочется остановиться на описании двух функций:

  • ip2long($ip) - функция, которая преобразует привычный нам IP-адрес (то есть с точками) в сетевой адрес.
  • sprintf(string $format, mixed $string) - функция, которая преобразует заданную строку string к определённому формату format. Строка "format" состоит из ряда спецификаций конвертации. Не буду сейчас подробно это разбирать, так как на это потребуется отдельная статья, но в данном примере мы сообщаем, что наша строка - это десятиричное беззнаковое число целого типа (%u).

Если Вы всё сделали правильно, то подставляя в переменную ip какой-нибудь IP-адрес, Вы будете узнавать, какой стране он принадлежит. Всё бы было замечательно, однако, у этого способа также имеется один существенный недостаток: несмотря на большой размер таблицы, она не является полной, более того, совершенно неизвестно, что будет в будущем, и она может стать просто некорректной. И поэтому её надо время от времени обновлять. Обновлённые версии можно поискать в Интернете.

Теперь Вы знаете все доступные способы для того, чтобы узнать страну пользователя по IP-адресу. Каким способом пользоваться - решать только Вам, а свою задачу я выполнил.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (3):

sync.o sync.o 30.05.2011 11:26:17

Заинтересовала конструкция "or die()". Почему-то только она не прекращает выполнения скрипта, и сообщения о последующих ошибках продолжают выводиться. Может, может дело в Денвере или каких-то настройках?

Ответить

Admin Admin 30.05.2011 14:25:38

Данная конструкция с new mysqli() не работает. Статью подправил. А вообще что die(), что exit() работают одинаково - то есть прекращают выполнение скрипта.

Ответить

ido1 ido1 22.06.2016 09:58:53

У меня выдаёт ошибку Fatal error: Call to a member function fetch_assoc() on a non-object. Что делать?

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.