【问题标题】:How to update MySQL column with thousands of data in PHP automatically using json data如何使用 json 数据自动更新 PHP 中包含数千个数据的 MySQL 列
【发布时间】:2019-09-09 04:46:47
【问题描述】:

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

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 插入经纬度数据?

抱歉代码量太大,我尽量说清楚。

【问题讨论】:

  • utf8_encode 在数据库结果的上下文中? utf8_encode 最好不要使用。你知道它的作用吗?
  • 您的表中已经有 ip 地址,但您想更新洞表以使其每行都有带有 LAT 和 LNG 的 ip 地址,对吗?
  • MAZux 是的,没错!
  • Dharman 我用它来将 ISO-8859-1 标准解码为 utf-8 标准。这样就可以在应用程序的其他部分使用某个拉丁标准字符串(我的用户是拉丁美洲的 90%)。在这个 API 中,我将来会使用用户名,这样使用 'àáâääåæçèéêëìíîïñòóôõøùùùûûýýÿ 的人的名字不会变成 ( ) 我将不得不使用它。我有什么理由不应该使用它吗?
  • 不是从数据库中获取用户名和 ip,而是获取不同的 IP 地址。然后不是为每一行添加到数组中...调用您的 IP2Location 函数来获取值,然后在同一个循环中编写一个更新语句来更新 ip 是您获得的 ip 的表。

标签: php mysql json loops


【解决方案1】:

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

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

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

【讨论】:

  • 未来的读者:不要这样做!在循环中运行 sql 语句被认为是不好的做法
【解决方案2】:

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

搜索 crontab。 或 shell_exec

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

【讨论】:

    【解决方案3】:

    所以这里是获取不同(唯一)IP 地址并将它们传递给第二个函数以获取 Lat/Long 并更新数据库的函数。

    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
    }
    

    【讨论】:

      【解决方案4】:

      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;
      
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多