Récupérer donnée fichier *.json

Résolu/Fermé
rolly41 Messages postés 242 Date d'inscription dimanche 16 novembre 2008 Statut Membre Dernière intervention 18 septembre 2023 - Modifié le 16 mai 2021 à 16:42
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 - 23 mai 2021 à 18:45
Bonjour à tous et merci déjà pour votre aide qui m'a déjà dans le passé été très précieux.

j'ai à nouveau besoin de votre aide pour me permettre de récupérer des données d'in fichier json sans que celui ci ne doivent à chaque fois être appelé dans une boucle while.

Voici le fichier json (lien externe)
{
 "response":
 {
  "game_count":2,
    "games":
  [
   {
    "appid":252490,
    "name":"Rust",
    "playtime_2weeks":809,
    "playtime_forever":25788,
    "img_icon_url":"820be4782639f9c4b64fa3ca7e6c26a95ae4fd1c",
    "img_logo_url":"ced8982cc46ce2b31cdb746f0abf61e9e8935913",
    "playtime_windows_forever":4837,
    "playtime_mac_forever":0,
    "playtime_linux_forever":0
   },
   {
    "appid":107410,
    "name":"Arma 3",
    "playtime_2weeks":226,
    "playtime_forever":42063,
    "img_icon_url":"3212af52faf994c558bd622cb0f360c1ef295a6b",
    "img_logo_url":"b49962441a01f1f80b180af1293608dddf7df6b0",
    "playtime_windows_forever":386,
    "playtime_mac_forever":0,
    "playtime_linux_forever":0
   }
  ]
 }
}


et voici ma requête php
if (empty($steam['steam_uptodate']) or empty($steam['steam_id'])) {
 require 'SteamConfig.php';
 $url = file_get_contents("http://www.lien.ext/".$steam['steam_id'].".json");
 $content = json_decode($url, true);
 $nbr = '0';
 $steam['game_count'] = $content['response']['game_count'];
 if ($steam['game_count'] !== $nbr)
 {
  echo 'Vous avez '.$steam['game_count'].' jeux enregistré. Affichage de vos jeux en cours!';
  echo '<table border="1">';
  echo '<tr><td></td><td>appid</td><td>Nom du jeu</td><td>icon</td><td>logo</td></tr>';
  while($nbr !== $steam['game_count'])
  {
   $url = file_get_contents("http://www.lien.ext/".$steam['steam_id'].".json");
   $content = json_decode($url, true);
   $steam['game_appid'] = $content['response']['games'][$nbr]['appid'];
   $steam['game_name'] = $content['response']['games'][$nbr]['name']; 
   $steam['game_icon'] = $content['response']['games'][$nbr]['img_icon_url'];
   $steam['game_logo'] = $content['response']['games'][$nbr]['img_logo_url'];
   $icon = "https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/apps/".$steam['game_appid']."/".$steam['game_icon'].".jpg";
   $logo = "https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/apps/".$steam['game_appid']."/".$steam['game_logo'].".jpg";
   $nbr++;
   echo "<tr><td>".$nbr."</td><td>".$steam['game_appid']."</td><td>".$steam['game_name']."</td><td><img src='".$icon."' /></td><td><img src='".$logo."' /></td></tr>";
  }
  echo '</table>';
  $game_steam='Jeu steam trouvé: ';
 }
 else
 {
  $game_steam='pas de jeu steam';
 }
 $gameinfo = $_SESSION['game_count'];
 
 
 
}
else {$gameinfo = 'Non connecté';}


Résultat obtenu:
J'ai bien mon tableau avec les jeux et les informations voulue.

Mon problème:
Dans le cas ou il y a plus de 15 ou 20 jeux, la requête commence à être longue voire très longue quand la personne à plus de 200 ou 300 jeux.

Solution voulue:
Devoir faire une seul fois la requête au fichier json sans devoir la mettre dans une boucle php ce qui prend beaucoup de temps et pouvoir récupérer les données de ce fichier pour les enregistrer dans ma base de données mysql.

De plus, pendant cette "requête", est-il possible d'afficher une image de chargement (en js par exemple) pour indiquer que la requête est en cours? (quand il y a plus de 300 jeux, on peut très vite se dire que le serveur va planter ...)


