Listes déroulantes liées avec ajax

phoenix00 Messages postés 15 Statut Membre -  
youssefb Messages postés 16 Statut Membre -
Bonjour,

Voila mon probleme :
j'ai un formulaire comprenant 2 listes déroulantes, l'une des noms de famille et l'autre des prénoms. Les données proviennent d'une base de données.
Je souhaiterais que lorsqu'un nom de famille est sélectionné, ne s'affiche que les prénoms correspondant.
J'ai réussi à faire cela en ajax, le prénom correspondant au nom s'affiche bien dans ma liste déroulante.
Le soucis est que lorsque j'envoie ce formulaire, je dois insérer le contenu de mes listes dans ma base de données cependant j'ai le message suivant qui s'affiche : 'undefined index prenom'
alors que le prenom est bien affiché dans ma liste mais il semblerait que PHP ne détecte aucune valeur.
Je ne vois pas quoi faire. Si vous avez une idée je suis preneur merci !

14 réponses

JR des cavernes Messages postés 166 Statut Membre 84
 
https://www.toutjavascript.com/savoir/xmlhttprequest.php3

Je pense que l'exemple 5 est ce dont tu as besoin...
0
phoenix00 Messages postés 15 Statut Membre
 
merci de ta réponse,
j'avais pris connaissance de cet exemple mais j'ai toujours le même problème...
0
JR des cavernes Messages postés 166 Statut Membre 84
 
Poste une partie de ton code (celui ou il y a les listes de préférence^^), pour voir si je peux t'aider...
0
phoenix00 Messages postés 15 Statut Membre
 
page formulaire :
<tr><td align="right"><b>Nom de l'élève :</b></td>
<?php
  echo "<td width='100' align='left'><div id='divNom' name='divNom' style='display:inline'>";
  echo "<select name='nom' id='nom' onChange='goNom(),goFiche()' class='dyn'>";
  echo "<option selected value='-1'></option>";
  mysql_query("SET NAMES UTF8");
  $sql = mysql_query("SELECT DISTINCT nom_etud FROM etudiant ORDER BY nom_etud;");
  while ($row = mysql_fetch_array($sql))    //, MYSQL_ASSOC
	{ echo "<option value=".$row['nom_etud'].">".$row['nom_etud'].""; }
  echo '</select></div></td></tr><tr><td></td></tr>';
?>
<tr><td align="right"><b>Prénom de l'élève :</b></td>
<?php
echo "<td width='100' align='left'><div id='divPrenom' name='divPrenom' style='display:inline'>";
echo "<select name='prenom' id='prenom' onchange='goPrenom()' class='dyn'>";
echo "<option selected value='-1'></option>";
 mysql_query("SET NAMES UTF8");
$sql = mysql_query("SELECT DISTINCT prenom_etud FROM etudiant ORDER BY prenom_etud;");
while ($row = mysql_fetch_array($sql))
    { echo "<option value=".$row['prenom_etud'].">".$row['prenom_etud'].""; }
echo '</select></div></td></tr><tr><td></td></tr>';  
   ?>

