Page 1 sur 1

Récupérer des données dans un JSON

Posté : 26 mai 2022, 22:28
par pika28
Bonjour à tous,

Je suis en train d'écrire un bout de code PHP pour récupérer des données dans un JSON afin de les envoyer toutes les minutes dans une DB mySQL. J'ai réussi tant bien que mal à activer le JSON de ma domotique. J'ai réussi à me connecter à ma DB. Je n'arrive pas cependant à récupérer des données d'un flux JSON. J'arrive à récupérer le flux brut mais pas une donnée spécifique. Si j'ai bien compris, j'ai des tableau dans un tableau.

Merci d'avance de votre aide.

Mon JSON

Code : Tout sélectionner

[{"_id":1048576,"anaIn":2147483647,"anaRealValue":7.3,"type":18,"transfertFunction":"","name":"FUNCTION PH 1","errorStatus":"0x0000"},{"_id":1048577,"anaIn":654393254,"anaRealValue":1.29,"type":18,"transfertFunction":"","name":"FUNCTION Chlore 1","errorStatus":"0x0000"},{"_id":1048578,"anaIn":2147483647,"anaRealValue":36.46,"type":18,"transfertFunction":"","name":"FUNCTION T°C 1","errorStatus":"0x0000"},{"_id":1048579,"anaIn":1875722474,"anaRealValue":7.32,"type":18,"transfertFunction":"","name":"FUNCTION PH 2","errorStatus":"0x0000"},{"_id":1048580,"anaIn":713834419,"anaRealValue":1.39,"type":18,"transfertFunction":"","name":"FUNCTION Chlore 2","errorStatus":"0x0000"},{"_id":1048581,"anaIn":2147483647,"anaRealValue":36.22,"type":18,"transfertFunction":"","name":"FUNCTION T°C 2","errorStatus":"0x0000"}]
Mon PHP

Code : Tout sélectionner

<?php // Données de connexion $servername = "localhost:3306"; $username = "user"; $password = "pass"; $db = "pool_data"; // Create connection $conn = new mysqli($servername, $username, $password, $db); $json = "lien vers mon JSON"; $jsonString = file_get_contents($json); /* // On définie la requête SQL d'insertion $query = "INSERT INTO `pool_table` (`Date`,`Heure`, `PH1`, `CL1`, `TP1`, `PH2`, `CL`, `TP2`) VALUES ('2022-05-26', '16:00', '7.31', '1.41', '36.01', '7.32', '1.42', '36.02') "; mysqli_query($conn,$query); */ $data = json_decode($jsonString, $assoc=true); echo("The data is: \n"); echo $data->$anaRealValue; ?>
J'obtiens :

Code : Tout sélectionner

The data is: /volume1/web/index.php:24: array(6) { [0] => array(7) { '_id' => int(1048576) 'anaIn' => int(1863270634) 'anaRealValue' => double(7.32) 'type' => int(18) 'transfertFunction' => string(0) "" 'name' => string(13) "FUNCTION PH 1" 'errorStatus' => string(6) "0x0000" } [1] => array(7) { '_id' => int(1048577) 'anaIn' => int(2147483647) 'anaRealValue' => double(1.3) 'type' => int(18) 'transfertFunction' => string(0) "" 'name' => string(17) "FUNCTION Chlore 1" 'errorStatus' => string(6) "0x0000" } [2] => array(7) { '_id' => int(1048578) 'anaIn' => int(1339179537) 'anaRealValue' => double(36.32) 'type' => int(18) 'transfertFunction' => string(0) "" 'name' => string(15) "FUNCTION T°C 1" 'errorStatus' => string(6) "0x0000" } [3] => array(7) { '_id' => int(1048579) 'anaIn' => int(481902826) 'anaRealValue' => double(7.31) 'type' => int(18) 'transfertFunction' => string(0) "" 'name' => string(13) "FUNCTION PH 2" 'errorStatus' => string(6) "0x0000" } [4] => array(7) { '_id' => int(1048580) 'anaIn' => int(1237925808) 'anaRealValue' => double(1.37) 'type' => int(18) 'transfertFunction' => string(0) "" 'name' => string(17) "FUNCTION Chlore 2" 'errorStatus' => string(6) "0x0000" } [5] => array(7) { '_id' => int(1048581) 'anaIn' => int(2147483647) 'anaRealValue' => double(36.63) 'type' => int(18) 'transfertFunction' => string(0) "" 'name' => string(15) "FUNCTION T°C 2" 'errorStatus' => string(6) "0x0000" } }

Re: Récupérer des données dans un JSON

Posté : 26 mai 2022, 23:02
par or 1
$data = json_decode($jsonString, $assoc=true);
foreach($data as $item){
echo $item->anaRealValue;
}

Re: Récupérer des données dans un JSON

Posté : 26 mai 2022, 23:15
par pika28
J'ai réussi avec ce code. Pas sur que ce soit fait dans les règles mais cela fonctionne. J'ai testé ton code mais je n'avais pas de valeur.

