【问题标题】:Storing Steam Game Data from Steam API into MySQL Database将 Steam 游戏数据从 Steam API 存储到 MySQL 数据库
【发布时间】:2016-05-05 02:10:48
【问题描述】:

我正在尝试使用 PHP 将来自具有 CS:GO 统计数据的 Steam 用户的数据插入 MySQL 数据库。我需要将 stats 数组中的 namevalue 值插入到我将在 Android 应用程序中显示的 MYSQL 中,但我不确定该怎么做。

代码:

<?php
    $con = new mysqli('mysql6.000webhost.com','a2689951_Cheesy','ansmh1997', 'a2689951_mSicx');
    if (mysqli_connect_error()) {
        echo mysqli_connect_error();
        exit;
    }             

    $stats = file_get_contents("http://api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v0002/?appid=730&key=<key>&steamid=76561198050187807");
    $json = json_decode($stats, true);
    $stats = array();
    foreach ($content['playerstats']['stats'] as $stat) {
        $stats[$stat["name"]] = $stat["value"];
    }

    $insert = "INSERT INTO user (total_kills, total_deaths) VALUES (?, ?)";
    $stmt = $con->prepare($insert);
    $stmt->bind_param("ss", $total_kills, $total_deaths);
?>

API 示例输出:

{
    "playerstats": {
        "steamID": "76561198050187807",
        "gameName": "ValveTestApp260",
        "stats": [
            {
                "name": "total_kills",
                "value": 35179
            },
            {
                "name": "total_deaths",
                "value": 30241
            },
            {
                "name": "total_time_played",
                "value": 2444377
            },
            // ...
        ]
    }
}

【问题讨论】:

  • 请同时说明您的实际问题!
  • 那个更好看?
  • 您应该明确说明您遇到问题的部分。否则,这是一个非常广泛的问题。我还是试着回答了。

标签: php mysql steam


【解决方案1】:

因为你是初学者,所以要养成做的习惯:

  • 不要在 PHP 中使用 mysql 函数。改用mysqli(它甚至支持面向对象的表示法!)
  • INSERT-statement 设置的方式使您可以选择SQL Injection attacks。请改用"prepared statement"
  • 要从 PHP 脚本“返回”数据(即直接发送到浏览器),您需要使用 echo 而不是 return
  • 您的代码中有这一行:json_encode($response),其中$response 是一个空数组。这条线不会做任何事情。 json_encode()-函数返回一个字符串,其中包含您给它的任何内容的 JSON 表示。它不会改变它!
  • 我从您在示例中的 URL 中删除了 API 密钥,因为公开共享密钥不是一个好主意,并且可能导致 Valve 禁止您的密钥(例如,如果恶意人员使用它向 API 发送请求)。

现在解决您的实际问题:

foreach ($json->playerstats->stats as $stat) {
    $stats[$stat["name"]] = $stat["value"];
    $total_kills = $stats["total_kills"];
    $total_deaths = $stats["total_deaths"];

我认为对于循环实际重复这段代码的哪一部分可能会有些混淆。它只是第一行,而是整个正文(由{}-括号括起来)。

问题是您只能将 JSON 中的第一个条目放入$stats-array,即total_kills。但是你想要所有这些,所以你的循环应该单独运行这部分:

foreach ($content['playerstats']['stats'] as $stat) {
    $stats[$stat["name"]] = $stat["value"];
}
// Continue as you did...

然后,这会将您请求中的整个数据转换为您期望的格式,因此对$stats 的第二次访问将正常工作。

【讨论】:

  • 遗憾的是没有上传到数据库,请检查编辑后的新代码
  • 在您的新代码中,变量 $total_kills$total_deaths 永远不会被分配。如果您遇到任何错误,请也包括在内。
【解决方案2】:

我认为您的插入语句需要在 foreach 中,试试这个。

$con = mysqli_connect("mysql6.000webhost.com", "a2689951_steam", "password", "a2689951_playerdata");

$stats = file_get_contents("http://api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v0002/?appid=730&key=(MyKey)&steamid=(PlayerID)");
$json = json_decode($stats, true);
$stats = array();
foreach ($content['playerstats']['stats'] as $stat) {
    $stats[$stat["name"]] = $stat["value"];
    $total_kills = $stats["total_kills"];
    $total_deaths = $stats["total_deaths"];

    $insert = "INSERT INTO user (total_kills, total_deaths) VALUES ('$statement', 'siss', $total_kills, $total_deaths)";
    if ($con->query($insert) === TRUE) {
        $response = array();
        json_encode($response);
        return json_encode($response["success"]);

    } else {
        return "Error: <br>" . $con->error;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2018-03-02
    • 2022-12-12
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多