8722 sujets

Développement web côté serveur, CMS

Pages :
Bonsoir à tous

J'essaie d'extraire les données d'une API en PHP et je galère comme un fou.
Pour commencer, le developpeur de l'API à fourni un script cURL dont les données se trouvent dans une variable $response.
Je joins un exemple de ce que donne les items contenus dans l'API

Pour extraire les données, je suis entrain de me battre avec une boucle foreach.
Pour ma boucle j'utilise un script comme celui-ci (dans mon exemple j'ai voulu afficher le nom du tournoi).

<?php 
foreach($response AS $match) 
      {
	  $compet = $match->tournament_name ;
          echo "Compétition : " . $compet;
      } 
?> 

J'ai un message d'erreur me disant "Warning: Invalid argument supplied for foreach()"
Je commence simplement à utiliser les API et je suis sans doute à côté de la plaque.
Si quelqu'un à la gentillesse de pouvoir m'aider ce serait cool.
Merci
Modérateur
Bonjour,

Ton code marche. Par contre, il est probable que $response ne contienne pas ce que tu attends.

Pour le vérifier tu mets ta boucle en commentaire et tu mets juste avant :
print_r($response);

Ça affiche le contenu de $response.

Amicalement,
Modifié par parsimonhi (27 Oct 2020 - 22:35)
Merci pour ta réponse.
En fait il y avait déjà un echo de $response qui a été fait.
ça me liste les données mais c'est présenté de façon indigeste (on retrouve les données de la capture que j'ai jointe sur mon premier post).
Je joins tout de même le screen avec le print_r (j ai sans doutes merdouillé sur le premier post, la capture n'a pas du être jointe) upload/1603835627-81471-apifootballscience.png
Modérateur
Bonjour,

C'est le résultat complet du print_r ?

Déjà, il manque un crochet [ au début. Mais ça ressemble à une chaine de caractère plutôt qu'à un tableau.

Je me demande si tu n'aurais pas oublié un JSON.parse().

$response2 = JSON.parse($response);
foreach($response2 as $match) {...}


Amicalement,
Modifié par parsimonhi (28 Oct 2020 - 06:02)
En fait je n ai pas mis tout le tableau (car je me suis dit que c'était imbuvable).
J'ai tout de même essayé le script json.parse (j'aime tester pour voir les resultats), ça m'insulte encore plus
Warning: Use of undefined constant JSON - assumed 'JSON' (this will throw an Error in a future version of PHP)
Fatal error: Uncaught Error: Call to undefined function parse()
Stack trace: #0 {main} thrown

Voici la page complète du print_r upload/1603865958-81471-api.png
Modifié par michel4-7 (28 Oct 2020 - 07:36)
Modérateur
Bonjour,

Mea culpa. Je t'ai donné la fonction javascript et non php.

Il faudrait utiliser json_decode() et non JSON.parse().

EDIT: a priori, ton $response contient une chaine de caractère au format JSON représentant un tableau (et non pas directement un tableau). La fonction ci-dessus va transformer $response en tableau et c'est ça qui sera ensuite utilisable dans un foreach.

$response2 =  json_decode($response);


Amicalement,
Modifié par parsimonhi (28 Oct 2020 - 10:34)
Il y a une belle avancée, avec le json_decode j'ai le nom de la compétition qui s'affiche ... elle s'affiche 8 fois mais elle s'affiche. En fait je pense qu'elle s'affiche autant de fois qu'il y a de matchs. Je me demande s'il ne faut pas que j'utilise id_match (qui est l'id pour un seul et unique match)
Modifié par michel4-7 (28 Oct 2020 - 10:45)
Modérateur
Bonjour,

C'est normal, elle s'affiche 1 fois pour chaque match (a priori, dans ton $response, il doit y avoir 8 matches pour la compétition en question).

Amicalement,
oui c'est ce que j'ai mis en correction (j ai modifié ma réponse pendant que tu m'écrivais la tienne). En tout cas très belle avancée. Merci (je n'aurai pas trouvé le json_decode. Je le connaissais, je l'avais déjà utilisé mais je ne l'aurai pas trouvé dans ce cas précis).
En fait le script cURL spécifie les dates de matchs et la compétition, donc la boucle foreach prend en compte tous les matchs qui se sont joués a ces dates dans cette compétition (donc forcément j'avais défini les dates sur toute la journée de championnat donc j'ai eu l'ensemble des matchs.
Mais la j'ai bien avancé. Merci
Modifié par michel4-7 (28 Oct 2020 - 10:56)
Par exemple, par défaut , le CURLOPT_URL prend en compte le tournament_name et les dates.
Dans cette portion de script j'ai changé le tournament_name=French Ligue 1 par stadium=Parc des Princes pour avoir les matchs joués au Parc des Princes pour la periode donnée. Pas de soucis ça fonctionne (forcément je n'ai que le dernier match puisque c'est celui qui s'est joué durant la période définie) mais moi ce que j'aimerai c'est faire le tri par le nom de l'équipe (et la je bute car on a name et il y a un paramètre supplémentaire avec abbrev, first ou full)
J'ai essayé plusieurs choses dans le CURLOPT_URL (par exemple name= suivi du nom de l'équipe ou bien name:full= suivi du nom de l'équipe ou encore name->full= suivi du nom de l'équipe) mais rien ne fonctionne. Il y a sans doute une syntaxe précise a mettre dans le CURLOPT_URL que je n'arrive pas a trouver.. Si j'arrive a la trouver, je pourrais faire tout ce que j'ai envie de faire puisque je pourrais tout trier en fonction de mes besoins.