Merci à tous pour vos lumière :)


Configuration: Windows / Firefox 88.0


EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
A voir également:

3 réponses

jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 648
16 mai 2021 à 18:41
Bonjour,

En gros.... ça ?

<?php
 require_once  'SteamConfig.php';

if (empty($steam['steam_uptodate']) or empty($steam['steam_id'])) {
  $url = "http://api.steampowered.com/IPlayerService/GetRecentlyPlayedGames/v0001/?key=".$steamKey."&steamid=".$steam['steam_id']."&format=json"; // Variable steamKey  à rempalcer par la clé....

 $json = file_get_contents($url);
 $content = json_decode($json, true);
 $steam['game_count'] = !empty($content) ? $content['response']['game_count'] : NULL;;
 
if ($steam['game_count'] >0 ) {
  echo 'Vous avez '.$steam['game_count'].' jeux enregistré. Affichage de vos jeux en cours!';
  echo '<table border="1">';
  echo '<tr>
          <td></td>
          <td>appid</td>
          <td>Nom du jeu</td>
          <td>icon</td>
          <td>logo</td>
        </tr>';
  
  $games = !empty($content['response']['games'])  ? $content['response']['games'] : NULL;
  
  foreach($games as $G){
    $appid = $G['appid'];
    $name = $G['name'];
    $img_icon_url = $G['img_icon_url'];
    $img_logo_url = $G['img_logo_url'];
    $icon = "https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/apps/".$appid."/".img_icon_url.".jpg";
    $logo = "https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/apps/".$appid."/".$logo.".jpg";
    echo "<tr>
            <td>".$nbr."</td>
            <td>".$steam['game_appid']."</td>
            <td>".$steam['game_name']."</td>
            <td><img src='".$icon."' /></td>
            <td><img src='".$logo."' /></td>
          </tr>";
  }
  echo '</table>';
  $game_steam='Jeu steam trouvé: ';
 }  else {
  $game_steam='pas de jeu steam';
 }
 $gameinfo = $_SESSION['game_count'];
 
} else {
  $gameinfo = 'Non connecté';
}

1
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 330
16 mai 2021 à 16:43
Au lieu de faire plusieurs fois la requête du fichier, pourquoi ne pas le demander une seule fois et travailler avec les données en mémoire ?
0
rolly41 Messages postés 242 Date d'inscription dimanche 16 novembre 2008 Statut Membre Dernière intervention 18 septembre 2023 1
Modifié le 16 mai 2021 à 17:43
Bonjour, en faite ma requête se fait quand un membre se connecte via steam.

Une fois connecté je récupère son steamid et je fais une requête pour connaitre les jeux steam du membre. la requête se fait sur un url de ce type
http://api.steampowered.com/IPlayerService/GetRecentlyPlayedGames/v0001/?key=XXXXXXXXXXXXX&steamid=XXXXXXXXXXXXXXXX&format=json
Notez dans le lien une variable "key" et une variable "steamid". Les données ne sont donc pas en mémoire sur mon serveur, et je ne sais justement pas comment faire pour faire cette requête une seul fois et garder en mémoire les données pour les mettre dans ma boucle pour les afficher sous forme de tableau.

Pour répondre a votre question, je ne sais pas comment faire cela.

Puis-je vous demander vos lumière qui me permettront certainement d'y parvenir comme vous le proposez :D ?
0
rolly41 Messages postés 242 Date d'inscription dimanche 16 novembre 2008 Statut Membre Dernière intervention 18 septembre 2023 1
Modifié le 23 mai 2021 à 17:20
Merci jordan45, le temps de chargement est déjà plus rapide :) peux-tu m'expliquer la différence entre foreach que tu as recommandé et le while que j'ai utilisé?

Je me rend compte qu'une fois la page actualisé (avec F5), les informations du 'foreach' son perdue, est-ce normal?
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 648
23 mai 2021 à 18:45
<blcok>
différence entre foreach que tu as recommandé et le while que j'ai utilisé
</block>
Aucun.
J'ai Juste l'habitude d'utiliser le foreach


Je me rend compte qu'une fois la page actualisé (avec F5), les informations du 'foreach' son perdue, est-ce normal?

Lorsque tu fais F5, ça rafraichit la page...
Le script complet va donc se réexécuter
0