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

Eléphanteau du PHP | 10 Messages

26 mai 2022, 22:28

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" } }

Mammouth du PHP | 2703 Messages

26 mai 2022, 23:02

$data = json_decode($jsonString, $assoc=true);
foreach($data as $item){
echo $item->anaRealValue;
}

Eléphanteau du PHP | 10 Messages

26 mai 2022, 23:15

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'];

Avatar du membre
Mammouth du PHP | 1564 Messages

26 mai 2022, 23:17

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'];

}

Avatar du membre
Mammouth du PHP | 1564 Messages

26 mai 2022, 23:22

$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.

Eléphanteau du PHP | 10 Messages

26 mai 2022, 23:49

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 !"; ?>

Mammouth du PHP | 2703 Messages

27 mai 2022, 01:08

$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>";

Avatar du membre
Mammouth du PHP | 1564 Messages

27 mai 2022, 10:45

$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

Eléphanteau du PHP | 10 Messages

27 mai 2022, 16:21

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.

Avatar du membre
Mammouth du PHP | 1564 Messages

27 mai 2022, 17:14

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

Eléphanteau du PHP | 10 Messages

27 mai 2022, 18:36

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.