【问题标题】:Use PHP to update MySQL records individually with outside JSON data使用 PHP 使用外部 JSON 数据单独更新 MySQL 记录
【发布时间】:2014-12-09 09:13:11
【问题描述】:

我正在尝试遍历一组包含用户 IP 的记录。我正在使用 freegeoip.net API 服务进行地理定位。在 users 表中,我存储了应用程序用户的 IP,现在我有兴趣通过调用 API 来单独更新所有记录,让它返回我使用 file_get_contents 获取的 JSON 内容,然后输入到 2基于键的字段(即城市、区域名称 AKA 州)。

从 API 返回的示例数据示例:http://freegeoip.net/json/

我基本上有 3 列:[ip]、[city]、[state]

我已经填充了 IP 数据。

下面是我的 PHP 代码的开始,它是我的 SELECT 方法的修改。现在我需要单独执行 UPDATE 查询。 file_get_contents 内部是 freegeoip 的 API URL。

<?php
$con=mysqli_connect("localhost","user","password","database");

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$result = mysqli_query($con,"SELECT * FROM user_log");

while($row = mysqli_fetch_array($result)) {
        $pageContent = file_get_contents('http://freegeoip.net/json/' . $row['ip']);
        $parsedJson  = json_decode($pageContent);
        echo "<br />The IP is: " . $row['ip'];
        echo "<br />The Location is: " . $parsedJson;
}

mysqli_close($con);
?>

问题:我将如何修改此代码以遍历每个 MySQL 记录(基于 IP 列)并更新从我的 API 收到的相关字段数据(城市和州)?

【问题讨论】:

  • 问题有点不清楚。你到底想达到什么目的?你想在某处存储 $parsedJson 数据吗?
  • 我更新了一个希望更清晰的问题。
  • $parsedJson 解码后是一个数组 - 因此要获取城市和州,您可以使用以下代码 $parsedJson['city'] $parsedJson['country_name'] 可以使用从 API 返回的任何其他值来获取您的值列表可以做print_r($parsedJson);

标签: php mysql json mysqli insert-update


【解决方案1】:
  • 循环访问您的 IP
  • 获取地理位置
  • 更新记录

$result = mysqli_query($con,"SELECT DISTINCT(`ip`) AS ip FROM user_log");

while($row = mysqli_fetch_array($result)) {
        $pageContent = file_get_contents('http://freegeoip.net/json/' . $row['ip']);
        $parsedJson  = json_decode($pageContent, true);
        echo "<br />The IP is: " . $row['ip'];
        echo "<br />The Location is: " . $parsedJson['city'];

        $strDbQuery = "UPDATE user_log SET city = ?, state = ? WHERE ip = ?";
        $objUpdate = mysqli_prepare($con, $strDbQuery);
        if($objUpdate) {
             mysqli_stmt_bind_param($objUpdate, 'sss', $parsedJson['city'], $parsedJson['region_name'], $row['ip']); 
             mysqli_stmt_execute($objUpdate);
        } else {
           echo "Cannot update for ip ". $row['ip'] . PHP_EOL;
        }

}
mysqli_close($con);

【讨论】:

  • 抱歉,他们使用“region_name”而不是“state”。谢谢你的回答。现在正在尝试。
  • 在我的回答中做出了改变。还在绑定和执行之前检查prepare 是否成功。还从表中获取了唯一的 ip。
  • 收到错误:PHP 致命错误:无法在第 17 行的 /var/www/localeupdate.php 中使用 stdClass 类型的对象作为数组,即“mysqli_stmt_bind_param.....”
  • 我的错。现在试试。我已将,true 添加到json_decode。 (我更喜欢json解码的数组方式)
  • 没问题。有效!非常感谢您的帮助。真的很有帮助。
【解决方案2】:
<?php
$con = mysqli_connect("localhost","user","password","database");

/* check connection */
if ($con->connect_errno) {
   die("Connect failed: " . $con->connect_error);
}

$result = $con->query("SELECT * FROM `user_log`");

while($row = $result->fetch_array()) {
    $pageContent = file_get_contents('http://freegeoip.net/json/' . $row['ip']);
    $parsedJson  = json_decode($pageContent);

    $stmt = $con->prepare("UPDATE `user_log` SET `city` = ?, `region_name` = ? WHERE `ip` = ?");
    $stmt->bind_param("sss", $parsedJson['city'], $parsedJson['region_name'], $row['ip']);
    $stmt->execute();
}
?>

【讨论】:

    猜你喜欢
    • 2017-08-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多