Erreur .each avec jquery

Résolu
Bonjour,

Je n'arrive pas à exploiter les données récupérées par mon script ajax avec jquery, et je ne comprends absolument pas d'où vient le problème, une fois de plus...
Voici mon script
			$.ajax({
type: "POST",
url: "<?php echo DIR_JS; ?>SCRIPTS/getvilles.php", //Relative or absolute path to response.php file
data: {cpost: cpost},
success: function(villes){
console.log(villes);
$.each(villes, function(id, name ) {
console.log(id+" "+name);
});
}
});


console.log(villes); donne
Array
(
[13128] => Tressan
[13178] => Vendémian
[13425] => Le Pouget
)


mais j'ai ensuite ce message d'erreur: invalid 'in' operand a, donc pas moyen de récupérer les données... pourquoi ??
Merci d'avance pour votre aide ! :-)

9 réponses

  1. Modérateur
    Bonjour
    Encode le resultat en json dans ton fichier php
    Et dans l'appel à l'ajax (côté js) ajoute le dqtatype:json
    1. ok, j'ai rajouté les guillemets à "json" et je n'ai plus cette erreur, mais j'ai toujours " invalid 'in' operand a"...

      Voici mon code php :

      $villes = get_villes($cpost);
      //print_r($villes);
      header('Content-Type: text/plain; charset=utf-8');
      $json = new \JSON();
      $villes = $json->encode($villes, false);
      die($villes);


      et le js :

      $.ajax({
      type: "POST",
      datatype:"json",
      url: "<?php echo DIR_JS; ?>SCRIPTS/getvilles.php", //Relative or absolute path to response.php file
      data: {cpost: cpost},
      success: function(villes){
      console.log(villes);
      $.each(villes, function(id, name ) {
      console.log(id+" "+name);
      });
      }
      });


      La console affiche
      [{"id":"16907","name":"Chanteau"},{"id":"16988","name":"Semoy"},{"id":"17018","name":"Fleury-les-Aubrais"}]

      puis "TypeError: invalid 'in' operand a"
      1. en prime ça crée un pb de charset qu'il n'y avait pas avant :
        [{"id":"16862","name":"Bou"},{"id":"16928","name":"Mardi\u00e9"},{"id":"17052","name":"Ch\u00e9cy"}]
        1. Modérateur
          Le code html de la page qui reçoit les données ajax .... il est déclaré en UTF8 ?
          Et les fichiers .. sont ils tous bien en UTF8-SANS BOM ?
          => Voir ici : https://forums.commentcamarche.net/forum/affich-37584944-php-html-caracteres-accentues-et-l-utf8

          Côté php .. je ferais simplement :
          <?php
          header('Content-Type: application/json ; charset=utf-8'); //pas nécéssaire si tes fichiers sont encodé en utf8 sans bom normalelent.... 
          
          $villes = get_villes($cpost);
           echo json_encode($villes);
          
          


          Côté Jquery, peux tu testé ça dans ton "SUCCESS" ?
          success: function(villes){
               console.log(villes);
               $.each(villes, function(datas) {
                 console.log(datas);
                 console.log(datas.id+" "+datas.name);
               });
              }
          
        2. @jordane45toujours pareil, malheureusement...

          [{"id":"16862","name":"Bou"},{"id":"16928","name":"Mardi\u00e9"},{"id":"17052","name":"Ch\u00e9cy"}]

          TypeError: invalid 'in' operand a


          tout est encodé en utf, fichier et bdd... et je n'avais pas de problème d'accent au départ sans encoder en json
        3. Modérateur
          Tu peux me dire ce que contient ta fonction get_villes() ?
        4. @jordane45

          function get_villes($cpost)
          {
          //$iduser = $_SESSION['user_id'];
          $iduser = 1;
          $sexe = "f";
          try{
          $db = new \PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME.'; charset=utf8', DB_USER, DB_PASSWORD);
          $db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
          $db->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
          } catch(PDOException $e) {
          die('Erreur : ' . $e->getMessage());
          }

          $query = "SELECT ville_id, ville_nom_reel FROM villes_france_free WHERE ville_code_postal LIKE '$cpost%'";
          //echo $query;
          $datas = array(':valeur1'=>$cpost);
          try{
          $requete = $db -> prepare($query) ;
          $requete->execute($datas) ;
          }catch(Exception $e){
          // en cas d'erreur :
          echo " Erreur ! ".$e->getMessage();
          echo " Les datas : " ;
          //print_r($datas);
          }
          $result = $requete->fetchAll(); //print_r($result);
          $villes= array();
          $i=0;
          foreach ($result as $ville)
          {
          $villes[]=array(
          "id" =>$ville -> ville_id,
          "name" => $ville -> ville_nom_reel
          );
          $i++;
          }

          return($villes);
          }
        5. @ephelyaje sais que les 3 premières lignes de la fonction ne servent à rien, c'est un reste de copier-coller que je n'ai pas effacé ! ;-)
          ce qui m'étonne par contre c'est que je n'avais aucun pb avec cette précédente fonction...
      2. J'ai testé aussi ça

        $villes = get_villes($cpost);
        json_encode($villes);
        print_r($villes);


        Mais j'ai toujours la même erreur
        1. Modérateur
          Bonsoir,

          Déjà.. tu peux commencer par faire un FETCH_ASSOC au lieu d'un FETCH_OBJ
          Ce qui rendrait tes lignes de code de ta boucle inutile...

          <?php
          /**
          * Fonction de connexion à la BDD
          */
          function connexion_bdd(){
           try{
              $db = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME.'; charset=utf8', DB_USER, DB_PASSWORD);
              $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
              $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
            } catch(PDOException $e) {
                die('Erreur : ' . $e->getMessage());
            }
            return $db;
          }
          
          function get_villes($cpost) {
            //connexion à la BDD
            $db = connexion_bdd();
          
            $query = "SELECT ville_id, ville_nom_reel FROM villes_france_free WHERE ville_code_postal LIKE '$cpost%'"; 
            //echo $query;
            $datas = array(':valeur1'=>$cpost);
            try{
              $requete = $db->prepare($query) ;
              $requete->execute($datas) ;
              $result = $requete->fetchAll(); //print_r($result);
            }catch(Exception $e){
              // en cas d'erreur :
               echo "<br>Erreur  dans la requete : ".$query . " !<br> ".$e->getMessage();
               echo "<br>Les datas : <br>" ;
               print_r($datas);
            }
            return !empty($result) ? $result : NULL;
          }
          


          Côté JS .. je ne sais pas pourquoi ... mais c'est la variable "villes" que ton script n'aime pas...
          Je l'ai renomé en "reponse" .. et ça marche bien.
          $.ajax({
              type: "POST",
              dataType: 'json',
             url: "<?php echo DIR_JS; ?>SCRIPTS/getvilles.php", //Relative or absolute path to response.php file
              data: {cpost: cpost},
              success: function(reponse){
                    $.each(reponse,function(i,ville){
                      console.log(ville.ville_id + " => " + ville.ville_nom_reel);
                     });
                    
              }
                  ,error : function(x,err){
                   alert(err);
                  }
              });
          
          }
          
          
          1. Yes ! Ca fonctionne ! Merci beaucoup :-)
            Toutefois ça ne marche que si je mets return($result) et non return !empty($result) ? $result : NULL; et je déteste ne pas comprendre d'où viennent les erreurs... Mais l'essentiel c'est que ça fonctionne ! ;-)
            1. Modérateur
              Ah oui.
              Cote js... faut tester que reponse n'est pas null
          2. Bon, j'ai quand même un problème : en utilisant exactement les mêmes scripts pour la fonction get_cp() pour remplir le champ code postal quand on choisit une ville dans le select (alimenté par la fonction précédente), ça ne fonctionne pas...


            function get_cp($idville) {
            //connexion à la BDD
            $db = connexion_bdd();

            $query = "SELECT ville_code_postal FROM villes_france_free v
            WHERE ville_id =$ville";

            $datas = array();
            try{
            $requete = $db->prepare($query) ;
            $requete->execute($datas) ;
            $result = $requete->fetchAll();
            }catch(Exception $e){
            // en cas d'erreur :
            echo "<br>Erreur dans la requete : ".$query . " !<br> ".$e->getMessage();
            echo "<br>Les datas : <br>" ;
            print_r($datas);
            }
            //return !empty($result) ? $result : NULL;
            return ($result);
            }

            $cpostal = get_cp($idville);
            header('Content-Type: application/json');
            echo json_encode($cpostal);


               $.ajax({
            type: "POST",
            dataType: 'json',
            url: "<?php echo DIR_JS; ?>SCRIPTS/getcp.php", //Relative or absolute path to response.php file
            data: {ville: ville},
            success: function(reponse){
            console.log("cp "+reponse);
            $(cpost).val=reponse;
            },
            error : function(x,err){
            alert(err);
            }
            });


            voici la réponse dans la console, alors que la fonction sql sort bel et bien un résultat...
            ville 17026 
            check ville 17026
            cp [object Object]
            1. Modérateur
              Fait donc un console.log de réponse (tout seul sans autre texte devant...)
          3. et console.log(reponse['ville_code_postal']) affiche undefined
            1. Modérateur
              "reponse" contient un "OBJET" JSON.
              Fais un
              console.log(reponse);
              et regarde ce que ça donne ....

              Inspire toi aussi de ce que je t'ai donné comme code précédement ...
              $.each(reponse,function(i,ville){
                          console.log(ville.ville_id + " => " + ville.ville_nom_reel);
                         });
              
            2. @jordane45au temps pour moi, j'avais mal recopié la fonction, toutes mes excuses... c'est réglé ! :-)
              Merci encore pour ton aide !!!
            3. Modérateur
              @ephelyaN'oublie pas de mettre la discussion en RESOLU
              (lien se trouvant sous le titre de ta question)

              Bonne soirée.