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 :

[jQuery / JSON /PHP] Effectuer une requete et envoyer le resultat en JSON


Sujet :

jQuery

  1. #1
    Invité
    Invité(e)
    Par défaut [jQuery / JSON /PHP] Effectuer une requete et envoyer le resultat en JSON
    Bonjour

    Je viens ici afin d'avoir quelques éclaircissements sur mon problème (logique, sinon pourquoi poster ? ).
    Je vous le détaille.

    J'ai d'un côté, un script client quasi-full ajax. Il s'agit d'un système d'upload de photos, basé sur Uploadify.
    J'utilise jQuery afin de rajouter des effets graphiques, rendre la navigation plus plaisante...

    Voici ce que fait le script client :
    1. On saisie le(s) photo(s) à envoyer sur le serveur (on peut faire du multiupload) ;
    2. Les photos sont uploadées, renommées (à l'aide de microtime + rand) ;
    3. En parallèle, on enregistre le nom orignal de la photo ainsi que diverses informations dans un BDD ;
    4. On affiche un formulaire pour saisir des tags, infos... pour chaque photo précédemment up (c'est ici que j'ai un soucis)


    Revenons à l'étape 3.
    Ma photo est uploadée, à la fois le fichier (dans une répertoire) et les infos (dans la BDD).
    Je dois alors récupérer dans la BDD tout ce qui vient d'être enregistré. Je lance donc à la fin de l'upload un script PHP (form.php, à l'aide de jQuery.post() ) qui récupère tout ça.
    Je dois ensuite envoyer le résultat à la page cliente (index.php) le résultat de cette récupération.

    Pour ça, j'utilise JSON.
    Voici mon form.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
    20
    21
    22
    <?php
     
        $handle = mysql_connect('localhost', 'root', '');
        $db = mysql_select_db('galerie');
     
        $request = "SELECT CONCAT('[',
                    GROUP_CONCAT(
                        CONCAT('{id:',id,''), 
                        CONCAT(',nom:',nom,''),
                        CONCAT(',url:',url,'}')
                        ),
                    ']')
                    AS json
                    FROM media
                    WHERE session='".$_POST['session'];
        $result = mysql_query($request);
        //$tab = mysql_fetch_array($result);
        mysql_close($handle);
     
        echo json_encode($result);    
     
    ?>
    Et la gestion côté client (je ne met que la partie concernée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    jQuery.post("form.php", { session: "<?php echo $session; ?>" },
            function(data){
                alert(data.id); // Test
            }, "json");
    Seulement, le alert() m'indique que data.id est indéfini.
    Et si je ne met que data, j'obtiens false au lieu de la chaine JSON.


    Quelqu'un saurait m'indiquer mon erreur ?
    Merci d'avance !
    Dernière modification par Invité ; 07/10/2009 à 11h17.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    c'est visiblement que JQuery ne sait pas quelle valeur passer à la function anonyme en tant que "data", non ?
    Le fait que tu obtiennes "false" en faisant un est le signe que data est indéfini
    Ce data est censé être connu de JQuery ou c'est toi qui aurait dû le définir ?

    A+

  3. #3
    Invité
    Invité(e)
    Par défaut
    Tout d''abord, merci pour le déplacement du post. Je n'avais pas remarque qu'il y avait une section jQuery.

    C'est un bout de code tiré de la doc officiel de jQuery.
    D'après ce que je comprend, le data correspond à la réponse du script appelé.

    Voici le code de la doc officielle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $.post("test.php", { func: "getNameAndTime" },
      function(data){
        alert(data.name); // John
        console.log(data.time); //  2pm
      }, "json");
    Donc, logiquement, data devrait contenir la chaine JSON non ?

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Oui, mais le .name et le .time font référence à des attributs définis dans la chaîne JSon.
    Es-tu sûr de ton retour Ajax ?

    A+

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'ai testé ma requête dans PhpMyAdmin, elle fonctionne.
    Je pense que le soucis vient du retour de la requête. Peut-être vaut-il mieux que je copie le résultat dans un tableau tout frais, avant de faire l'envoi en JSON ?

    Je vais essayer ça avec une requête simplifiée, parce qu'en effet, là je ne suis pas sûr du tout de mon retour Ajax...

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Salut,
    A priori, si alert(data) renvoie false, c'est que c'est le résultat de :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    echo json_encode($result);
    ce qui pourrait signifier que l'encodage JSON n'a pas été possible

  7. #7
    Invité
    Invité(e)
    Par défaut
    Test tout simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $a = array('id'=>1);
     
    echo json_encode($a);
    Et miracle, ce bout de code fonctionne !
    Me reste à trouver pourquoi $result ne convient pas (je soupçonne l'encodage des caractères, à voir).

    J'ai viré les mysql_, pour revenir sur PDO. Même pour des test, ça reste plus pratique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        $dsn = 'mysql:dbname=galerie;host=127.0.0.1';
        $user = 'root';
        $password = '';
     
        $db = new PDO($dsn, $user, $password);
     
        $request = "SELECT id, nom, url FROM media WHERE session='".$_POST['session'];
     
        /* Récupération de toutes les lignes d'un jeu de résultats */
        $query = $db->prepare($request);
        $query->execute();
        $result = $query->fetchAll();

    Merci pour vos réponses, ça me guide sur les vérifications à effectuer

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ca y est, ça fonctionne
    Il y avait en fait deux erreurs : l'encodage du fichier (qui n'était pas en UTF-8) et la requête SQL (il y avait un quote en trop...).

    J'ai aussi ajouté un PDO::FETCH_ASSOC lors du tri de la requête, histoire d'avoir un tableau correctement ordonné.

    Voici le code du 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
    <?php
     
        $dsn = 'mysql:dbname=galerie;host=127.0.0.1';
        $user = 'root';
        $password = '';
     
        $db = new PDO($dsn, $user, $password);      
     
        $request = "SELECT id, nom, url FROM media WHERE session=".$_POST['session'];
     
     
        /* Récupération de toutes les lignes d'un jeu de résultats */
        $query = $db->prepare($request);
        $query->execute();
        $result = $query->fetchAll(PDO::FETCH_ASSOC);
     
        echo json_encode($result);    
     
    ?>
    Et le morceau en jQuery :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function(event, retour) {
         jQuery("#valid").fade("#valid", "Fichiers ajoutés avec succès", 4000, "slow");
         jQuery.post("form.php", { session: "<?php echo $session; ?>" },
                  function(retour){
                             alert(retour[0].id); // Test
                  }, "json");
    Merci à vous et bonne journée !

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("content-type: application/json");
    avant le echo, et FireBug affiche directement la réponse au format JSON.

    C'est-y pas beau !

    A+

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

Discussions similaires

  1. PHP : construire une requete SQL
    Par Commodore dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 27/07/2006, 08h59
  2. [ Requete ] effectuer une requete avec la valeur d'un combo box
    Par Jeremie_Vi dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 28/06/2006, 15h36
  3. [Conception] Comment créer un lien pour effectuer une requete ?
    Par Poutchou dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/03/2006, 11h54
  4. effectuer une requete insert avec 'values' ET 'select'
    Par delaio dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/08/2004, 19h05

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