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 :

Typer les données de mysql pour json [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 134
    Points
    134
    Par défaut Typer les données de mysql pour json
    Bonjour,

    j'essaie de transformer des données issues de mysql en json.
    j'y arrive grâce à json_encode()
    mais je ne sais pas comment garder le type de mes données, parce que le json généré est tout en string.
    {"NUMCLI":"2","NOM":"hero","PRENOM":"tif","ADRESSE":"23 rue delarue","CP":"92000","ville":"clamart"}
    mon code est comme suit :
    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
     
    <?php
    echo "<hr>";
       $tablo = array();
       $sql="SELECT * FROM client";
       $res = $idcom->query($sql);
     
    while ($lig = $res ->fetch_assoc()) {
       foreach($lig as $champs => $valeur)
        $tablo[$champs] = $valeur ;
       }//fin du while
    print_r($tablo);
    echo "<br>";
    echo json_encode($tablo);
    ?>
    vous remarquez que mes identifiants sont entre guillemets.
    Comment faire?
    Je vous remercie d'avance pour votre aide.

  2. #2
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Est-ce que tu ne pourrais pas simplement construire la chaîne toi-même au lieu de passer par json_encode()? Comme tu connais déjà la structure, tu peux aisément le faire. Voici même un exemple qui, je crois, devrait fonctionner relativement bien.

    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
     
    echo "<hr>";
       $tablo = array();
       $sql="SELECT * FROM client";
       $res = $idcom->query($sql);
       $chaine = "";
       $premierTour = true;
     
    while ($lig = $res ->fetch_assoc()) {
       chaine = "{";
       premierTour = true
       foreach($lig as $champs => $valeur)
       { 
           if (!$premierTour)
                  chaine .= ",";
     
           chaine .= $champs . ":" . $valeur;
           $premierTour = false;
       } //fin du foreach
     
       chaine .= "}";
     
       echo $chaine;
     
       }//fin du while
     
    echo "<br>";
    Évidemment, si tu veux garder le contenu de $chaine, il faut le stocker quelque part, car là il est perdu à chaque tour de boucle . Après, si tu veux entourer uniquement les données textuelles de guillemets, il faudrait que tu stocke quelque part le type générique(texte ou chiffre) de chacun des champs de ta table et que tu les charges dans un tableau et faire un IF la-dessus pour ajouter les guillemets au besoin.

    J'espère ne pas t'avoir trop embrouillé. Bonne chance

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 134
    Points
    134
    Par défaut
    Merci pour ta réponse !

    Je vois l'altérnative de construire le format json soit même.
    Mais, cela ne résoud pas mon problème.
    Je veux que ce qui est integer dans la base soit pris comme integer dans le formalisme json.
    Et je ne sais pas comment le faire ?
    Merci

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Si je me réfère à ce que j'ai lu dans la doc de jQuery, apparemment la syntaxe a évoluée dans la dernière version (1.8.1), et ceci demande à ce que tous les contenus soient dans des séparateurs, des double quote comme tu l'as fait.

    Donc si tu veux indiquer quel est le type de chaque donnée, je ne vois pas d'autre solution que de l'indiquer explicitement.

    Théoriquement ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {
     "NUMCLI":{"type":"int", "value":"2"},
     "NOM":{"type":"string", "value":"hero"},
     ... etc ...
    }
    Mais faudrait voir l'usage que tu as de ces données, ça peut être inutile de le faire dans le JSON, car le typage peu très bien se faire directement dans le code, genre en JS : parseInt(NUMCLI, 10).
    Faut voir.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 134
    Points
    134
    Par défaut
    Merci pour la réponse !
    Justement, j'essaie de produire un graphique avec Dojo.

    et je veux construire un fichier json de la sorte (un test que j'utilise) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    echo "[
            { x: 0, y: 110},
            { x: 10, y: 24},
            { x: 15, y:63},
            { x: 25, y: 5},
            { x: 40, y: 98},
            { x: 45, y: 54}
    ]";
    Mais, quand je fais mon mysql_fetch_row, et je remplie mon array, toutes les données initialement en String dans la base sont entre guillemets. Donc, mon code javascript ne reconnais que les Integer pour présenter le graph.

    Je suis dans un dilemme et perdu ! je ne sais pas comment procéder.

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    C'est à mon sens une erreur de croire que la présence ou l'absence des quotes (ou guillemets) indiquerait le type de donnée.
    Déjà, c'est extrêmement mince comme info, ça ne dira jamais si c'est un integer, un booléen ou un float, de même qu'une date, timestamp, etc, etc ...

    J'en suis pas certain, mais il me semble que la norme (la stricte) impose au format JSON que toutes les données, que ce soit les clés ou valeurs soient comprises entre des délimiteurs (quotes), et c'est fait pour dire quand ça commence, et quand ça termine, et c'est nettement mieux ainsi.
    C'est apparemment ce que fait la fonction json_encode(), elle quote toutes le données.

    En faite, le format JSON (au même titre que le CSV, XML, etc ...) ce n'est ni un langage, ni une Bdd, c'est juste un format de stockage pure, donc qu'il y ait aucune notion de type de données, c'est finalement normal.
    C'est à soit même de le définir si c'est l'usage qu'on en a.
    D'ailleurs, même pour une Bdd, le type ne se fait pas automatiquement, il faut bien à un moment définir le type de donnée des champs, et c'est à la création.
    Pourquoi il en serait pas de même dans le JSON ?

    Donc tant que tu n'indiqueras pas explicitement les types de données que tu stock, tu n'auras rien pour t'appuyer dessus.
    C'est l'exemple que j'ai mis plus haut,et il suffirait de le rajouter dans les types dans le tableau ($tablo).
    Soit tu rajoute les types "en dur", soit plus automatisé en prospectant du coté de mysql_fetch_field(), ou coté SQL SHOW TABLE ou SHOW COLUMNS.
    Après cote JS, appliquer un typage, si c'est un INT : parseInt().


    Sinon, faut pas utiliser de librairie, Dojo, ou autre, ni même les fonctions Php, donc tout faire toi même (écrire ton format, et le parseur), mais ça ne sera pas propre si tu par du principe : pas de quote -> int, quote -> string.
    D'ailleurs, les x et y sont des chaines dans ton exemple, normalement il faudrait des quotes, quand bien même que ce soit les clés (ou index).
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  7. #7
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Javascript contient des fonctions de conversion pour les données. Notamment parseFloat et parseInt. Si tu sais quel type tes données sont, tu peux peut-être les utiliser pour résoudre ton problème. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    parseFloat("123.45"); // retourne la valeur Float de la chaine passée en paramètre

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 134
    Points : 134
    Points
    134
    Par défaut
    Merci pour vos réponses, maintenant tout cela est plus clair dans mon petit cerveau.

    Effectivement, je ne dois même pas me préoccuper du type des données.

    J'ai fait une boucle qui construit les données au format JSON et dont je soumet l'adresse du fichier à mon DOJO pour générer un graph, et cela marche très bien.

    voilà mon bout de code :
    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
     
    <?php
     
       $sql="SELECT INDEX1 FROM CONSOMMATION";
       $res = $idcom->query($sql);
       $debut = true;
       $nbCol= $res ->field_count;  //nombre de colonnes
       //on ouvre la cote au début
       echo "[";
       //boucle sur les différentes lignes de résultats
       while($lig = $res -> fetch_row()){
     
           //gestion de l'accolade du début
              if ($debut){
                  echo "";
                  $debut = false;
              } else {
                  echo ",";
              }//fin if
          foreach ($lig as $colonne => $element){
             echo "".$element."";
             //conditionne la virgule de la fin
             for($i=0;$i<$nbCol;$i++){
                if ($i != $nbCol-1)	echo ",";
             }//fin for
          }//fin foreach
       }//fin while
       //on ferme la cote de la fin
       echo "]";
     
    ?>
    le résultat qui correspond à des points dans un graphique est sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [100,456,45,90,87,12,5]
    Adam

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Utiliser les données d'Excel pour obtenir un doc word
    Par Raphael39 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/12/2010, 10h55
  2. [MySQL] Interface web pour modifier les données de MySql
    Par roots_man dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/11/2010, 11h42
  3. Réponses: 2
    Dernier message: 16/01/2010, 11h52
  4. Importer les données dans Mysql
    Par Clotilde dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 21/10/2006, 20h30
  5. [Struts] Interêt de typer les données d'un formulaire ?
    Par Gildas Huart dans le forum Struts 1
    Réponses: 9
    Dernier message: 21/04/2005, 16h39

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