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

Langage PHP Discussion :

json_encode et objet qui contient une list


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut json_encode et objet qui contient une list
    Bonjour tout le monde ,
    j'ai créer une petite application de sport sur mon temps personnel pour découvrir le monde d’Android mais je rencontre une difficulté :
    mon application communique avec une BDD hébergée sur internet. J'utilise donc Gson pour récupérer les informations qui m’intéresse via des scripts Php.
    En BDD j'ai 3 tables :
    - une "exercices" qui référencie tout simplement des exercices de musculation
    - Une "muscle" qui contient les différents muscles du corps.
    - Une "exo muscle" qui me sert de liaison entre "exercice" et "muscle" car tout simplement un exercice contient une liste des muscles solliciter pour cet exercice.

    Voici mon script PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try {
    	...
    		$reponse = $bdd->query("SELECT exercices.*,muscles.* FROM exercices LEFT JOIN exomuscle ON exercices.id = exomuscle.id_exercice LEFT JOIN muscles ON exomuscle.id_muscle = muscles.id ");
    		$exercices = $reponse->fetchAll(PDO::FETCH_ASSOC);
    		$reponse->closeCursor();
    		echo(json_encode($exercices));
    	} catch (Exception $e) {
    		die('Erreur : ' . $e->getMessage());
        }
    Le truc c'est que niveau objet ma Class exercices contient une liste de muscles mais même si la requête me ramène les informations ma liste restée vide ...
    j’espère ne pas vous avoir perdu et je vous remercie d'avance pour toute aide apporter .

  2. #2
    Membre régulier Avatar de monaka
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2017
    Messages : 64
    Points : 107
    Points
    107
    Par défaut
    salut à ce niveau ,je ne vois pas trop le soucis,

    Le truc c'est que niveau objet ma Class exercices contient une liste de muscles mais même si la requête me ramène les informations ma liste restée vide
    ah bon ?

    et c'est quoi ta liste?
    La rigueur vient toujours à bout de l'obstacle.
    Les détails font la perfection, et la perfection n'est pas un détail.

    J'avais une charrette tirée par des chevaux, mais j'ai acheté une voiture avec un moteur.
    Est-ce que je dois tout le temps rouler avec le moteur, ou est-ce que je peux atteler mes chevaux à la voiture de temps en temps ?

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu as une classe Exercice ? où l'utilises-tu ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Bonjour à tout le monde;
    Alors oui en java j'ai deux classes :
    - Une class "Exercice "
    - Une class "Muscle"
    Et ma class "Exercice" à une list<Muscle>.
    Ça vous aiderait si je vous mets le code des classes ? Après ce sont des classes basiques.
    Le type de retour de ma demande gson est une list<Exercice>.
    Une bonne partie des variables de mes objets Exercice prennent bien la bonne valeur sauf la liste des muscles qui reste à null ...
    Je pensais que ça fonctionnait un peu comme hibernate en java, qu'il allait détecter automatiquement que l'instance de ma class contenait une liste d'une autre class et qu'il allait la gaver automatiquement mais non ...

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Ok donc tu as une application (android, je suppose, vu que tu nous parles de java) qui utilise une classe Exercice, qui utilise une classe Muscle.
    En face, tu as ton script PHP qui lit la base et fabrique du json.
    Le JSON généré par le PHP est envoyé à l'application, qui le traduit en classe Exercice/Muscle.

    Le problème est que une fois dans l'appli, ton Exercice n'a pas de muscles.

    C'est bien ça ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Je n'aurai pas mieux expliqué ^^

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Bon, donc il y a deux causes possibles :
    Soit ton app ne digère pas le JSON correctement
    Soit ton script PHP ne génère pas le JSON correctement

    As-tu testé directement avec un fichier json en entrée de ton app ? ou au moins as-tu le format attendu par ton app ?
    Si oui, as-tu vérifié si le format généré par ton script correspond ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  8. #8
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    D'accord je vais tester ça dès que j'aurai un peu de temps comme je développe l'application sur mon temps perso ...
    Par contre t pas la première requête que je fais les autres fonctionnes parfaitement mais il n'y a pas la même relation entre les classes (une classe exercice, qui utilise une classe muscle).
    Je vais approfondir mes tests dès que possible et je publirais les résultats.

  9. #9
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Alors après quelques tests voici ce que me renvoie le script PHP:
    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
     
    [
    	{
    		"id":"1",
    		"nom":"Biceps brachial",
    		"partieDuCorps":"Bras",
    		"machine":"1",
    		"description":"Debout, ...",
    		"cheminImage":"image.png"
    	},
    	{
    		"id":"3",
    		"nom":"Brachial",
    		"partieDuCorps":"Bras",
    		"machine":"1",
    		"description":"Debout, ...",
    		"cheminImage":"image.png"
    	}
    ]
    Je pense donc que mon problème vient de mon script voir plus précisément de ma requête Sql ...

    Je pense que ma réponse devrait plutôt ressembler à quelque chose comme ça :

    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
     
    [
    	{
    		"id":"1",
    		"nom":"Flexion alternée des avant-bras à la poulie basse",
    		"partieDuCorps":"Bras",
    		"machine":"1",
    		"description":"Debout, ...",
    		"cheminImage":"image.png",
    		"lstMuscles" : 
    		{
    			"id":"1",
    			"nom":"Biceps brachial"
    		},
    		{
    			"id":"2",
    			"nom":"Brachial"
    		}
    ]
    Voilà grossièrement à quoi ressemblent mes tables en BDD :

    Nom : test.png
Affichages : 132
Taille : 8,2 Ko

    Et voici mes deux class en java ;
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public class Exercice {
        /**
         * Id de l'exercice
         */
        private int id = 0;
        /**
         * Chemin de l'image de l'exercice
         */
        private String cheminImage = null;
        /**
         * Nom de l'exercice
         */
        private String nom = null;
        /**
         * Description de l'éxercice
         */
        private String description = null;
        /**
         * Partie du corps ciblée par l'exercice
         */
        private PartieDuCorps partieDuCorps = null;
        /**
         * Indique si cette exercice nécessite une machine ou non
         */
        private Boolean avecMachine = Boolean.FALSE;
        /**
         * Liste des muscles solliciter pour l'exercice
         */
        private List<Muscle> lstMuscles = null;
     
        /**
         * Constructeur
         * @param pId de l'éxercice
         * @param pCheminImage image de l'éxercice
         * @param pNom de l'éxercice
         * @param pDescription de l'éxercice
         * @param pPartieDuCorps de l'éxercice
         * @param pAvecMachine de l'éxercice
         * @param pLstMuscles de l'éxercice
         */
        public Exercice(final int pId, final String pCheminImage, final String pNom, final String pDescription, final PartieDuCorps pPartieDuCorps, final Boolean pAvecMachine, final List<Muscle> pLstMuscles) {
            this.id = pId;
            this.cheminImage = pCheminImage;
            this.nom = pNom;
            this.description = pDescription;
            this.partieDuCorps = pPartieDuCorps;
            this.avecMachine = pAvecMachine;
            this.lstMuscles = pLstMuscles;
        }
    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
    public class Muscle {
        /**
         * Id du muscle en BDD
         */
        private int id = 0;
        /**
         * Nom du muscle
         */
        private String nom = null;
     
        /**
         * Constructeur
         * @param pId du muscle
         * @param pNom du muscle
         */
        public Muscle(final int pId, final String pNom) {
            this.id = pId;
            this.nom = pNom;
        }
    Je vais essayer de chercher du coter de la requête je suis preneur de toutes idées

  10. #10
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Par défaut, PDO te renvoie toutes les infos au même niveau dans un même tableau (ou objet)
    Si tu veux quelque d'organisé, tu as 3 options :
    • Utiliser un ORM (par exemple Doctrine) Si tu es habitué au monde java, c'est plus ou moins équivalent à utiliser Hibernate au lieu de Jdbc. L'inconvénient, c'est qu'il va falloir faire un mapping et toute la configuration, ce qui pour un simple export JSON est peut-être un peu excessif
    • Fournir une classe à PDO et utiliser fetchObject. En gros, il faudrait créer l'équivalent PHP de tes classes Java, avec un constructeur adéquat et les utiliser à la récupération
    • Parser à la main le résultat de ta requête et construire toi-même le bon format pour ton JSON
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  11. #11
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    ok ... Étant novice dans les 3 points qu'elles seraient selon toi la solution la plus adapter ? La plus efficace ?
    Un peut déçus que JSON ne prenne pas complément en compte l'objet.

  12. #12
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    json_encode prend en compte l'objet, c'est juste que tu ne lui passes pas un objet en entrée

    Personnellement, je ferai ça à la main, parce qu'il n'y a pas beaucoup de colonnes et que c'est juste pour un export. Si tu as l'intention de faire d'autres exports de ce type, ça peut valoir le coup de mettre en place un vrai mapping.

    Quelque chose comme ça

    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
    $reponse = $bdd->query("SELECT exe.*, mus.id as mus__id, mus.nom as mus__nom FROM exercices exe LEFT JOIN exomuscle exm ON exe.id = exm.id_exercice LEFT JOIN muscles mus ON exm.id_muscle = mus.id");7
     
    $exercices = [];
    while($row = $reponse->fetchObject()) {
        $muscle = new StdClass();
        $muscle->id = $row->mus__id;
        $muscle->nom = $row->mus__nom;
        if (!isset($exercices[$row->id])) {
            // nouvel exercice à ajouter à la liste
            $exercices[$row->id] = $row;
            // on init la liste des muscles
            $row->lstMuscles = [];
            // on supprime les données du muscle
            unset($row->mus__id);
            unset($row->mus__nom);
        } 
        // on complète la liste de muscles
        $exercices[$row->id]->lstMuscles[] = $muscle;
    }
    echo(json_encode($exercices));

    Sinon, en alternative à un vrai ORM, j'ai trouvé une classe qui fait plus moins le travail à ta place.
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    <?php
    /**
     * (c) Anna Filina <anna@foolab.ca>
     * @license http://opensource.org/licenses/BSD-3-Clause
     */
    return function($statement, $classes = [], $singletonProperties = [])
    {
        // Ids enable us to list columns on the right objects.
        $dictionary = [];
        $create_class = function($alias) use ($classes)
        {
            if (array_key_exists($alias, $classes)) {
                return new $classes[$alias]();
            }
            return new stdClass();
        };
        $add_row = function($row, &$parent, &$dictionary) use ($create_class, $singletonProperties)
        {
            foreach ($row as $alias => $value) {
                if ($value === null) {
                    continue;
                }
                $alias_parts = explode('__', $alias);
                if (count($alias_parts) < 2) {
                    throw new Exception('Please format aliases according to the documentation: https://github.com/afilina/nestedsql/blob/master/README.md');
                }
                $id_alias = implode('__', array_slice($alias_parts, 0, -1)).'__id';
                $dict_key = "{$id_alias}/{$row[$id_alias]}";
                foreach ($alias_parts as $i => $alias_part) {
                    // Create new item, register in dictionary and add to list.
                    if ($alias_part == 'id') {
                        $list_property = $alias_parts[count($alias_parts)-2];
                        $parent_alias = implode('__', array_slice($alias_parts, 0, -2)).'__id';
                        if ($parent_alias != '__id') {
                            $parent_dict_key = "{$parent_alias}/{$row[$parent_alias]}";
                            $list_parent = $dictionary[$parent_dict_key];
                        } else {
                            $list_parent = $parent;
                        }
                        if (!property_exists($list_parent, $list_property) || $list_parent->$list_property == null) {
                            $list_parent->$list_property = [];
                        }
                        if (!array_key_exists($dict_key, $dictionary)) {
                            $list_element = $dictionary[$dict_key] = $create_class($list_property);
                        } else {
                            $list_element = $dictionary[$dict_key];
                        }
                        $list = $list_parent->$list_property;
     
    					if (in_array($list_property, $singletonProperties))
    						$list = $list_element;
    					else
    						$list[$row[$id_alias]] = $list_element;
                        $list_parent->$list_property = $list;
                    }
                    // Assign properties to object
                    if ($i == count($alias_parts) - 1) {
                        $dictionary[$dict_key]->$alias_part = $value;
                    }
                }
            }
        };
        $parent = new stdClass();
        while($row = $statement->fetch(\PDO::FETCH_ASSOC)) {
            $add_row($row, $parent, $dictionary, $singletonProperties);
        }
        $statement->closeCursor();
        return $parent;
    };
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  13. #13
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    D'accord je te remercie pour les exemples donc le premier s'est à la main et le second via mapping .
    Je vais peut-être essayer via le mapping comme je risque d'avoir d'autre requête de ce genre ...
    J'ai plus qu'à comprendre le code ^^

  14. #14
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Suite à de nombreux tests j'ai une nouvelle question : le formatage de JSON pour une liste d'objet s'écrit comment ?
    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
     
    	{
    		"id":"1",
    		"nom":"Flexion alternée des avant-bras à la poulie basse",
    		"partieDuCorps":"Bras",
    		"machine":"1",
    		"description":"Debout, ...",
    		"cheminImage":"image.png",
    		"lstMuscles" : 
    		{
    			"id":"1",
    			"nom":"Biceps brachial"
    		},
    		{
    			"id":"2",
    			"nom":"Brachial"
    		}
    ou
    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
     
    	{
    		"id":"1",
    		"nom":"Flexion alternée des avant-bras à la poulie basse",
    		"partieDuCorps":"Bras",
    		"machine":"1",
    		"description":"Debout, ...",
    		"cheminImage":"image.png",
    		"lstMuscles" :[ 
    		{
    			"id":"1",
    			"nom":"Biceps brachial"
    		},
    		{
    			"id":"2",
    			"nom":"Brachial"
    		}]

  15. #15
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Une liste en json s'écrit entre crochets "[]" : [a, b, c].
    C'est également valable pour une liste d'objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [ 
      {
        "id":"1",
        "nom":"Biceps brachial"
      },
      {
        "id":"2",
        "nom":"Brachial"
      }
    ]
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  16. #16
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Merci pour la réponse
    Je me suis re penché un peu sur la question et après de nombreux tests et recherches en prenant un peu un exemple sur ce que tu ma donné, je suis arrivé à un code qui fonctionne et j'aimerai bien avoir ton avis s'il y a possibilité de l'améliorer :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
     
    <?php
    	class Muscle implements JsonSerializable
    	{
    		/**
    		 * Id du muscle en BDD
    		 * @var int
    		 */
    		private $id;
    		/**
    		 * Nom du muscle
    		 * @var String
    		 */
    		private $nom;
     
    		public function getId()
    		{
    			return $this->id;
    		}
    		public function getNom()
    		{
    			return $this->nom;
    		}
     
    		public function setId($id)
    		{
    			$id = (int) $id; 
    			// On vérifie ensuite si ce nombre est bien strictement positif.
    			if ($id > 0)
    			{
    				// Si c'est le cas, c'est tout bon, on assigne la valeur à l'attribut correspondant.
    				$this->id = $id;
    			}
    		}
     
    		public function setNom($pNom){
    			$this->nom = $pNom;
    		}
     
     
    		function __construct($pID,$pNom) {
    			$this->setId($pID);
    			$this->setNom($pNom);
    		}
     
    		public function jsonSerialize() {
    			return [
    				'id' => $this->id,
    				'nom' => $this->nom
    			];
    		}
     
    	}
     
    	class Exercice implements JsonSerializable
    	{
    		/**
    		 * Id de l'exercice
    		 * @var int
    		 */
    		private $id;
    		/**	 
    		 * nom de l'exercice
    		 */
    		private $nom;
    		/**
    		 * Partie du corps ciblée par l'exercice
    		 */
    		private $partieDuCorps;
    			/**
    		 * Indique si cette exercice nécessite une machine ou non
    		 */
    		private $avecMachine;
    			/**
    		 * Description de l'éxercice
    		 */
    		private $description;
    		/**
    		 * Chemin de l'image de l'exercice
    		 * @var String
    		 */
    		private $cheminImage;
     
    		/**
    		 * Liste des muscles solliciter pour l'exercice
    		 */
    		private $lstMuscles = array();
     
     
     
     
    		public function getId()
    		{
    			return $this->id;
    		}
    		public function getNom()
    		{
    			return $this->nom;
    		}
    		public function getPartieDuCorps()
    		{
    			return $this->partieDuCorps;
    		}
    		public function getAvecMachine()
    		{
    			return $this->avecMachine;
    		}
    		public function getDescription()
    		{
    			return $this->description;
    		}
    		public function getCheminImage()
    		{
    			return $this->cheminImage;
    		}
    		public function getMuscles()
    		{
    			return $this->lstMuscles;
    		}
     
    		public function setId($id)
    		{
    			$id = (int) $id; 
    			// On vérifie ensuite si ce nombre est bien strictement positif.
    			if ($id > 0)
    			{
    				// Si c'est le cas, c'est tout bon, on assigne la valeur à l'attribut correspondant.
    				$this->id = $id;
    			}
    		}
     
    		public function setNom($pNom){
    			$this->nom = $pNom;
    		}
    		public function setPartieDuCorps($pPartieDuCorps){
    			$this->partieDuCorps = $pPartieDuCorps;
    		}
    		public function setAvecMachine($pAvecMachine){
    			$this->avecMachine = $pAvecMachine;
    		}
    		public function setDescription($pDescription){
    			$this->description = $pDescription;
    		}
    		public function setCheminImage($pCheminImage){
    			$this->cheminImage = $pCheminImage;
    		}
     
    		public function addMuscle($pMuscle){
    			array_push($this->lstMuscles,$pMuscle);
    		}
     
    		function __construct($donnees) {
    			$this->setId($donnees->id);
    			$this->setNom($donnees->nom);
    			$this->setPartieDuCorps($donnees->partieDuCorps);
    			$this->setAvecMachine($donnees->avecMachine);
    			$this->setDescription($donnees->description);
    			$this->setCheminImage($donnees->cheminImage);
    		}	
     
    		public function jsonSerialize() {
    			$tab2  = array();
    			foreach ($this->lstMuscles as &$muscle) {
    				array_push($tab2,$muscle);
    			}
    			$tab  = array(
    				'id' => $this->id,
    				'nom' => $this->nom,
    				'partieDuCorps' => $this->partieDuCorps,
    				'avecMachine' => $this->avecMachine,
    				'description' => $this->description,
    				'cheminImage' => $this->cheminImage,
    				'lstMuscles' => $this->lstMuscles
    			);
     
    			return $tab;
    		}		
    	}
     
     
    	try {
    			try {
    				$bdd = new PDO('mysql:host=XXXXXXXX;dbname=XXXXXXXXX', 'XXXXXXXXX', 'XXXXXXXXXX', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    				$exo = array();
    				$reponse = $bdd->query("SELECT exe.*, mus.id as mus__id, mus.nom as mus__nom FROM exercices exe LEFT JOIN exomuscle exm ON exe.id = exm.id_exercice LEFT JOIN muscles mus ON exm.id_muscle = mus.id");
    				while($donnees = $reponse->fetchObject()) {
    					$exercice = new Exercice($donnees);
    					if (!array_key_exists($exercice->getId(), $exo)) {
    						$exo[$exercice->getId()] = $exercice;
    					}
    					$muscle = new Muscle($donnees->mus__id,$donnees->mus__nom);
    					$exo[$exercice->getId()]->addMuscle($muscle);
     
    				}
    				$reponse->closeCursor();
    				echo json_encode(array_values($exo));
    			} catch (Exception $e) {
    				// En cas d'erreur, on affiche un message et on arrête tout
    				die('Erreur : ' . $e->getMessage());
    			}
     
    		} catch (Exception $e) {
    			// En cas d'erreur, on affiche un message et on arrête tout
    			mail('XXXXXXXXXXX@gmail.com','Exception connexion','Erreur : ' . $e->getMessage());
    			die('Erreur  de connexion BDD: ' . $e->getMessage());
    		}
    ?>
    Ce n'est pas vraiment de l'ORM, mais en gros je fais ma requête en base, je récupère les données que je transforme en objet puis je les encode en JSON.
    Par la suite je sortirai les deux class du script et je les appelleraient via un include .
    Voilà je suis preneur de toute remarque .

Discussions similaires

  1. protéger une seule cellule qui contient une liste déroulante
    Par rihab92 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/02/2015, 11h15
  2. pouvoir copier un texte qui contient une liste deroulante
    Par cool2505 dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 03/10/2014, 12h23
  3. Verrouiller une cellule (qui contient une liste) si j+30
    Par micnac dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 27/05/2014, 14h12
  4. Réponses: 7
    Dernier message: 26/05/2014, 08h39
  5. telecharger un fichier zip qui contient une liste de fichier à supprimer
    Par joulive dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 29/07/2009, 13h54

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