upload/1603881170-81471-psgscript.png
Modifié par michel4-7 (28 Oct 2020 - 11:35)
Modérateur
Bonjour,

Soit effectivement tu tries avant pour que $response ne contienne ce que tu veux. Mais là, on n'a pas assez d'info pour savoir comment faire.

Soit tu peux (sauf si je bogue encore une fois) accéder au nom de l'équipe via quelque chose comme :
$match->home_team->name->full

Explication : les {} entourent un sous-ensemble de données (sous forme d'objet au lieu de tableau). home_team un objet, dont l'une des propriétés s'appelle name. name est aussi un objet dont l'une des propriétés s'appelle full. full enfin est une chaine de caractères qui contient le nom complet de l'équipe qui reçoit.

Si au lieu du nom complet, tu veux afficher une abréviation, ce sera :
$match->home_team->name->abbrev

Remarque en passant : je vois des "assitant" un peu partout et à mon avis, ça devrait être "assistant" et non "assitant". Smiley cligne

Amicalement,
Modifié par parsimonhi (28 Oct 2020 - 12:07)
Effectivement c est ce que je fais pour afficher le nom de l'équipe mais en fait je souhaiterai le mettre dans le curlpt_url pour faire des "tris généraux". J'ai envoyé un message au concepteur de l'api pour savoir comment coder le curlopt_url.

Par exemple afficher les matchs du Paris Saint-Germain (dernier match, live score et prochain match). Si je veux faire automatiquement ce genre d'affichage j'ai l'impression qu'il faut que le passe par le curlopt_url (qui contient l'adresse de l'api plus tous ces paramètres.

Je mets également des conditions dans mes boucles foreach (soit en if else, soit en switch case suivant le nombre de cas) pour modifier les valeurs affichées (par exemple écrire PSG à la place de Paris Saint-Germain ou pour franciser les données de l'API qui de base est en anglais).

En tout cas merci pour tout.
Notre échange m'est très profitable et je peux continuer a avancer sur mon projet
Modifié par michel4-7 (28 Oct 2020 - 12:15)
Ceci dit j'ai encore un souci pour l'affichage des résultats. C'est un tableau
Au départ j'ai codé ma boucle foreach comme ça
$resultat = $match->result;
        echo "Score du match : " . $resultat . "<br />";


Le result ne lui plaît pas, il me met Array
j'ai rajouté des crochets
$resultat = $match->result[];
        echo "Score du match : " . $resultat . "<br />";

ça lui plait encore moins.

Que faut t-il mettre pour l'affichage d'un Array ?
Merci (again)
Modifié par michel4-7 (28 Oct 2020 - 12:32)
Modérateur
Bonjour,

Score de l'équipe qui reçoit :
$resultat = $match->result[0]
Score de l'équipe qui visite :
$resultat = $match->result[1]

Explication: le nombre en crochet indique l'indice du tableau, en commençant par 0. Dans le print_r($reponse), on voit que la propriété "result" a pour valeur [4,0]. Les crochets signifient que c'est un tableau, et on voit qu'il a 2 éléments, le nombre "4" et le nombre "0", séparés par une virgule. Le premier élément de result sera donc accessible via result[0] et le deuxième via result[1].

Amicalement,
Modifié par parsimonhi (28 Oct 2020 - 12:49)
upload/1603965085-81471-stats.png Désolé de revenir vers toi et t'embêter mais j'ai un autre souci.
Je suis entrain de m'occuper des statistiques et visiblement le développeur à mis de tirets (je poste une capture d'écran exemple pour les buteurs d'un match -pour plus de clareté et de simplicité j'ai laissé le surlignement de la recherche).
Je souhaite faire apparaître les buteurs du match et je l'ai codé de cette façon

$response2 = json_decode($response);
  foreach($response2 as $match) {
    $buteurs = $match->stats_soccer_offensive->goals-total;
        echo $buteurs . "<br />";
}


et j'ai les messages d'erreur suivants
Notice: Undefined property: stdClass::$stats_soccer_offensive
Notice: Trying to get property 'goals' of non-object
Warning: Use of undefined constant total - assumed 'total' (this will throw an Error in a future version of PHP)
Warning: A non-numeric value encountered


Je me suis sans doutes trompé en le codant mais j'ai eu la vanité de penser que le développeur de l'API s'était trompé en mettant le tiret (en fait la coloration syntaxique de VSC change dès que je mets le tiret)
Ou ai-je merdouillé ?
Merci pour la possible réponse
Modifié par michel4-7 (29 Oct 2020 - 10:51)
Hello

l'erreur dit que tu essaye d'acceder à un attribut d'objet, alors que c'est un tableau. accède à ton attribut avec les crochet et non les flèches.

toujours faire un var_dump sur la variable en question quand il y a une erreur. c'est le minimum vitale.
Modifié par JENCAL (29 Oct 2020 - 10:49)
Hello

l'erreur dit que tu essaye d'acceder à un attribut d'objet, alors que c'est un tableau. accède à ton attribut avec les crochet et non les flèches.
J'ai mis des crochets ça me fait totalement planter ma page (jusqu'a present j'avais les messages d'erreur sous ce que contient la variable $response du script cURL) avec les crochets je n'ai plus qu'une ligne avec un message d erreur
Modérateur
Bonjour,

Il manquait un ->stats


$match->stats->stats_soccer_offensive->goals-total


Amicalement,
Pages :