Bonjour,

Je suis étudiante en licence multimédia et je n'ai commencé que depuis octobre le HTML puis depuis janvier j'ai commencé à voir les langages PHP et Javascript et la technologie AJAX. Je me galère depuis deux semaines à trouver une solution pour 3 listes déroulantes. C'est très important pour moi, je suis toute seule et personne pour m'aider. Je lis des tutoriaux toute la journée mais j'ia du mal à tout saisir.
J'ai réussi à faire fonctionner mes listes en PHP. Mais j'ai également réussi à faire évoluer mes listes déroulantes en AJAX.

Mon problème est que la première fois tout fonctionne, mais si je sélectionne de nouveau dans la première liste, la seconde ne se recharge pas (ne rechargeant donc pas la troisième).

Je me dis qu'il me manque le bout de code qui dit "quand une autre formation est choisie, recharge la deuxième liste".
Quelqu'un pourrait-il m'aiguiller que je puisse m'améliorer ?
Savoir si je suis dans la bonne direction, faudrait-il rajouter une function ValideLd1 (j'ai essayé mais ça n'a pas marché non plus...)

Voici le code de la page ListeCP.php où les listes s'affichent :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 
<script type="text/javascript">
/**
 * Lister les lieux et dates d'une formation avec un objet
 * XMLHTTPRequest.
 */
/* Création des variables globales qui contiendront l'objet XHR */
var Ld1Id='';
var Ld2Id='';
var id_liste='';
 
function ValideLd2(val) {
   Ld1Id=val; //id_département
   id_liste='2';//Utilisé dans la fonction ChargeLd() pour identifier la liste déroulante
   var LD_URL = 'ValideLd2.php?Ld1='+Ld1Id;
   ObjetXHR(LD_URL)
   // Réinitialisation de Ld3 si modification de LD1 après passage en Ld2
   if (Ld2Id!='') {ValideLd3('');   }
}
 
function ValideLd3(val) {
   Ld2Id=val; //id_commune
   id_liste='3'; //Utilisé dans la fonction ChargeLd() pour identifier la liste déroulante
   var LD_URL = 'ValideLd3.php?Ld1='+Ld1Id+'&Ld2='+Ld2Id;
   if (Ld2Id=='') {var LD_URL = 'ValideLd3.php';}   
   ObjetXHR(LD_URL)
}
 
/**
 * Fonction privée qui va créer un objet XHR.
 * Cette fonction initialisera la valeur dans la variable globale définie ci-dessus.
 */
function ObjetXHR(LD_URL) {
   //creation de l'objet XMLHttpRequest
   if (window.XMLHttpRequest) { // Mozilla,...
   /* On tente de créer un objet XmlHTTPRequest */
      xmlhttp=new XMLHttpRequest();
      if (xmlhttp.overrideMimeType) {
         xmlhttp.overrideMimeType('text/xml');
      }   
      /* On surveille le changement d'état de la requête qui va passer successivement de 1 à 4 */
      xmlhttp.onreadystatechange=ChargeLd;
      /* Envoi de la requête à la page de traitement */
      xmlhttp.open("GET", LD_URL, true);
      xmlhttp.send(null);
   } else if (window.ActiveXObject) { //IE
   /* On tente de créer un objet XmlHTTPRequest */
      xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
      if (xmlhttp) {
      /* On surveille le changement d'état de la requête qui va passer successivement de 1 à 4 */
         xmlhttp.onreadystatechange=ChargeLd;
         /* Envoi de la requête à la page de traitement */
         xmlhttp.open('GET', LD_URL, false);
         xmlhttp.send();
      }
   }
   // Bouton non apparent car modification de LD1 ou Ld2
   document.getElementById('buttons').style.display='none';
}
 
// fonction pour manipuler l'appel asynchrone
function ChargeLd() {
/* Lorsque l'état est à 4 */
   if (xmlhttp.readyState==4) {
   /* Si on a un statut à 200 */
      if (xmlhttp.status==200) {
       /* Mise à jour de l'affichage */
         //span id="niv2" ou "niv3"
         document.getElementById('niv'+id_liste).innerHTML=xmlhttp.responseText;
         if (xmlhttp.responseText.indexOf('disabled')<=0) {
            //focus sur liste déroulante 2 ou 3
            document.getElementById('Liste'+id_liste).focus();
         }   
      }
   }
}
 
