我目前正在建立一个小型网站,从mysql数据库中检索计算机游戏的玩家统计数据并在线显示。
我从第三方API获取玩家列表的玩家统计信息,并尝试将其插入到db中的表中。但是我的代码执行了两次插入 - 表上的主键限制会阻止重复的条目,但我不想接受这个。
我的循环逻辑出了点问题,但是我会在自己的循环中尝试解决这个问题。
事件顺序为:
我想将数据(每个玩家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";
}
答案 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行(你还没有使用那个变量),你就可以了。