Erreur .each avec jquery

Résolu/Fermé
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 - 24 janv. 2017 à 17:58
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 30 janv. 2017 à 17:14
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

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
24 janv. 2017 à 19:08
Bonjour
Encode le resultat en json dans ton fichier php
Et dans l'appel à l'ajax (côté js) ajoute le dqtatype:json
0
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
26 janv. 2017 à 15:14
Ca me donne une erreur "json is not defined"...
0
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
26 janv. 2017 à 15:31
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
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
26 janv. 2017 à 15:34
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié par jordane45 le 26/01/2017 à 18:26
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
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
27 janv. 2017 à 06:25
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
27 janv. 2017 à 10:30
Tu peux me dire ce que contient ta fonction get_villes() ?
0
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
27 janv. 2017 à 17:30

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
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2 > ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023
27 janv. 2017 à 17:32
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
26 janv. 2017 à 15:43
J'ai testé aussi ça

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


Mais j'ai toujours la même erreur
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié par jordane45 le 29/01/2017 à 04:59
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
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
29 janv. 2017 à 10:33
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
29 janv. 2017 à 12:24
Ah oui.
Cote js... faut tester que reponse n'est pas null
0
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
Modifié par ephelya le 29/01/2017 à 11:45
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
29 janv. 2017 à 12:26
Fait donc un console.log de réponse (tout seul sans autre texte devant...)
0
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
30 janv. 2017 à 10:44
Ca donne Array [ Object ]
0
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
29 janv. 2017 à 11:46
et console.log(reponse['ville_code_postal']) affiche undefined
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
30 janv. 2017 à 10:59
"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
ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
Modifié par ephelya le 30/01/2017 à 15:22
au temps pour moi, j'avais mal recopié la fonction, toutes mes excuses... c'est réglé ! :-)
Merci encore pour ton aide !!!
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > ephelya Messages postés 289 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023
30 janv. 2017 à 17:14
N'oublie pas de mettre la discussion en RESOLU
(lien se trouvant sous le titre de ta question)

Bonne soirée.
0