插入MySQL数据库在循环中出现两次

时间:2015-08-03 12:31:14

标签: php mysql loops

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

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

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

事件顺序为:

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

3 个答案:

答案 0 :(得分:3)

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

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

并且在这里:

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

我猜你打算在第二行检查结果

if ($result === FALSE) {

答案 1 :(得分:2)

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

1)您正在调用$conn->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)您的代码易受注入,了解准备好的语句并使用它们

3)访问关联数组中的值需要引用键:$response[Response][allPvP][allTime][killsDeathsRatio][basic][displayValue]发出通知。开发时,请始终使用display_errors,并将错误级别设置为严格,建议您E_STRICT|E_ALL

答案 2 :(得分:0)

您正在运行查询两次:一次设置$ result,然后再次在以下if语句中运行。删除$ result行(你还没有使用那个变量),你就可以了。