如何使用json数据自动使用PHP中的数千个数据更新MySQL列

时间:2019-04-18 19:55:01

标签: php mysql json loops

我有一个带有列的“用户”表:

Id | user_id | name | ip_address | lat | lng | active

“纬度”(lat)和“经度”(lng)列为空,我需要在其中填充大概的位置(我不需要精确的位置)。在另一个问题中,使用这个论坛,我发现我必须分开IP,并使用位置库。好。我创建了一个提取IP的函数,并将IP2Location库添加到了我的项目中。如果我将IP用作IP,获取经度和纬度,并在MySQL中一一添加,那么它会起作用,但是,我有125,000条记录,无法手动完成这项工作。 有人知道怎么做吗?

使用此功能

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;

}

我有以下json结果

{
     "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"
         }
     ]
}

我有这个脚本,可以根据IP给我纬度和经度

<?php
require_once './assets/libraries/vendor/ip2location/ip2location-php/IP2Location.php';

$reader = new \IP2Location\Database('./IP2LOCATION-LITE-DB9.BIN', \IP2Location\Database::FILE_IO);

$records = $reader->lookup('8.8.8.8', \IP2Location\Database::ALL);

echo '<pre>';
echo 'IP Number             : ' . $records['ipNumber'] . "\n";
echo 'Latitude              : ' . $records['latitude'] . "\n";
echo 'Longitude             : ' . $records['longitude'] . "\n";

?>

如何为每个IP自动插入纬度和经度数据?

对不起,代码量很大,我正在尝试尽可能的清楚。

4 个答案:

答案 0 :(得分:1)

因此,这里是获取唯一(唯一)IP地址并将其传递给第二个函数以获取纬度/经度并更新数据库的函数。

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

    $ips = mysqli_query($sqlConnect, "SELECT DISTINCT `ip_address` FROM " . T_USERS . " WHERE `active` = '1'");
    while ($fetched_data = mysqli_fetch_assoc($ips)) {
       ip2LocationAndUpdate($fetched_data["ip_address"]); //passing to other function
    }
}

全球性的东西

require_once './assets/libraries/vendor/ip2location/ip2location-php/IP2Location.php';
$reader = new \IP2Location\Database('./IP2LOCATION-LITE-DB9.BIN', \IP2Location\Database::FILE_IO);

执行IP2Location并更新sql的第二个功能

function ip2LocationAndUpdate($ip_address){
    global $sqlConnect, $reader;
    $records = $reader->lookup($ip_address, \IP2Location\Database::ALL);

    $updateSQL = "UPDATE " . T_USERS . " SET `lat` = '$records["latitude"]', `lat` = '$records["latitude"]' WHERE `ip_address` = '$ip_address'";

    //execute the sql with mysqli or whatever you are using
}

答案 1 :(得分:0)

如果要插入的行太多,我建议创建一个cron任务以在后台运行,它更快并且不会影响您的网站(如果有的话)

搜索crontab。 或shell_exec

然后,如果要显示进度,可以使用广播或推送器

答案 2 :(得分:0)

Nawed Khan的答案做了一些小的修改就解决了我的问题。 这是我目前运行100%的代码。 感谢大家的回答,这对我学习PHP语言非常有用。

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

    $ips = mysqli_query($sqlConnect, "SELECT DISTINCT `ip_address` FROM " . T_USERS . " WHERE `lat` = '0'");
    while ($fetched_data = mysqli_fetch_assoc($ips)) {
       ip2LocationAndUpdate($fetched_data["ip_address"]); //passing to other function
    }
}

 require_once 'assets/libraries/vendor/ip2location/ip2location-php/IP2Location.php';

 $reader = new \IP2Location\Database('IP2LOCATION-LITE-DB9.BIN', \IP2Location\Database::FILE_IO);

function ip2LocationAndUpdate($ip_address){
    global $sqlConnect, $reader;
    $records = $reader->lookup($ip_address, \IP2Location\Database::ALL);

     //execute the sql with mysqli or whatever you are using

    $latitu = $records['latitude'];
    $longitu = $records['longitude'];

    $updateSQL = mysqli_query($sqlConnect, "UPDATE " . T_USERS . " SET `lat` = '$latitu', `lng` = '$longitu' WHERE `ip_address` = '$ip_address'");


    return $updateSQL;


}

答案 3 :(得分:-2)

使用流动算法来解决您的问题

<?php
for($i=1;$i<125000;$i++)
{
 // here run what you want to do
}
?>

注意:如果您使用在线网站服务器,则在完成1000条记录后停止10秒钟