【问题标题】:Insert into MySQL db occurs twice in a loop插入 MySQL 数据库在循环中发生两次
【发布时间】:2015-08-03 12:31:14
【问题描述】:

我目前正在构建一个小型网站,以从 mysql 数据库中检索计算机游戏的玩家统计数据并在线显示。

我从第三方 API 获取玩家列表的玩家统计信息,并尝试将它们插入数据库中的表中。但是我的代码执行了两次插入 - 表上的主键限制阻止重复条目,但我不想接受这一点。

我的循环逻辑出了点问题,但我正在自己的循环中尝试解决这个问题。

事件的顺序是:

  1. 我查询我的数据库以获取 API 调用所需的玩家 ID
  2. 我把这些放在一个数组中
  3. 我循环查询第三方 api 以获取所有玩家统计信息
  4. 我想将统计数据(每个玩家 1 行)插入我的数据库(我计划转义字符串等,这是一项正在进行的工作)

    if ($result->num_rows > 0) {
    
    while($row = $result->fetch_assoc()) {
        $member_data[] = $row;
    }
    
    foreach ($member_data as $id) {
    
    $endpoint =  "http://www.bungie.net/Platform/Destiny/Stats/2/".$id[destiny_membership_id]."/".$id[destiny_character_id]."/";
    
    $bungie_result = hitBungie($endpoint);
    $response = json_decode($bungie_result, true);
    
    $destiny_membership_id = $id[destiny_membership_id];
    $destiny_character_id = $id[destiny_character_id];
    $kills_deaths_ratio = $response[Response][allPvP][allTime][killsDeathsRatio][basic][displayValue];
    
    // DB insert
    $sql = "INSERT INTO xax_pvp_stats (destiny_membership_id,destiny_character_id,kills_deaths_ratio) ";
    $sql .= "VALUES ('$destiny_membership_id','$destiny_character_id','$kills_deaths_ratio') ";
    $result = $conn->query($sql);
    
    if ($conn->query($sql) === FALSE) {
        echo "<br />Error: " . $sql . "<br />" . $conn->error;
    } else {
        echo $destiny_character_id." is in the DB";
    }
    }
    
    } else {
        echo "0 results";
    }
    

【问题讨论】:

  • $response[Response][allPvP][allTime][killsDeathsRatio][basic][displayValue] $conn->query($sql); 两次($result = $conn-&gt;query($sql); + if ($conn-&gt;query($sql) === FALSE)
  • 谢谢杰 - 我要整理一下,现在还处于早期阶段

标签: php mysql loops


【解决方案1】:

您执行了两次查询。来到这里:

$result = $conn->query($sql);

在这里一次:

if ($conn->query($sql) === FALSE) {

我猜你的意思是检查第二行中的 result

if ($result === FALSE) {

【讨论】:

  • 只见树木不见森林!谢谢,一个明确的金发时刻
  • @LukeWallwin:它发生了 :) 很高兴我们能提供帮助,欢迎来到 Stack Overflow!
【解决方案2】:

几个问题,从您担心的问题开始(插入发生两次):

1) 您调用了两次$conn-&gt;query,当然,这会执行两次INSERT 查询:

这里:

$result = $conn->query($sql);//insert1

if ($conn->query($sql) === FALSE) {//insert 2
    echo "<br />Error: " . $sql . "<br />" . $conn->error;
} else {
    echo $destiny_character_id." is in the DB";
}

2) 你的代码容易被注入,了解prepared statements并使用它们

3) 访问关联数组中的值需要引用键:$response[Response][allPvP][allTime][killsDeathsRatio][basic][displayValue] 发出通知。开发时,始终使用display_errors,错误级别尽量严格,推荐E_STRICT|E_ALL

【讨论】:

  • 谢谢 Elias,我会考虑合并所有这些内容!
【解决方案3】:

您运行了两次查询:一次是在您设置 $result 时,然后在下面的 if 语句中再次运行。删除 $result 行(无论如何您都没有使用该变量),您就可以开始了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多