function Affiche_Btn() {
   document.getElementById('buttons').style.display='inline';
}
</script>
La partie PHP sur la même page :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<form method="get" action="ListeCP.php">
 
    <span id="niv1">
    <?php include 'ValideLd1.php'; ?></span>&nbsp; <!--Pour remplir la liste déroulante 1-->
    <span id="niv2">
    <?php include 'ValideLd2.php'; ?></span>&nbsp; <!--Pour remplir la liste déroulante 2-->
    <span id="niv3">
    <?php include 'ValideLd3.php'; ?></span>&nbsp; <!--Pour remplir la liste déroulante 3-->
    <span id="buttons">
    <input type="submit" value="Valider">
    </span>
  </form>
La page ValideLd1.php :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
<?PHP
include("connexionbd.php");
$rq="Select id_formations,nom_formations from formation order by nom_formations";
$rq_pos_id=0; //position dans le SQL de la clé de la liste déroulante idem dans ValideLd2.php et ValideLd3.php
$rq_pos_val=1; //position dans le SQL de la valeur de la liste déroulante idem dans ValideLd2.php et ValideLd3.php 
 
$result= mysql_query ($rq) or die ("Select impossible");
$retour = '<select name="Liste1" id="Liste1" size="1" onchange="ValideLd2(this[this.selectedIndex].value);">';
$retour .= '<option selected value="">Choisir...</option>';
if (mysql_num_rows($result) != 0) {
    while ($row = mysql_fetch_row($result)) {
        $retour .= '<option value="'. $row[$rq_pos_id] .'">'. htmlentities($row[$rq_pos_val]) .'</option>';
        }
        $retour .= '</select>';
} else {
    $retour = '<input id="size" type="text" size="10" value="Aucune valeur" disabled>';
}
mysql_free_result($result);
mysql_close($connexion);
echo $retour
?>
La page ValideLd2.php :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
<?PHP
include("connexionbd.php");
 $Ld1_retour =''; //id_département clé de la liste déroulante 1
 
if (isset($_GET['Ld1'])) {$Ld1_retour = $_GET['Ld1'];}
 
if ($Ld1_retour!='') {
    $rq="Select* from date_formations where id_formations='".$Ld1_retour."' order by date_date";
    $rq_pos_id=0;
    $rq_pos_val=1;
    $result= mysql_query ($rq) or die ("Select impossible");
    $retour = '<select name="Liste2" id="Liste2" size="1" onchange="ValideLd3(this[this.selectedIndex].value);">';
    $retour .= '<option selected value="">Choisir...</option>';
 
    if (mysql_num_rows($result) != 0) {
        while ($row = mysql_fetch_row($result)) {
            $retour .= '<option value="'. $row[$rq_pos_id] .'">'. htmlentities($row[$rq_pos_val]) .'</option>';
        }
        $retour .= '</select>';
    } else {
        $retour = '<input id="Liste2" type="text" size="10" value="Aucune valeur" disabled>';
    }
    mysql_free_result($result);
    mysql_close($connexion);
}else{
    $retour = '<select name="Liste2" id="Liste2" size="1" disabled><option>Aucune valeur</option></select>';
}    
echo $retour
?>
La page ValideLd3.php :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
<?PHP
include("connexionbd.php");
 
$Ld1_retour =''; //id_département clé de la liste déroulante 1 
$Ld2_retour =''; //id_commune clé de la liste déroulante 2    
 
if (isset($_GET['Ld1'])) {$Ld1_retour = $_GET['Ld1'];}
if (isset($_GET['Ld2'])) {$Ld2_retour =  $_GET['Ld2'];}
 
if (($Ld1_retour!='')&&($Ld2_retour!='')) {
    $rq="Select lieu_date from date_formations where id_formations='".$Ld1_retour."' AND id_date='".$Ld2_retour."' order by lieu_date";
    $rq_pos_id=0;
    $rq_pos_val=0;
    $result= mysql_query ($rq) or die ("Select impossible");
    $retour = '<select name="Liste3" id="Liste3" size="1" onchange="Affiche_Btn();">';
    $retour .= '<option selected value="">Choisir...</option>';
 
    if (mysql_num_rows($result) != 0) {
        while ($row = mysql_fetch_row($result)) {
            $retour .= '<option value="'. $row[$rq_pos_id] .'">'. htmlentities($row[$rq_pos_val]) .'</option>';
        }
        $retour .= '</select>';
    } else {
        $retour = '<input id="Liste3" type="text" size="10" value="Aucune valeur" disabled>';
    }
    mysql_free_result($result);
    mysql_close($connexion);
}else{
    $retour = '<select name="Liste3" id="Liste3" size="1" disabled><option>Aucune valeur</option></select>';
}    
echo $retour
?>
J'espère que vous pourrez au moins m'aiguiller un peu ça serait sympa !
En tout cas, merci de votre aide !