Code : Tout sélectionner

//Récupération du PH1 $dataPH1 = json_decode($jsonString, $assoc=true); $dataPH11 = $dataPH1['0']; $PH1 = $dataPH11['anaRealValue']; //Récupération du CL1 $dataCL1 = json_decode($jsonString, $assoc=true); $dataCL11 = $dataCL1['1']; $CL1 = $dataCL11['anaRealValue']; //Récupération du TP1 $dataTP1 = json_decode($jsonString, $assoc=true); $dataTP11 = $dataTP1['2']; $TP1 = $dataTP11['anaRealValue']; //Récupération du PH2 $dataPH2 = json_decode($jsonString, $assoc=true); $dataPH22 = $dataPH2['3']; $PH2 = $dataPH22['anaRealValue']; //Récupération du CL2 $dataCL2 = json_decode($jsonString, $assoc=true); $dataCL22 = $dataCL2['4']; $CL2 = $dataCL22['anaRealValue']; //Récupération du TP2 $dataTP2 = json_decode($jsonString, $assoc=true); $dataTP22 = $dataTP2['5']; $TP2 = $dataTP22['anaRealValue'];

Re: Récupérer des données dans un JSON

Posté : 26 mai 2022, 23:17
par two3d
json_decode($jsonString, true); //est correct
Et si ya du multidimensionnel, le foreach serait plutôt de ce style :
foreach($data as $tableaux => $tableau){

    //et vue que vous passez la valeur "associative" à true, ça retourne les objets en tableau, donc :
    echo $tableau['anaRealValue'];

}

Re: Récupérer des données dans un JSON

Posté : 26 mai 2022, 23:22
par two3d
$data = json_decode($jsonString, $assoc=true);
foreach($data as $item){
echo $item->anaRealValue;
}
Aider, c'est bien, aider correctement c'est mieux, tu fera l'effort de mettre tes codes dans les balises codes, on le dit normalement à ceux qui postent des nouveaux sujets ^^

Et également de tester tes codes avant de répondre n'importe quoi.

Re: Récupérer des données dans un JSON

Posté : 26 mai 2022, 23:49
par pika28
Voila mon code final. Tout fonctionne enfin. Comment puis je gérer la notion de tache planifiée? Dans mon serveur syno directement en pointant le fichier php ou y a t-il une autre manière ?

Code : Tout sélectionner

<?php // Données de connexion $servername = "localhost:3306"; $username = "user"; $password = "pass"; $db = "pool_data"; // Create connection $conn = new mysqli($servername, $username, $password, $db); $json = "liendemonJSON"; $jsonString = file_get_contents($json); // Date et Heure instantané $date = date("Y-m-y"); $time = date("H:i"); //Récupération du PH1 $dataPH1 = json_decode($jsonString, $assoc=true); $dataPH11 = $dataPH1['0']; $PH1 = $dataPH11['anaRealValue']; //Récupération du CL1 $dataCL1 = json_decode($jsonString, $assoc=true); $dataCL11 = $dataCL1['1']; $CL1 = $dataCL11['anaRealValue']; //Récupération du TP1 $dataTP1 = json_decode($jsonString, $assoc=true); $dataTP11 = $dataTP1['2']; $TP1 = $dataTP11['anaRealValue']; //Récupération du PH2 $dataPH2 = json_decode($jsonString, $assoc=true); $dataPH22 = $dataPH2['3']; $PH2 = $dataPH22['anaRealValue']; //Récupération du CL2 $dataCL2 = json_decode($jsonString, $assoc=true); $dataCL22 = $dataCL2['4']; $CL2 = $dataCL22['anaRealValue']; //Récupération du TP2 $dataTP2 = json_decode($jsonString, $assoc=true); $dataTP22 = $dataTP2['5']; $TP2 = $dataTP22['anaRealValue']; // On définie la requête SQL d'insertion $query = "INSERT INTO `pool_table` (`Date`,`Heure`, `PH1`, `CL1`, `TP1`, `PH2`, `CL2`, `TP2`) VALUES ('$date', '$time', '$PH1', '$CL1', '$TP1', '$PH2', '$CL2', '$TP2') "; mysqli_query($conn,$query); echo "Les valeurs $PH1, $CL1, $TP1, $PH2, $CL2 et $TP2 ont été ajoutées à la database le $date à $time !"; ?>

Re: Récupérer des données dans un JSON

Posté : 27 mai 2022, 01:08
par or 1
$data = json_decode($jsonString, $assoc=true);
foreach($data as $item){
echo $item->anaRealValue;
}
Aider, c'est bien, aider correctement c'est mieux, tu fera l'effort de mettre tes codes dans les balises codes, on le dit normalement à ceux qui postent des nouveaux sujets ^^

