IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Décodage JSON venant d'une BDD


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 184
    Par défaut Décodage JSON venant d'une BDD
    Hello,


    Dans une base de données j'ai un champ en format json tq :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"le pen":1912,"mélenchon":1378,"macron":1259,"zemmour":585,"lassalle":354,"pécresse":258,"jadot":174,"hidalgo":141,"dupont-aignan":127,"roussel":123,"poutou":37,"arthaud":31}
    Ce champ redescend parfaitement via une requête PHP mais d'un bloc. Je cherche à savoir comment récupérer chaque nom de candidat, et chaque valeur pour chaque candidat.

    J'ai bien essayé avec une boucle foreach mais peu concluant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // soit $candidats mon json présenté ci-dessus
    $data = json_decode($candidats, true);
    foreach ($data as $key=> $data1) {
        echo $key, " : ";
        echo $data1, "\n";
    }
    Ce code ne me redescend que le premier enregistrement.... Comment faire pour avoir l'intégralité des candidats ?

    Je vous remercie pour vos retours

    Sylvain

  2. #2
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 435
    Par défaut
    Bonjour,

    Si $candidats correspond bien au json présenté, tous les candidats s'affichent alors correctement de mon coté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $candidats = '{"le pen":1912,"mélenchon":1378,"macron":1259,"zemmour":585,"lassalle":354,"pécresse":258,"jadot":174,"hidalgo":141,"dupont-aignan":127,"roussel":123,"poutou":37,"arthaud":31}';
     
    $data = json_decode($candidats, true);
    foreach ($data as $key => $data1) {
        echo $key, " : ", $data1, "\n";
    }
    Essaye de faire un var_dump des variables $candidats et $data pour vérifier que tes données sont correctes.

  3. #3
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 184
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     echo json_decode($candidats);
    // retour (donnée brute venant de la bdd) : {"le pen":1912,"mélenchon":1378,"macron":1259,"zemmour":585,"lassalle":354,"pécresse":258,"jadot":174,"hidalgo":141,"dupont-aignan":127,"roussel":123,"poutou":37,"arthaud":31}{"le pen":2980,"macron":2690}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     //ça me redescend juste une ligne, et c'est la dernière ligne du json qui est affiché
           "candidats": {
                "candidat": "arthaud",
                "voix": 31
            }

    Il ne semble pas s'agir d'une chaîne de caractère mais d'un json... Comment convertir un json en chaîne de caractère en php ?

    Pour information complémentaire : Postman et Google Chrome m'affiche le JSON sous forme d'une chaine de caractère, mais Mozilla affiche "SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data at line 1 column 210 of the JSON data"

  4. #4
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 435
    Par défaut
    Le retour sur ton dernier message ne correspond pas au json présenté dans ton premier message.
    Dans ton dernier message, ton retour json n'est pas valide : tu as deux objets json à la suite sans nom.

    Quel est le retour de var_dump($candidats); sans json_decode ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 184
    Par défaut
    Le var_dump(print_r) demandé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"le pen":1912,"mélenchon":1378,"macron":1259,"zemmour":585,"lassalle":354,"pécresse":258,"jadot":174,"hidalgo":141,"dupont-aignan":127,"roussel":123,"poutou":37,"arthaud":31}{"le pen":2980,"macron":2690}
    Ici la première partie correspond au premier tour, et la seconde partie au second tour.

  6. #6
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 435
    Par défaut
    Tu peux nous montrer comment tu définies ta variable $candidats ?
    Ton code est dans une autre boucle (pour fetch les résultats de la requête sql par exemple) ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 184
    Par défaut
    J'ai cette requête sql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT candidats FROM election.resultats
    J'ai refait mon intégration en faisant en sorte que $candidats ne soit plus un json, mais un array.

    Du coup j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      foreach(array($candidats) as $key => $data){
                        print_r($key);
                        print_r($data);
     
    // 0{"\"le pen\":1912,\"mélenchon\":1378,\"macron\":1259,\"zemmour\":585,\"lassalle\":354,\"pécresse\":258,\"jadot\":174,\"hidalgo\":141,\"dupont-aignan\":127,\"roussel\":123,\"poutou\":37,\"arthaud\":31"}0{"\"le pen\":2980,\"macron\":2690"}
                };

  8. #8
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 435
    Par défaut
    foreach (array($candidats) as $key => $data) n'as pas de sens, tu dois parcourir la variable $candidats, pas un tableau constitué d'un seul élément.
    Je crains que tu ais la tête dans guidon, pas de honte ça nous arrive à tous d'autant plus que c'est vendredi
    Montre nous le reste de ton code car difficile de t'aider plus avec seulement ces extraits.

  9. #9
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 184
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $all_arr = array();
    $all_arr['total'] = $num;
    $all_arr["records"] = array();
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    extract($row);
     
    $all_item = array(
    "id_scrutin" => $scrutin,
    "nom_scrutin" => $nom_scrutin,
    "candidat" => $candidats
    );
     
    array_push($all_arr["records"], $all_item);
    }
    http_response_code(200);
    echo json_encode($all_arr);
    Le truc est donc de retrouver dans la ligne candidat tous les candidats présents à cette élection...

  10. #10
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 184
    Par défaut
    Voila la solution, qui était toute con..................

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
      while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
                extract($row);
                $liste_cand= json_decode($candidats); // étape 1
                $all_item = array(
                    "id_scrutin" => $scrutin,
                    "nom_scrutin" => $nom_scrutin,
                    "lieu" => $nom,
                    "date" => strftime("%d-%m-%Y", strtotime($date)),
                        "candidats" => array(), // étape 2
                        "scrutin" => Array(
                            "stats" => Array(
                              "nb_inscrits" =>  $nb_inscrits,
                                    "inscrits" => Array(
                                    "nb_abstentions" => $nb_abstentions,
                                          "votants" => Array(
                                              "nb_votants" => $nb_votants,
                                                  "votants" => Array(
                                                    "exprimes" => $nb_exprimes,
                                                    "nuls" => $nb_nuls,
                                                    "blancs" => $nb_blancs
                                                    )
                                            )
                                    )
                              )
                      )
                  );
                foreach($liste_cand as $key => $data){ //etape 3
                     $cand = array(
                          "nom_candidat" => $key,
                          "nb_voix" => $data
                     );
                array_push($all_item['candidats'], $cand); // étape 4
                };
     
                array_push($all_arr["records"], $all_item); // étape 5
          }
    };
    étape 1 : j'ai décodé mon json (venu de ma base de données),
    étape 2 : j'ai préparé mon array de réception de mon foreach,
    étape 3 : ma boucle foreach où je demande qu'à chaque enregistrement soit redescendu un tableau sous cette forme,
    étape 4 : j'injecte tous ces tableaux dans mon array de l'étape 2,
    étape 5 : j'injecte le tout dans mon tableau général que j'avais préparé en tout début de code (non visible dans ce code)


    Tout bête :/

    Merci à tous

    Sylvain

  11. #11
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 184
    Par défaut
    Plus difficile, j'ai réussi avec deux données que sont le nom du candidat et son score, maintenant je souhaiterais associé son parti politique.

    De ma base de données, j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // retour de print_r($candidats);
    {"{\"ARTHAUD Nathalie\",31,LO},{\"DUPONT-AIGNAN Nicolas\",127,DLF},{\"HIDALGO Anne\",141,PS},{\"JADOT Yannick\",174,EELV},{\"LASSALLE Jean\",354,DIV},{\"LE PEN Marine\",1912,RN},{\"MACRON Emmanuel\",1259,LREM},{\"MÉLENCHON Jean-Luc\",1378,LFI},{\"PÉCRESSE Valérie\",258,LR},{\"POUTOU Philippe\",37,NPA},{\"ROUSSEL Fabien\",123,PCF},{\"ZEMMOUR Éric\",585,EXD}"}
    Comment rentrer dedans ?.........

    J'ai essayé avec une boucle for, mais Mozilla semble ne pas considérer ça comme un tableau...
    Dans ma bdd, le champ est formaté en text[], qui est un tableau de tableaux....

    Merci pour votre aide

    PS : Désolé pour toutes ces questions qui peuvent paraître basiques....

    Sylvain




    MAJ : La solution est de créer un objet json coté base de données avec la fonction json_build_object....... Cela redescend un objet json dans le PHP, inutile de passer par une boucle puisque le json est déjà structuré.....

  12. #12
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 325
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 325
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"{\"ARTHAUD Nathalie\",31,LO},{\"DUPONT-AIGNAN Nicolas\",127,DLF},{\"HIDALGO Anne\",141,PS},{\"JADOT Yannick\",174,EELV},{\"LASSALLE Jean\",354,DIV},{\"LE PEN Marine\",1912,RN},{\"MACRON Emmanuel\",1259,LREM},{\"MÉLENCHON Jean-Luc\",1378,LFI},{\"PÉCRESSE Valérie\",258,LR},{\"POUTOU Philippe\",37,NPA},{\"ROUSSEL Fabien\",123,PCF},{\"ZEMMOUR Éric\",585,EXD}"}
    Ton JSON est complètement invalide, corrige-le avant d'aller plus loin, autrement tu seras toujours confronté à des problèmes.

    Pour mieux voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    {"
    {\"ARTHAUD Nathalie\",31,LO},
    {\"DUPONT-AIGNAN Nicolas\",127,DLF},
    {\"HIDALGO Anne\",141,PS},
    {\"JADOT Yannick\",174,EELV},
    {\"LASSALLE Jean\",354,DIV},
    {\"LE PEN Marine\",1912,RN},
    {\"MACRON Emmanuel\",1259,LREM},
    {\"MÉLENCHON Jean-Luc\",1378,LFI},
    {\"PÉCRESSE Valérie\",258,LR},
    {\"POUTOU Philippe\",37,NPA},
    {\"ROUSSEL Fabien\",123,PCF},
    {\"ZEMMOUR Éric\",585,EXD}
    "}

Discussions similaires

  1. TextView de donnes venant d'une BDD
    Par profecie dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 16/10/2011, 14h32
  2. [FPDF] MultiCell et retour à la ligne dans texte venant d'une BDD
    Par jekif dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 06/07/2011, 12h44
  3. probléme d'affichage d'image venant d'une bdd
    Par jolina1987 dans le forum Langage
    Réponses: 4
    Dernier message: 17/03/2010, 09h55
  4. [MySQL] Mettre données venant d'une BDD dans "id" d'une balise html
    Par maryooman dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/12/2009, 14h25
  5. [Conception] affichage image venant d'une bdd
    Par ph_anrys dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/06/2006, 09h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo