2 Liste déroulantes liées + récupération de la valeur de la 2éme liste

Signaler
Messages postés
81
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
7 août 2009
-
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
-
Bonjour à tous,

Je débute avec Ajax, et je trouve cette technique trop trop bien, notamment pour alimenter une seconde liste déroulante depuis la sélection de la première. ça fonctionne tbien.
Mon problème, c'est que j'ai besoin de récupérer les valeurs de chacune des listes déroulantes, et que je ne récupère que la première.
D'où vient mon pb ? J'ai cherché sur le net, mais pas trouvé.
Voici des bouts de mon code (que j'ai repris d'un super tuto d'ailleurs pour la partie ajax).
<script type='text/javascript'>
function getXhr(){
var xhr = null;
if(window.XMLHttpRequest) // Firefox et autres
xhr = new XMLHttpRequest();
else if(window.ActiveXObject){ // Internet Explorer
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
}
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
xhr = false;
}
return xhr;
}

/**
* Méthode qui sera appelée sur le click du bouton
*/
function go(){
var xhr = getXhr();
// On défini ce qu'on va faire quand on aura la réponse
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('code').innerHTML = leselect;
}
}

// Ici on va voir comment faire du post
xhr.open("POST","ajaxetab.php",true);
// ne pas oublier ça pour le post
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
// ne pas oublier de poster les arguments
// ici, l'id de l'auteur
sel = document.getElementById('type');
type = sel.options[sel.selectedIndex].value;
xhr.send("type="+type);
}
</script>
</head>
<?php
echo "<form name='ajout_insc' action='dossier.php?num_enfant=".$_GET['num_enfant']."&fiche=insc' method='POST'>";
echo "<tr><td>"; ?>
<select name='type' id='type' onchange='go()'>
<option value='-1'>Aucun</option>
<?
$sql="SELECT DISTINCT type FROM phoebe.etablissement ORDER BY type";
$conn = oci_connect("Phoebe", "guitare", "MIBA");
$res=ociparse($conn, $sql); //préparation de la req
//si la req ne fonctionne pas, on affiche l'erreur correspondante
if(!$res){
$e=$oci_error($conn);
return htmlentities($e['message']);
}
ociexecute($res); //exécution de la req
while($req=oci_fetch_array($res,OCI_BOTH)) {
echo "<option value='".$req[0]."'>".$req[0]."</option>";
}
?>
</select></td>
<td colspan='2'>


</td>

?>

Page ajaxetab.php

<?php
echo "<select name='code'>";
if(isset($_POST["type"])){
$conn = oci_connect("Phoebe", "guitare", "MIBA");
$sql = "SELECT code,nom FROM etablissement
WHERE type='".$_POST["type"]."' ORDER BY nom";
$res=ociparse($conn, $sql); //préparation de la req
//si la req ne fonctionne pas, on affiche l'erreur correspondante
if(!$res){
$e=$oci_error($conn);
return htmlentities($e['message']);
}
ociexecute($res); //exécution de la req
while($req=oci_fetch_array($res,OCI_BOTH)) {
echo "<option value='".$req[0]."'>".$req[1]."</option>";
}
}
else {echo "<option value='-1'>Choisir un type</option>";}
echo "</select>";
?>

Merci @ tous.
Didine

5 réponses

Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
8
Bonjour,

>>je débute avec Ajax, et je trouve cette
>>technique trop trop bien,
bah, c'est n'est jamais que appel d'un script
sur le serveur et la réponse de celui-ci est
rendue dans une variable
ça peut-être intéressant...
si on emploie à bon escient
et pas à tort et à travers
( faut pas tenter de réinventer le
dialogue normal serveur/client )

>>j'ai besoin de récupérer les valeurs de chacune
>>des listes déroulantes, et que je ne récupère
>>que la première.
récupérer ? où ?
coté javascript : onchange sur le select
coté serveur : faut l'appeler ce serveur
peut-être avec ajax.
faites, pour la 2ème liste, de la même
manière que vous récupérez le choix
pour la 1ère liste.


Cordialement [mon Site] [M'écrire] Bul
Messages postés
81
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
7 août 2009

Merci de votre réponse,
En fait c'est exactement ce que je fait, mais je n'ai aucune valeur.
Je récupère en POST
//Le 'inserer' est le nom du bouton submit qui n'apparait pas dans mon code dans le 1er post
if(IsSet($_POST['inserer'])) {
echo "ok insertion";
echo "
Code : ".$_POST['code'];
echo "
Type : ".$_POST['type'];
echo "
Date: ".$_POST['date_insc'];
}
J'ai bien type et date_insc, par contre, le code est vide...
C'est peut être tout simplement que ma seconde liste déroulante est dans la page ajaxetab.php et que du tout, dans la page d'appel, il ne connait pas la variable ?!?

Didine
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
8
affichez donc la page résultante, pas le php

à priori, lors du changement sur le 1er select
vous mettez un 2ème select dans le div 'code'
echo "<select name= 'code'>";
pour lequel, il n'y pas d'action onchange ....
donc, rien ne se passe lorsque vous
faites un choix dans ce 2ème select.
remarque :
et <select name ="code">
ça va vous poser des problèmes avec IE
( qui remplace l'ID par le name s'il n'existe
pas et inversement )
Messages postés
81
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
7 août 2009

Ben oui, il n'y a pas d'événement onChange car je veux le gérer avec PHP.
Comme la balise select est dans une balise <form>, il devrait transmettre la valeur sélectionnée.

Et merci pour la remarque, des id avec le même nom, je n'y avais pas fait attention.


Didine
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
8
donc le div 'code' est dans le form,
puisque c'est là qu'on insère le select ?
il ne me semble pas...

et pas vu de </form> d'ailleurs
ni de bouton submit
ni de submit() en js...
il est transmis comment ce formulaire ?