Заполните Широту и Долготу в базе данных от IP пользователя - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть таблица "users" со столбцами:

Id | user_id | name | ip_address | lat | lng

Столбец id, user_id, name и ip_address уже заполнены и теперь имеют 100 тыс. Пользователей. Колонки lat (широта) и lng (долгота) теперь созданы, и мне нужно, чтобы они были заполнены с IP (вы не можете получить геолокацию пользователя). Мне не нужно точное местоположение, просто приблизительное местоположение, поэтому мне нужен скрипт, который собирает IP-адрес каждого пользователя, каким-то образом извлекает широту и долготу и вставляет в базу данных.

Я смотрел на "http://www.geoplugin.net/xml.gp?ip=" и" http://ip -api.com / json /", но я не знаю, как использовать API для 100k пользователей, ни PHP, ни MySQL код или оболочка для этого.

Я использую только PHP, MySQLi с базой данных MySQL. Приложение отобразит список пользователей "поблизости" (в радиусе 100 миль).

Извините, я очень плохо знаком с программированием и действительно не знаю, как решить эту проблему.

Edit:

Я только что создал API, который возвращает мне все user_id и соответствующие им IP-адреса в массиве. Просто быть 105 тысячами записей, потому что это был json, это было легко, но я не хотел делиться здесь публично, потому что это было бы то же самое, что объяснять данные моих пользователей. результат API выглядит примерно так:

{
     "api_status": 200,
     "ips": [
         {
             "user_id": "1",
             "ip_address": "177.198.86.7x"
         },
         {
             "user_id": "21",
             "ip_address": "177.18.246.9x"
         },
         {
             "user_id": "52",
             "ip_address": "177.36.60.1x"
         }
     ]
}

Я использую следующую функцию, чтобы вернуть мои данные в php

function List_ip() {
    global $sqlConnect, $db;
    if ($db['loggedin'] == false) {
        return false;
    }

    $ips = mysqli_query($sqlConnect, "SELECT `user_id` , `ip_address` FROM " . T_USERS . " WHERE `active` = '1'");
    while ($fetched_data = mysqli_fetch_assoc($ips)) {
     $list_ip[] = array_map('utf8_encode', $fetched_data); 
    }    

   return $list_ip;

}

Ответы [ 4 ]

0 голосов
/ 16 апреля 2019

Вы можете легко использовать PHP-модуль IP2Location по адресу https://www.ip2location.com/development-libraries/ip2location/php, который бесплатный.

Чтобы установить, добавьте следующую строку в ваш файл composer.json.

{
  "require": {
    "ip2location/ip2location-php": "8.*"
  }
}

Запустите команду:

composer install

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

require 'vendor/autoload.php';

Вам понадобится база данных DB5.LITE, которую вы можете бесплатно скачать по адресу https://lite.ip2location.com/

Пример использования модуля PHP

<code><?php
require 'IP2Location.php';

$myip = '8.8.8.8';

$db = new \IP2Location\Database('./database/IP-COUNTRY-SAMPLE.BIN', \IP2Location\Database::FILE_IO);

$records = $db->lookup($myip, \IP2Location\Database::ALL);

echo '<pre>';
echo 'IP Address            : ' . $records['ipAddress'] . "\n";
echo 'Country Code          : ' . $records['countryCode'] . "\n";
echo 'Country Name          : ' . $records['countryName'] . "\n";
echo 'Region Name           : ' . $records['regionName'] . "\n";
echo 'City Name             : ' . $records['cityName'] . "\n";
echo 'Latitude              : ' . $records['latitude'] . "\n";
echo 'Longitude             : ' . $records['longitude'] . "\n";
echo '
'; ?>
0 голосов
/ 15 апреля 2019

Для того, что вы запрашиваете, требуются промежуточные навыки работы с PHP, MySQL и т. Д. Я сделал много подобных вещей и скажу вам, что для получения точной информации о IP-адресе GEO вам придется использовать javascript или оплатить услугу (из моих выводов).Например, у www.maxmind.com есть бесплатные и платные, оплата немного лучше.

Я бы попробовал написать скрипт, который читает все пользователи из базы данных в цикле, затемСкачайте GeoIP или используйте API, чтобы взять поля IP и вернуть Lat / Lon.Затем, наконец, добавьте шаг, который записывает его обратно в БД.

Очень грубый пример:

// build a class or function that looks up IP addresses (can be local)
$geoip2 = new GeoIp2Lookup(true);

// get all users from DB
$allUsersArray = function_results_db_lookup_users();

// get the users lat/lon
for ($i=0; $i<count($allUsersArray); $i++) {
  $record = $geoip2->getGeoDataArr($allUsersArray[$i]['ip_address']);
  $allUsersArray[$i]['lat'] = $record['lat'];
  $allUsersArray[$i]['lon'] = $record['lon'];
}

// now write a function to place in DB the new data
update_users_db($allUsersArray);
0 голосов
/ 15 апреля 2019

maxmind / GeoIP2-php должен получить то, что вам нужно.

Установите его и загрузите файл GeoIP2-City.mmdb .

Чем просто инициировать его:

$record = new Reader('path/to/GeoLite2-City.mmdb');

и чтение данных из него, таких как:

$city = $record->city->name;
$latitude = $record->location->latitude;
$longitude = $record->location->longitude;

Выполнение этого будет означать нулевую зависимость от сторонних ограничений API.

0 голосов
/ 15 апреля 2019

У меня нет особого представления об ограничении количества запросов, но попробуйте следующий код, чтобы получить подробности из ip-api.

    $url = "http://ip-api.com/batch";

$headers = array('Content-Type: application/json');

$fields = '[{"query": "208.80.152.201"}, // You can add multiple IP address in the same format.
  {"query": "8.8.8.8"},
  {"query": "24.48.0.1"}]';


$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields);
$httpCode = curl_getinfo($curl , CURLINFO_HTTP_CODE); 
$response = curl_exec($curl);

if ($response === false) 
    $response = curl_error($curl);

  foreach(json_decode($response) as $value){


    echo $value->lat; //Use the result to store the information in DB
  }



curl_close($curl);

Обратитесь к их документации , чтобы получить представление о данных, возвращаемых их API.

Также для ограничения попробуйте это решение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...