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

jQuery Discussion :

Data retour avec JSON


Sujet :

jQuery

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut Data retour avec JSON
    Bonjour,

    j'ai récupérer un petit code basé sur Jquery pour faire des appels AJAX, ça fait très bien ce dont j'ai besoin lorsque je n'ai besoin que de deux valeur (index + valeur par exemple), mais dès que j'en veut plus, ça ne marche pas, je n'arrive pas à modifier le code. N'étant pas codeur à la base, je viens ici chercher quelques explications.

    Mon JS :
    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
    var $mdph = $('#id_notif_mdph');
    var $type_notif_mdph = $('#type_notif_mdph');
     
    $mdph.on('change', function() {
    	var val = $(this).val(); 
    	if(val != '') {
    		$type_notif_mdph.empty(); 
    		$.ajax({
    			url: 'fonction/mdph.php',
    			type: 'GET',
    			data: 'id_mdph='+ val, 
    			dataType: 'json',
    			success: function(json4) {
    				$.each(json4, function(index, value) {
    					$type_notif_mdph.append('<option value="'+ index +'">'+ value +'</option>');
    					$type_notif_mdph.on('change', function() {
    						//var val = $(this).val();
    						//$('#rne_etab').val(val);
    						//$('#rne_etab').change();	
    									});	
    					$type_notif_mdph.change();	
    				});
    			}
    		});				
    	}
    });
    Mon fichier mdph.php
    Code php : 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
    <?php
    if(isset($_GET['go']) || isset($_GET['id_mdph'])) {
     
        $json = array();
     
        if(isset($_GET['go'])) {
            //si j'ai besoin
        } else if(isset($_GET['id_mdph'])) {
     
            // requête qui récupère la liste des notif mdph
            $requete = "SELECT * FROM notification_mdph WHERE  id_notif_mdph = '".$_GET['id_mdph']."' ORDER BY  id_notif_mdph";    }
     
        // connexion à la base de données
        try {
            $bdd = new PDO('mysql:host=localhost;dbname=gaela', 'root', 'xx');
        } catch(Exception $e) {
            exit('Impossible de se connecter à la base de données.');
        }
        // exécution de la requête
        $resultat = $bdd->query($requete) or die(print_r($bdd->errorInfo()));
     
        // résultats
        while($donnees = $resultat->fetch(PDO::FETCH_ASSOC)) {
            // je remplis un tableau et mettant l'id en index
            $json4[$donnees[' id_notif_mdph']][] = utf8_encode($donnees['type_notif_mdph']);
        }
     
        // envoi du résultat au success
        echo json_encode($json4);
    }
    ?>

    Je ne comprends pas cette partie :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while($donnees = $resultat->fetch(PDO::FETCH_ASSOC)) {
            // je remplis un tableau et mettant l'id en index
            $json4[$donnees[' id_notif_mdph']][] = utf8_encode($donnees['type_notif_mdph']);
    }
    Ok pour le while, mais pour le reste ??? Si je veux rajouter une données en plus comme : [$donnees['date_notif_mdph']], je fais comment ?
    Suis-je limité à un index + une valeur ?

    Merci beaucoup pour votre aide.

  2. #2
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut
    La partie que tu ne comprends pas me semble comporter une erreur. Une variable y est nommé $json4 alors quelle est déclaré plus haut comme $json = array().

    Bref si on décompose pour chaque fetch du résultat de ta requête tu récupère un tableau $donnees qui contient au moins les informations suivantes:

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($donnees); // array(2) { ["id_notif_mdph"]=> int(0) ["type_notif_mdph"]=> string(4) "test" }

    Dans ton tableau $json4 ou $json on va simplement ajouter dynamiquement un index qui sera égale à $donnees['id_notif_mdph'] puis dynamiquement nous implémentons un tableau comme valeur qui va prendre l'encodage UTF-8 de la valeur de $donnees['id_notif_mdph'].

    Pour avoir un résultat ressemblant à N fois ceci:

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($json4); // array(1) { [0]=> array(1) { [0]=> string(4) "test" } }

    Pour répondre à la suite du problème non tu n'est pas limité on pourrais imaginer ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while($donnees = $resultat->fetch(PDO::FETCH_ASSOC)) {
            // je remplis un tableau et mettant l'id en index
            $json4[$donnees[' id_notif_mdph']] = array('type_notif_mdph' => $donnees['type_notif_mdph'], 'date_notif_mdph' => $donnees['date_notif_mdph']);
            // array(1) { [0]=> array(1) { ['type_notif_mdph']=> string(4) "test", ['date_notif_mdph']=> string(10) "03/03/2015" } }
    }
    N'oublie pas d'encoder chaque valeur afin d'éviter tout problème avec json_encode et c'est bon
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Merci pour la réponse.
    J'ai surtout un problème avec la syntaxe. Dans mon cas, ça ferait un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $json4[$donnees[' id_notif_mdph']][utf8_encode($donnees['type_notif_mdph']),utf8_encode($donnees['date_notif_mdph']];
    ou comme ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $json4[$donnees[' id_notif_mdph']][] = utf8_encode($donnees['type_notif_mdph']), utf8_encode($donnees['date_notif_mdph']];

  4. #4
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut
    Ni l'une ni l'autre malheureusement.

    Déjà utf8_encode est une fonction permettant d'encoder une chaîne de caractère en UTF-8 si elle ne l'est pas déjà, uniquement pour s'assurer que la fonction json_encode fonctionne correctement.

    Je partage ci-dessous une fonction qui me sert sur un projet qui a été créer avec un encodage iso-8859-1 et qui pose problème a chaque fois que je souhaite faire un json_encode:

    Code PHP : 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
     
    /**
     * Permet l'encodage ou le décodage d'une chaîne de caractère ou d'un tableau.
     *
     * @param mixed [$var] une chaîne de caractère ou un tableau à encoder ou décoder.
     * @param string [$mode] une chaîne de caractère représentant les fonctions `utf8_encode` & `utf8_decode`.
     * @return mixed retourne [$var] traité ou non.
     */
    function arrToUtf8 ($var, $mode = 'utf8_encode') {
    	if (!is_string($mode) && !in_array($mode, array('utf8_encode', 'utf8_decode'))) {
    		return $var;
    	}
     
    	if (is_string($var)) {
    		return $mode($var);
    	}
     
    	if (is_array($var)) {
    		$newVar = array();
     
    		foreach ($var as $key => $value) {
    			$newVar[$mode($key)] = is_array($value) ? arrToUtf8($value, $mode) : $mode($value);
    		}
     
    		return $newVar;
    	}
     
    	return $var;
    }

    Elle permet d'agir directement sur un tableau et occasionnellement dans les deux sens. Ainsi tu n'as qu'a reprendre ce que j'ai écris:

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while($donnees = $resultat->fetch(PDO::FETCH_ASSOC)) {
            // je remplis un tableau et mettant l'id en index
            $json4[$donnees[' id_notif_mdph']] = array('type_notif_mdph' => $donnees['type_notif_mdph'], 'date_notif_mdph' => $donnees['date_notif_mdph']);
            // array(1) { [0]=> array(1) { ['type_notif_mdph']=> string(4) "test", ['date_notif_mdph']=> string(10) "03/03/2015" } }
    }
     
    var_dump($json4); // Afin de bien vérifier si les données semblent correctes
     
    echo json_encode(arrToUtf8($json4)); // On encode en UTF-8 chaque valeurs du tableau $json4 afin d'éviter les erreurs pour l'encodage json.
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Merci pour la fonction, ça va être bien pratique.
    Je comprends mieux la notation avec array et parenthèse que crochet, c'est plus clair.

    Sur le principe, je comprends ce que je vais recevoir, mais comment l'afficher ?

    Avec ça, ça marchait temps que j'avais que deux données ... Mais là, ça ne marche plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    success: function(json4) {
    	$.each(json4, function(index, value) {
    		$type_notif_mdph.append('<option value="'+ index +'">'+ value +'</option>');
    		$type_notif_mdph.change();	
    	});
    }
    En lisant l'aide de cette page, j'ai l'impression que $.each ne permet qu'un index + un élément ...
    http://www.w3schools.com/jquery/misc_each.asp

  6. #6
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut
    Le each de jquery est simplement une boucle for qui permet d'appliquer une fonction sur chaque élément de l'objet qui lui est passé.

    ici un petit exemple pour ton cas d'utilisation de ce qui se passe: http://jsfiddle.net/91vxwnkn/2/

    Pour faire court, en JS il te suffit largement de connaître la structure de tes données pour arriver a créer des fonctionnalités ou même des applications facilement. Je ne dis pas qu'il ne faut connaître que ça mais ça te permet d'apprendre tous les autres rouages derrières.
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

  7. #7
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 955
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 955
    Points : 44 103
    Points
    44 103
    Par défaut
    Bonjur,
    En lisant l'aide de cette page, j'ai l'impression que $.each ne permet qu'un index + un élément ...
    http://www.w3schools.com/jquery/misc_each.asp
    pourquoi diable ne pas lire la documentation officielle ?
    jQuery.each()

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Peut-être parce que w3schools apparaît maintenant dans google très souvent avant les doc officielles (et pas que pour jquery) ? C'est pas hors sujet bien sûr mais pas pertinent comme premier résultat. De là à dire que google perd de plus en plus de pertinence...

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    AJAX renvoie json4, qui est un array à plusieurs dimensions.
    value est AUSSI un array (sauf erreur...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    success: function(json4) {
    	$.each(json4, function(index, value) {
    		// value est AUSSI un array
    		var recup_type = value.type_notif_mdph;
    		var recup_date = value.date_notif_mdph;
    		// ...
    	});
    }

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Oui, c'est aussi un tableau.
    Avec ça dans mon fichier de traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while($donnees = $resultat->fetch(PDO::FETCH_ASSOC)) {
            $json4[$donnees[' id_notif_mdph']] = array('type_notif_mdph' => $donnees['type_notif_mdph'], 'date_notif_mdph' => $donnees['date_notif_mdph']);
    	}
    echo json_encode(arrToUtf8($json4));
    Firebug m'affiche ce résultat dans le filtre Réseaux, XHR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    array(1) {
      [""]=>
      array(2) {
        ["type_notif_mdph"]=>
        string(5) "AVS M"
        ["date_notif_mdph"]=>
        string(10) "2014-03-01"
      }
    }
    {"":{"type_notif_mdph":"AVS M","date_notif_mdph":"2014-03-01"}}
    Mais je ne sais pas comment exploiter ça ... L'index n'a pas l'air d'être présent


    Edit : Merci à tous de m'avoir apporté votre aide.
    Cependant, je sens bien que je touche la limite de mes capacités et n'étant pas codeur c'est vraiment compliqué ! ^^
    Je change donc mon fusil d'épaule et je vais repensé mon projet. Ça aura une tête plus ... traditionnelle.
    Merci beaucoup.

  11. #11
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut
    Concrètement ta structure est correct, étrange mais tout rien de choquant.

    Dans la fonction de callback success si tu fais un console.log(json4) tu devrais avoir un objet qui contient un autre objet avec deux clés c'est typiquement la traduction de ce que t'affiche firebug.

    Dans ton success tu peux accèder à chaque élément de cette manière la:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (var a in json4) {
      console.log(json4[a].type_notif_mdph) // "AVS M"
    }
    La ou ça pose problème c'est soit à cette ligne la:
    $json4[$donnees[' id_notif_mdph']] = array('type_notif_mdph' => $donnees['type_notif_mdph'], 'date_notif_mdph' => $donnees['date_notif_mdph']);Car c'est ici que l'index dont tu parles et qui n'est pas présent est déclaré, je note au passage que la clé est notée : $donnees[' id_notif_mdph'] avec un espace ce qui est peut être une erreur. Dans ton PHP tu peux donc effectuer ceci var_dump($json4); juste après ta boucle while afin de vérifier si la clé est cette fois ci correctement définis.

    Si elle ne l'est pas tu auras quasiment le même affichage que Firebug.

    Sinon le problème peut provenir de la fonction que j'ai écrite arrToUtf8().
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Oui, l'espace est une erreur de ma part.

    Merci pour ces explications. Je suis partie sur une autre méthode plus simple car je ne peux resté bloqué sur ce problème trop longtemps et puis c'est pas de mon niveau !
    Cependant, je garde au chaud vos explications, ça pourrait me resservir plus tard, dans le cas où je n'ai pas d'autre solutions que les appels AJAX (très pratique !!! mais pas évident à mettre en place à mon niveau)

    Encore merci !

Discussions similaires

  1. Retour inexistant avec json
    Par yann18 dans le forum jQuery
    Réponses: 2
    Dernier message: 03/11/2011, 14h04
  2. Ajax avec jQuery: envoi par POST retour en JSON
    Par band22 dans le forum jQuery
    Réponses: 1
    Dernier message: 14/10/2011, 10h54
  3. Remplir objet avec retour objet json
    Par steve3000 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/06/2009, 12h03
  4. Message:" System .data.datatablecollection" avec datarow
    Par andres007 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 26/02/2007, 22h50
  5. appel sous-formulaire et retour avec ecran normal
    Par pat1545 dans le forum Access
    Réponses: 1
    Dernier message: 31/07/2006, 19h18

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