page traitement javascript :
/* Méthode qui sera appelée sur le click du select nom */
function goNom(){
  // ce IF permet de ne pas bloquer le select "prenom" lorsqu'on a effectué un choix sur chaque select
  if (document.getElementById('nom').options[document.getElementById('nom').selectedIndex].value != document.getElementById('prenom').options[document.getElementById('prenom').selectedIndex].value) 
  {
    var xhr = getXhr();
  	// On défini ce qu'on va faire quand on aura la réponse à l'aide d'une fonction 'anonyme'
  	xhr.onreadystatechange = function(){
  		// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
  		if(xhr.readyState == 4 && xhr.status == 200){
  			leselect = xhr.responseText;
  			// On se sert de innerHTML pour rajouter les options a la liste
  			document.getElementById('divPrenom').innerHTML = leselect;
  		}
  	}
  	// Ici on envoi la requete en post au fichier "http1.php"
  	xhr.open("POST","http1.php",true);
  	// ne pas oublier le header pour le post
  	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  	// enfin, on post les arguments, ici le nom de l'étudiant
  	sel = document.getElementById('nom');
  	id_nom = sel.options[sel.selectedIndex].value;
        xhr.send("id_nom="+id_nom);
}

page traitement php :
// Changement du select nom
if (isset($_POST["id_nom"]))
{
  // Regénération du select "prenom" lorsqu'ajax envoi "id_nom"
  echo "<select name='prenom' id='prenom' class='dyn' onChange='goPrenom()'>";
  if ($_POST["id_nom"]==-1)
  { 
    $sql = mysql_query("SELECT * FROM etudiant ORDER BY prenom_etud");
    echo "<option value='-1' SELECTED></option>";
  }
  else { $sql = mysql_query("SELECT prenom_etud, nom_etud FROM etudiant 
  WHERE nom_etud='".$_POST['id_nom']."' ORDER BY prenom_etud;"); }
  
  $i=0; // permet de savoir si on a au moins un résultat
  while($row = mysql_fetch_assoc($sql))
  {
    echo "<option value='".utf8_encode($row['prenom_etud'])."'>".utf8_encode($row['prenom_etud'])."</option>";
    $i++;
  }
  if ($i==0) { echo" <option value='-1'>Aucun resultat</option>" ;}
  echo "</select>";
}

Voila j'espère que c'est compréhensible et encore merci pour ton aide !
0
JR des cavernes Messages postés 166 Statut Membre 84
 
Dans la page formulaire, le deuxième select, il te manque </option> il me semble.
Je sais pas si c'est ça qui fait bugger...
0
phoenix00 Messages postés 15 Statut Membre
 
Oui en effet j'ai oublié le </option> aux 2 selects d'ailleurs. C'est corrigé mais toujours le même soucis...
0

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

Posez votre question
JR des cavernes Messages postés 166 Statut Membre 84
 
En fait tu envoies ton formulaire comment ? Je ne vois aucun bouton submit dans ta page formulaire...
0
phoenix00 Messages postés 15 Statut Membre
 
si j'ai bien un bouton submit, c'est que j'ai posté seulement un extrait de mon code
0
youssefb Messages postés 16 Statut Membre
 
Je doute qu'on puisse t'aider avec si peu de code et je pense aussi que l'erreur se déclare ailleurs

Pour acceder à la valeur de l'option selectionnée dans prenom il faut simplement faire : document.getElementById('prenom').value vu que c'est déjà un select tu prend sa valeur qui lui est assignée automatiquement quand tu sélectionne ton option, pas la peine de te compliquer la vie.

Allège un peu ton code et met nous toute la partie du formulaire ainsi que le JS et la partie php que tu appelle avec ton ajax.
0
phoenix00 Messages postés 15 Statut Membre
 
ok je reposte le formulaire et j'allège un peu le code. pour ce qui est de la partie ajax je pense pas qu'il y ai de problème vu que j'arrive bien a envoyer le contenu du select 'nom' à ma page php. Ensuite le traitement php doit être correct du moins la requête car elle m'affiche bien le prénom correspondant au nom dans le select 'prenom' de mon formulaire.
Page formulaire.php :
<form method="POST" action="ajout_etud.php">
<table>
<tr><td align="right"><b>Nom de l'élève :</b></td>
<?php
  echo "<td width='100' align='left'><div id='divNom' name='divNom' style='display:inline'>";
  echo "<select name='nom' id='nom' onChange='goNom()' class='dyn'>";
  echo "<option selected value='-1'></option>";
  mysql_query("SET NAMES UTF8");
  $sql = mysql_query("SELECT DISTINCT nom_etud FROM etudiant ORDER BY nom_etud;");
  while ($row = mysql_fetch_array($sql))    //, MYSQL_ASSOC
	{ echo "<option value=".$row['nom_etud'].">".$row['nom_etud']."</option>"; }
  echo '</select></div></td></tr>';
?>
<tr><td align="right"><b>Prénom de l'élève :</b></td>
<?php
echo "<td width='100' align='left'><div id='divPrenom' name='divPrenom' style='display:inline'>";
echo "<select name='prenom' id='prenom' onchange='goPrenom()' class='dyn'>";
echo "<option selected value='-1'></option>";
 mysql_query("SET NAMES UTF8");
$sql = mysql_query("SELECT DISTINCT prenom_etud FROM etudiant ORDER BY prenom_etud;");
while ($row = mysql_fetch_array($sql))
    { echo "<option value=".$row['prenom_etud'].">".$row['prenom_etud']."</option>"; }
echo '</select></div></td></tr>';  
   ?>
<tr><td></td><td align="right"><input type="submit" value="valider"></td></tr>
</table>
</form>

J'ai essayé lors du clic sur le bouton 'valider' de faire un document.getElementById('nom').value et document.getElementById('prenom').value. Pour le nom il fonctionne bien, mais pour le prenom il m'affiche toujours 0. Comme si mon <option> n'avait pas de value et pourtant je le répète, le prénom correspondant au nom s'affiche bien dans le <select>.
Merci pour votre aide.
0
JR des cavernes Messages postés 166 Statut Membre 84
 
Je sais pas si ça peut faire avancer les choses mais dans ta boucle pour le prénom tu as un ; dans les guillemets après </option>.
0
phoenix00 Messages postés 15 Statut Membre
 
oui merci j'ai vu ça, c'est corrigé mais toujours le problème!
0
JR des cavernes Messages postés 166 Statut Membre 84
 
Bon franchement je vois pas du tout pourquoi ça marche pas....

est-ce que t'as essayé de mettre des cotes comme ça pour la value : echo "<option value='".$row['prenom_etud']."'>
0
phoenix00 Messages postés 15 Statut Membre
 
non ça ne change rien... Je vois pas trop où est le problème non plus!
0
JR des cavernes Messages postés 166 Statut Membre 84
 
Une autre idée : le problème peut peut-être venir du fait que lorsque tu "régénère le select prénom", en fait tu le recré.

Il faudrait essayer de simplement modifier ses options grace à du javascript et un eval() dans goNom().

Facile à dire, plus difficile à faire......^^
0
youssefb Messages postés 16 Statut Membre
 
t'as oublié de poster je javascript car c ce qui etait illisible pour moi!! :)

mais tu sais le problème viens surement de javascript!

poste le pour voir
0