Et également de tester tes codes avant de répondre n'importe quoi.
pardon pardon, j'avais une chance sur 2, et comme cela ressemblait à l'appel d'un objet dans le code donné, je me suis fait avoir.
$data = json_decode($json, $assoc=true);
foreach($data as $item){
  echo $item['anaRealValue'].' ';
}
echo "<br>";
echo $data[0]['anaRealValue']."<br>";
echo $data[2]['name']."<br>";

Re: Récupérer des données dans un JSON

Posté : 27 mai 2022, 10:45
par two3d
$data = json_decode($jsonString, $assoc=true);
foreach($data as $item){
echo $item->anaRealValue;
}
Aider, c'est bien, aider correctement c'est mieux, tu fera l'effort de mettre tes codes dans les balises codes, on le dit normalement à ceux qui postent des nouveaux sujets ^^

Et également de tester tes codes avant de répondre n'importe quoi.
pardon pardon, j'avais une chance sur 2, et comme cela ressemblait à l'appel d'un objet dans le code donné, je me suis fait avoir.
$data = json_decode($json, $assoc=true);
foreach($data as $item){
  echo $item['anaRealValue'].' ';
}
echo "<br>";
echo $data[0]['anaRealValue']."<br>";
echo $data[2]['name']."<br>";


Certes, ta solution fonctionne mais on ne s'embête pas à mettre des index manuellement ($data[0], $data[2], ...) , on va les chercher dynamiquement via un foreach multidimensionnel :
foreach($data as $tableaux => $tableau)
Et tu as repris ta même erreur :
$data = json_decode($jsonString, $assoc=true);
Le code correct est de mettre directement true, on assigne pas une variable dans un champs booléen même si $assoc=true retourne true, c'est pas comme ça qu'on fait.

Pour info, la doc est ici elle en dit plus sur la paramètre associative, elle dit en gros "passer le paramètre associative permet de retourner un objet JSON (son cas) en tableau".

Voir ma réponse d'hier soir

Re: Récupérer des données dans un JSON

Posté : 27 mai 2022, 16:21
par pika28
Bonjour à tous. Je sors un peu du sujet de ce post. J'ai réussi à planifier la relève des données avec le planificateur de tache du syno. Ma DB s'incrémente toutes les 5 minutes.

Il me faut maintenant exploiter toutes ces données. Les variations de données sont de très courtes durées. L'idée serait de pouvoir choisir le jour, puis d'indiquer une tranche horaire. Ce type d'outils existe t-il tout fait ou me faut-il programmer ça? :-D

Merci de votre aide en tout cas.

Re: Récupérer des données dans un JSON

Posté : 27 mai 2022, 17:14
par two3d
Oui, c'est possible, j'ai regardé un peu ton code et pour ce qui est de :

`Date`,`Heure`

Je te conseil de rassembler les deux valeur et d'en faire une colonne de type DATETIME à la place :

Tu pourra ensuite rechercher plus aisément dans la table des tranche car MySQL fourni de très bonne choses pour le faire.

De plus, tu avais une erreur dans ta variable $date, tu mettais deux fois l'année (Y et y), voilà les infos concernant les types (mais tu en a pas besoin si tu met ta colonnes DATETIME et tu mettra NOW() à la place de $date , cela voudra dire que quand t'insère une donnée, la date actuelle se mettra dans la colonne date.

Assure toit de mettre le bon fuseau horaire en haut de ton fichier PHP pour que la date insérée soit bonne.

Il existe bcp de chose intéressante déjà présentes sur le web, comme ce tuto ou ce post PHPFrance

Du moins, une recherche internet te donnera bcp de résultats intéressants :

https://duckduckgo.com/?q=recherche+par+date+mysql&t=ffab&ia=web

Re: Récupérer des données dans un JSON

Posté : 27 mai 2022, 18:36
par pika28
Oui, c'est possible, j'ai regardé un peu ton code et pour ce qui est de :

`Date`,`Heure`

Je te conseil de rassembler les deux valeur et d'en faire une colonne de type DATETIME à la place :

Tu pourra ensuite rechercher plus aisément dans la table des tranche car MySQL fourni de très bonne choses pour le faire.

De plus, tu avais une erreur dans ta variable $date, tu mettais deux fois l'année (Y et y), voilà les infos concernant les types (mais tu en a pas besoin si tu met ta colonnes DATETIME et tu mettra NOW() à la place de $date , cela voudra dire que quand t'insère une donnée, la date actuelle se mettra dans la colonne date.

Assure toit de mettre le bon fuseau horaire en haut de ton fichier PHP pour que la date insérée soit bonne.

Il existe bcp de chose intéressante déjà présentes sur le web, comme ce tuto ou ce post PHPFrance

Du moins, une recherche internet te donnera bcp de résultats intéressants :

https://duckduckgo.com/?q=recherche+par+date+mysql&t=ffab&ia=web
Un grand merci à toi. Effectivement, j'ai vu après que le champs DATE comportait une erreur. J'ai séparé Date et Time. Sur le principe, date va devenir un filtre et l'heure l'axe X. C'est pour ça que j'ai séparé. Je vais tester avec DATETIME aussi.