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

AJAX Discussion :

[AJAX] Retour d'un json dans Ajax d'une requête Mysql


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Par défaut [AJAX] Retour d'un json dans Ajax d'une requête Mysql
    Bonjour,

    Je développe une solution de caisse virtuelle pour gérer les encaissements dans ma boutique physique (ce n'est donc pas destiné à être publié sur un site Web comme panier).

    Le principe est simple : Je scanne un code barre dans le champ EAN, et le script ajax me retourne titre, auteur, éditeur et prix dynamiquement. Tout ça fonctionne correctement de base ainsi que l'ajout au panier, le total etc (j'ai récupéré les scripts ajax et du panier en jquery, mais j'ai fait l'effort de comprendre et de les adapter).

    Souhaitant normaliser ce script, je souhaite convertir l'échange de données entre la requête sql et le retour ajax en Json. Là est mon problème, malgré mes recherches, je ne comprends pas comment faire le retour dans le script ajax et l'utiliser pour la gestion du panier. J'ai trouvé des tuto et des exemples, mais je n'ai pas compris les modèles...

    Voici la requête sur un fichier php externe :

    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
    <?php
    header('Content-Type: text/html; charset=ISO-8859-1');
     
    include('connexion.php');
    $connect_db = connect();
     
    $return_arr = array();
     
    $fetch = mysql_query("SELECT jos_vm_product.product_id,product_name,product_author,product_editor, jos_vm_product_price.product_price FROM jos_vm_product INNER JOIN jos_vm_product_price ON (jos_vm_product.product_id = jos_vm_product_price.product_id)
     WHERE product_EAN = '$_POST[EAN]'");
     
    while ($row = mysql_fetch_array($fetch, MYSQL_ASSOC)) {
    $row_array['product_id'] = $row['product_id'];
    $row_array['product_name'] = $row['product_name'];
    $row_array['product_author'] = $row['product_author'];
    $row_array['product_editor'] = $row['product_editor'];
    $row_array['product_price'] = $row['product_price'];
    array_push($return_arr,$row_array);
    }
    echo json_encode($return_arr);
     
    close(); 
    ?>

    Le script Ajax

    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
    var xhr = null;
      // Fonction de creation de l'objet XMLHttpRequest qui resservira pour chaques fonctions AJAX
      function getXhr()
      {
      if(window.XMLHttpRequest) xhr = new XMLHttpRequest();
      else if(window.ActiveXObject)
      {
      try
      {
      xhr = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch (e)
      {
      xhr = new ActiveXObject("Microsoft.XMLHTTP");
      }
      }
      else
      {
      alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest, veuillez le mettre à jour");
      xhr = false;
      }
      }
     
      function ajaxEAN()
      {
      getXhr();
      xhr.onreadystatechange = function()
      {
      if(xhr.readyState == 4 && xhr.status == 200)
      {
      // Nous recuperons ce coup ci le retour dans une variable
      var chaine = xhr.responseText.replace(/^\s+/g,'').replace(/\s+$/g,'');
      // Nous decoupons la reponse selon le caractere choisi
     
      var tableau = chaine.split("*");
      // Nous appliquons les valeurs récupérées au element correspondant
      document.getElementById("product_id").value = tableau[0];
      var product_id = document.getElementById("product_id").value;
      document.getElementById("product_name").value = tableau[1];
      var product_name = document.getElementById("product_name").value;
      document.getElementById("product_author").value = tableau[2];
      document.getElementById("product_editor").value = tableau[3];
      document.getElementById("product_price").value = tableau[4];
      var product_price = document.getElementById("product_price").value;
      }
      }
      xhr.open("POST",'ajaxrecupaddr.php',true);
      xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
      EAN = document.getElementById("EAN").value;
      xhr.send("EAN="+EAN);
     
      }
    Ce script est encore calé sur l'ancien modèle ou la requête était renvoyée sous forme de longue chaîne avant d'être découpée selon les différents éléments. Je cherche donc l'équivalence en Json, mais je ne comprends pas les modèles que j'ai trouvé avec JSON.parse, ou $.json .

    Et le formulaire de retour :
    Code html : 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
    <form method="post" action="" class="jcart">
    <fieldset>
    <table>
    	<input type="hidden" name="jcartToken" value="<?php echo $_SESSION['jcartToken'];?>" />
    	<input type="hidden" name="product_id" id="product_id" />
    	<tr>
    		<td class="label1">EAN</td>
    		<td><input type="text" size="20" name="EAN" id="EAN" onchange="ajaxEAN()"></td>
    	</tr>
    	<tr>
    		<td class="label1">Titre</td>
    		<?php echo $product_name; ?>
    		<td><input id ="product_name" size="26" name="product_name"/><td>
    	</tr>
    	<tr>
    		<td class="label1">Auteur</td>
    		<td><input id ="product_author" size="26" name="product_author"/></td>
    	</tr>
    	<tr>
    		<td class="label1">Editeur</td>
    		<td><input id ="product_editor" size="26" name="product_editor"/></td>
    	</tr>
    	<tr>
    		<td class="label1">prix</td>
    		<td><input id ="product_price" size="5" name="product_price"/></td>
    	</tr>
    	<tr>
    		<td>
    		<label>Qty: <input type="text" name="my-item-qty" value="1" size="3" /></label>
    		</td>
    		<td>
    			<input type="submit" name="my-add-button" value="add to cart" class="button" />
    		</td>
    	</tr>
    </table>
    </fieldset>
    </form>

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 207
    Par défaut
    Bonjour,
    as tu essayé un mysql_fetch_object plutôt qu'un mysql_fetch_array?

    A quoi ressemble ce que tu récupères coté client.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Par défaut
    Les données côté client sont rangées dans un formulaire de consultation. Chaque champ pour une information, ensuite on peut l'ajouter sur le ticket en cours. Mais je suis perdu, car je ne sais pas comment faire la même chose qu'avec la requête de base d'avant.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 207
    Par défaut
    montre nous ce à quoi ressemble xhr.responseText, un retour au format jSon ne se traite pas de la même manière qu'un retour au format String.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Par défaut
    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
    <?php 
     
    include('connexion.php');
    $connect_db = connect();
     
    $req = mysql_query("SELECT jos_vm_product.product_id,product_name,product_author,product_editor, jos_vm_product_price.product_price FROM jos_vm_product INNER JOIN jos_vm_product_price ON (jos_vm_product.product_id = jos_vm_product_price.product_id)
     WHERE product_EAN = '$_POST[EAN]'");
     
     while($res = mysql_fetch_array($req))
        {
        // Concatenation des resultats dans une chaine
        echo "$res[product_id]*$res[product_name]*$res[product_author]*$res[product_editor]*$res[product_price]";
    	}
          close(); 
      ?>

    Je m'excuse, j'aurais certainement du mettre le script fonctionnel avant la tentative de le passer en json. La réponse est donc fournie à partir de cette requête sur un fichier php externe. Elle est envoyée ensuite au script, et découpée et rangée pour donner les champs id,titre,auteur...

    Ce script fonctionne, mais on m'a suggéré de passer les retours en Json pour plus de sécurité, même si ce script n'est pas destiné à être mis en ligne.

    J'ai beau epluché les tutos sur le net, je ne comprends pas comment faire le retour du json dans le script et obtenir le même résultat...

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 207
    Par défaut
    je ne comprends pas comment faire le retour du json dans le script et obtenir le même résultat...
    Là tu as un soucis mais du coté PHP, peut être qu'il serait mieux de voir du coté de ce forum.

    Regarde quand même du coté de json_encode.

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

Discussions similaires

  1. [AJAX] envoyer données en JSON par ajax
    Par altair8080 dans le forum AJAX
    Réponses: 9
    Dernier message: 08/08/2011, 09h37
  2. [AJAX] variable html et checkbox dans ajax
    Par Invité dans le forum AJAX
    Réponses: 4
    Dernier message: 25/06/2010, 16h45
  3. [AJAX] faire une requête mysql ajax
    Par affreuxzozo dans le forum AJAX
    Réponses: 1
    Dernier message: 04/05/2009, 13h16
  4. [AJAX] Barre de chargement pendant une requête mysql
    Par Gabzor dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/02/2009, 11h25

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