【问题标题】:PHP Parse Json file_get_contains into foreach (The requested operation cannot be carried out because the handle supplied is not in the correct state)PHP Parse Json file_get_contains into foreach(请求的操作无法执行,因为提供的句柄状态不正确)
【发布时间】:2013-07-26 18:24:37
【问题描述】:

我正在尝试解析一个 xml 文件并通过他们的 ID 显示成员,并带有指向他们个人资料的链接:

$xml=simplexml_load_file("http://steamcommunity.com/gid/103582791433452366/memberslistxml/?xml=1");
foreach ($xml->members->children() as $data)
{
    echo '<a href="http://steamcommunity.com/profiles/'.$data.'">'.$data.'</a>'."<br>";
}

效果很好。

但是当我尝试从一个 json 文件(一个成员一个文件)中显示每个成员的头像时,我在 dreamweaver 上收到错误“请求的操作无法执行,因为提供的句柄状态不正确。”

代码如下:

 $xml=simplexml_load_file("http://steamcommunity.com/gid/103582791433452366/memberslistxml/?xml=1");

    foreach ($xml->members->children() as $data)
    {   
    $player=file_get_contents("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=MY_APY_KEY&steamids=$data");
    $data1=json_decode($player);
        echo '<a href="http://steamcommunity.com/profiles/'.$data.'"><img src="'.$data1->response->players[0]->avatar.'">'.$data.'</a>'."<br>";
    }

但是,例如,如果我将 $player 和 $data1 放在 foreach 之前,然后将 $data 替换为唯一的 steamID(例如 76561197960435530),如下所示:

$xml=simplexml_load_file("http://steamcommunity.com/gid/103582791433452366/memberslistxml/?xml=1");
$player=file_get_contents("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=MY_API_Key&steamids=76561197960435530");
$data1=json_decode($player);

foreach ($xml->members->children() as $data)
{
    echo '<a href="http://steamcommunity.com/profiles/'.$data.'"><img src="'.$data1->response->players[0]->avatar.'">'.$data.'</a>'."<br>";
}

它将按 ID 显示成员,并带有指向其个人资料的链接,并将在每个成员旁边显示此 steamid(76561197960435530) 的头像。 我想要做的是在他们的 ID 旁边显示每个成员的头像,而不是 76561197960435530 的头像。

我也试着只输入这段代码:

$xml=simplexml_load_file("http://steamcommunity.com/gid/103582791433452366/memberslistxml/?xml=1");

foreach ($xml->members->children() as $data)
{
    $player=file_get_contents("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=my_api_key&steamids=$data");
    $data1=json_decode($player);

    var_dump($data1);
}

它非常长,几分钟但在dreamweaver上工作,它显示每个json文件的结构化信息。但是当我在firefox上加载页面时它不起作用可能是因为加载时间太长。

【问题讨论】:

  • 您可能不应该将您的 API 密钥放在每个人都可以看到的地方。我建议重置您的 API 密钥。
  • 这可能听起来很傻,但请尝试:'http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=my_api_key&amp;steamids='.$data

标签: php json parsing foreach


【解决方案1】:

您没有授权,或者您的 API 输入不正确:

 <?php


  $xml=simplexml_load_file("http://steamcommunity.com/gid/103582791433452366/memberslistxml/?xml=1");

     foreach ($xml->members->children() as $data)
     {   
     $player=file_get_contents("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=MY_APY_KEY&steamids=$data");
     $data1=json_decode($player);

    var_dump($data1);

     }

 ?>

data1的结果:

 PHP Warning: 
 file_get_contents(http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?        key=MY_APY_KEY&steamids=76561198066695135):
 failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized
 in /home/marin/a.php on line 8

因此,您收到返回的错误 401,这意味着您没有使用用户名和密码在 HTTP 服务器上获得授权,或者没有为 STEAM 帐户设置授权的 API 密钥。

作者说:

但是当我在 Firefox 上加载页面时它不起作用可能是因为它是 加载时间过长。

在 Firefox 上打开“查看源代码”,然后上传文件(不在源视图中重新加载),然后刷新。你会看到一点点快。您需要了解 XML 文件的结构。

注意,您不能更改接收到的远程数据的数据。

【讨论】:

  • 这与 API 密钥无关。我编辑了我的帖子并提供了有关我尝试过的更多信息。
【解决方案2】:

我使用类似于以下的代码

$playersStr = "";
$players = array();

// Build your $playersStr as a comma seperated string here


// Get players' information from Valve
$url = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=$_STEAMAPI&steamids=$playersStr";
$json_object= file_get_contents($url);
$json_decoded = json_decode($json_object);

// Complete our player array with additional details from the API
foreach ($json_decoded->response->players as $player)
{
    $players[$player->steamid]['steamid'] = $player->steamid;
    $players[$player->steamid]['personaname'] = $player->personaname;
    $players[$player->steamid]['profileurl'] = $player->profileurl;
    $players[$player->steamid]['avatar'] = $player->avatar;
    $players[$player->steamid]['avatarmedium'] = $player->avatarmedium;
    $players[$player->steamid]['avatarfull'] = $player->avatarfull;
}

需要注意的几点:

  • $playersStr 是一个逗号分隔的字符串,在我的例子中,它是根据数据库查询构建的。只要它以逗号分隔的配置文件 ID 字符串结尾,您就可以按照您需要的方式构建它。
  • $_STEAMAPI 是您的 Steam API 密钥。
  • 最后,您将获得一个$players 数组,您可以使用该数组并循环访问您要查找的字段。在这种情况下,它甚至是所有三个头像大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多