8768 sujets

Développement web côté serveur, CMS

Bonjour ! Alors je dois récupérer des données d'un fichiers json à l'aide d'un script php. J'arrive à récupérer les valeurs des propriétés des objets json dans ce fichier mais PAS le nom de ces objet :

upload/1528975615-71261-valeur.png

Je voudrais récupérer la valeur encadrée en rouge . J'ai eu beau cherché sur les forums etc , je n'ai vu aucun "tuto" sur la manière de le faire... Pouvez-vous m'aider ?
Merci d'avance !
Modifié par Cherrygolo (14 Jun 2018 - 13:31)
json_decode permet de transformer un object JSON en objet ou tableau PHP.
http://php.net/manual/fr/function.json-decode.php
Perso, je trouve plus commode de travailler avec un tableau, donc mettre $assoc à true.
Ensuite, tu récupères les clés du tableau avec array_keys().
Le hic est que tu récupères plusieurs clés et leur ordre est imprévisible.
Soit tu as un modèle de clé à recherche, soit il faut boucler sur toutes les clés jusqu'à trouver la bonne qui correspond à environnement et appli
<?php
$result = json_decode(file_get_contents('mon-fichier.json'), true);
print_r(array_keys($result));
?>


P.S. : Dans la console ssh, tu peux saisir directement les commandes ci-dessus pour faire des essais après avoir lancé l'interpréteur PHP par "php -a". C'est bien commode
Ah donc il n'y a aucun moyen pour que je récupère la partie encadrée en rouge pour chaque objet avec un foreach..? du genre :


//récupération du fichier.json
$jsonFile = file_get_contents('https://lnxsatelliteprd01.serveurs.cg59.fr/pub/reports/hosts.json');
//décode le fichier.json
$jsonData = json_decode($jsonFile);
if ($objBdd) {
    foreach ($jsonData as $envt) {
        $nomObj = ...
    }
}

Modifié par Cherrygolo (14 Jun 2018 - 14:28)
Si on peut faire à coup de foreach et de break :
$jsonFile = file_get_contents('https://lnxsatelliteprd01.serveurs.cg59.fr/pub/reports/hosts.json');
//décode le fichier.json
$jsonData = json_decode($jsonFile, true);
$result = false;
if (!empty($jsonData)) {
    foreach ($jsonData as $k=>$values) {
        if(
             array_key_exists('environnement', $values) and
             array_key_exists('appli', $values) 
        ) {
           // On s'arrête à la 1ère occurence
           $result = $k;
           break;
       }
    }
}
if(!empty($result)) { echo $result; }

Après avec le nom du serveur et array_filter, on peut améliorer la recherche .
Je n'ai pas testé. Si cela renvoie une erreur, je corrigerai plus tard
<?php
$serveur = 'serveurs.cg59.fr';
$filename = "https://lnxsatelliteprd01.{$serveur}/pub/reports/hosts.json";
$content = file_get_contents($filename);
$jsonDatas = json_decode($content, true);
if(is_array($jsonDatas)) {
    $pattern = "@$serveur\$@";
    $result = array_filter(
        $jsonDatas,
        function($values, $key) use($pattern) {
            return
                preg_match($pattern, $key) and
                array_key_exists('environment') and
                array_key_exists('appli')
        },
        ARRAY_FILTER_USE_BOTH
    );
    print_r($result);
}
?>

Note que $result peut renvoyer plusieurs valeurs selon les données, mais on moins tu récupéres tout
Donc avec ta 1ère portion de code je suis sensée obtenir la partie encadrée en rouge dans $k ?
C'est pas plutôt tout le contenu de l'objet qui sera dedans ?
T'as pas essayé ?
Fais un "print_r($jsonDatas);" avant le "if" pour voir à quoi il ressemble.
C'est donc bien la valeur de $k qui est renvoyée comme demandé.

Je t'encourage à utiliser la 2ème méthode. Cela demande des connaissances supplémentaires :
expression régulière niveau 1
function callback anonyme
emploi de use

Mais cela est plus performant
Modifié par bazooka07 (14 Jun 2018 - 15:43)
Je ne peux pas vraiment essaye pour le moment : Mon serveur ne semble pas avoir le paquet php-mysqli et je ne peux pas l'installer car le serveur ne possède pas apt-get ni dpkg... Décidément c'est vraiment la mierde...

