Erreur .each avec jquery

Résolu
ephelya Messages postés 296 Statut Membre -  
jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   -
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. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonjour
    Encode le resultat en json dans ton fichier php
    Et dans l'appel à l'ajax (côté js) ajoute le dqtatype:json
    0
  2. ephelya Messages postés 296 Statut Membre 2
     
    Ca me donne une erreur "json is not defined"...
    0
  3. ephelya Messages postés 296 Statut Membre 2
     
    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"
    0
  4. ephelya Messages postés 296 Statut Membre 2
     
    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"}]
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      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);
           });
          }
      
      0
      1. ephelya Messages postés 296 Statut Membre 2 > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        toujours 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
        0
    2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Tu peux me dire ce que contient ta fonction get_villes() ?
      0
      1. ephelya Messages postés 296 Statut Membre 2 > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         

        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);
        }
        0
      2. ephelya Messages postés 296 Statut Membre 2 > ephelya Messages postés 296 Statut Membre
         
        je 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...
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ephelya Messages postés 296 Statut Membre 2
     
    J'ai testé aussi ça

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


    Mais j'ai toujours la même erreur
    0
  7. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    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);
            }
        });
    
    }
    
    
    0
  8. ephelya Messages postés 296 Statut Membre 2
     
    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 ! ;-)
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Ah oui.
      Cote js... faut tester que reponse n'est pas null
      0
  9. ephelya Messages postés 296 Statut Membre 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]
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Fait donc un console.log de réponse (tout seul sans autre texte devant...)
      0
      1. ephelya Messages postés 296 Statut Membre 2 > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Ca donne Array [ Object ]
        0
  10. ephelya Messages postés 296 Statut Membre 2
     
    et console.log(reponse['ville_code_postal']) affiche undefined
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      "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);
                 });
      
      0
      1. ephelya Messages postés 296 Statut Membre 2 > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        au temps pour moi, j'avais mal recopié la fonction, toutes mes excuses... c'est réglé ! :-)
        Merci encore pour ton aide !!!
        0
      2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > ephelya Messages postés 296 Statut Membre
         
        N'oublie pas de mettre la discussion en RESOLU
        (lien se trouvant sous le titre de ta question)

        Bonne soirée.
        0