Récupérer donnée fichier *.json [Résolu]

Signaler
Messages postés
240
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
23 mai 2021
-
Messages postés
32940
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 juin 2021
-
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.

3 réponses

Messages postés
32940
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 juin 2021
3 556
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é';
}

Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 juin 2021
291
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 ?
Messages postés
240
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
23 mai 2021
2
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 ?
Messages postés
240
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
23 mai 2021
2
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?
Messages postés
32940
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 juin 2021
3 556
<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