Donc j'essaierai dès que j'aurai débloqué cette partie là et je te dirai si ça marche...
Alors la 1ère méthode me donne rien du tout : une page vide.
Et dans la seconde version , le "}," est indiqué comme une erreur et les variables $values et $key ne sont pas définies...
Modifié par Cherrygolo (15 Jun 2018 - 09:41)
Je donne le principe mais je n'ai pas toujours le temps de testerpour corriger les bugs Smiley lol
Voici la version corrigée avec les messages de suivi :
<?php
$red = "\e[41m\e[30m";
$normal = "\e[0m";
$yellow = "\e[43m\e[30m";

$serveur = 'serveurs.cg59.fr';
$filename = "lnxsatelliteprd01.{$serveur}/pub/reports/hosts.json";

if(!is_readable($filename)) {
	exit("{$red} Accès au fichier {$filename} impossible {$normal}\n");
}

$content = file_get_contents($filename);
$jsonDatas = json_decode($content, true);

if(!is_array($jsonDatas)) {
	var_dump($jsonDatas);
	exit("{$red} Mauvais format de données pour \$jsonDatas {$normal}\n");
}

$pattern = "@$serveur\$@";
$result = array_filter(
	$jsonDatas,
	function($values, $key) use($pattern) {
		echo "--------------- record ---------------------\n";
		print_r($values);
		echo "\$pattern: $pattern\n\$key: $key\n";
		return
			preg_match($pattern, $key) and
			array_key_exists('environment', $values) and
			array_key_exists('appli', $values);
	},
	ARRAY_FILTER_USE_BOTH
);
echo "=============== result =====================\n";
echo "$yellow ".implode("\n", array_keys($result))." $normal\n";
?>

Jeu d'essai au format JSON:
{
	"key-one": {"field-one-one": "data-one-one", "field-one-twa": "data-one-two" },
	"lnxadmit01.serveurs.cg59.fr": { "environment": "qualif", "appli": "intra" },
	"key-two": { "field-two-one": "data-two-one", "field-two-twa": "data-two-two" }
}

Enjoy it !
Modifié par bazooka07 (15 Jun 2018 - 10:53)
Alors j'ai fini par trouver la solution car le nom de mon objet est une clé elle-même :

<?php

/* Script permettant de récupérer les données du fichier.json du satellite
  + utiliser ces données pour mettre à jour la base de données bddProjetInterface
  si elles n'y sont pas déjà */

//Variables
//données à utiliser pour les requêtes d'insertion de données dans la bdd
$valeurFqdn; //hostname = "value" de la "cle" fqdn dans la table hieravalue
//index du tableau qui récupère les hostnames
$i = 1; //l'index de ce tableau commence à 1

//Code
//récupération du fichier.json
$jsonFile = file_get_contents('https://lnxsatelliteprd01.serveurs.cg59.fr/pub/reports/hosts.json');
//décode le fichier.json
$jsonDataKey = json_decode($jsonFile, true); // pour pouvoir récupérer les hostname
$jsonData = json_decode($jsonFile);
//Connexion à la bdd avec son test
$objBdd = mysqli_connect("lnxdev01", "admin", "adminadmin", "bddProjetInterface");
//Si la connexion à la base de données à réussie, on s'occupe de la mise à jour de ses données
if ($objBdd) {
//remplissage de la base de données
    //pour chaque objet json du fichiers
    foreach ($jsonData as $envt) {
        // récupération du $i ème hostname du fichier
        $valeurFqdn = array_keys($jsonDataKey)[$i];
       // pour passer au hostname d'après
        $i+=1;
    }


Je testerai ta méthode également !
Modifié par Cherrygolo (18 Jun 2018 - 09:48)
Ben j'ai appris avec la class PDO mais je trouve que mysqli est plus simple à comprendre... Et traiter le résultat d'une requête semble plus simple également.
Mais je vais devoir sûrement passer en pdo parce que le serveur ne semble pas comprendre le mysqli alors qu'il y a le package installé...
Modifié par Cherrygolo (18 Jun 2018 - 09:51)