Bonjour,

Je découvre Ajax et, grâce notamment à l'exemple donné dans cette discussion, je suis presque arrivé à faire ce que je veux.

Sauf que mon formulaire de recherche contient 4 zones de liste et non pas 2.
L'utilisateur peut rechercher des anales d'examens selon :

  • le diplôme (liste "sel_exam") ;
  • l'année (liste "sel_annee") ;
  • la session (liste "sel_session") ;
  • le thème (liste "sel_theme") ;

Au niveau BDD, rien de compliqué pour l'instant, tout est dans une seule table.

J'ai mis la partie Ajax dans le programme index1.php qui initialise le formulaire et la génération des listes de choix dans le programme listeschoix.php.

index1.php :
Code PHP : 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
<script type="text/javascript">
    /////////////////
    // AJAX
    /////////////////
 
    /* Initialisation XMLHttpRequest */
    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;
    }
 
    /* majListes : met à jour les listes de choix en fonction du choix dans une des listes */
    function majListes(listeChangee, valeurChoisie)
    {
        var listeChangee; // Nom de la liste dans laquelle a été fait un choix
        var valeurChoisie; // Valeur choisie dans la liste changée
        var data = null; // Paramètres à passer pour la construction des listes à mettre à jour
 
        var xhr = getXhr();
        xhr.onreadystatechange = function()
        {
            // si on a tout reçu et que le serveur est ok
            if(xhr.readyState == 4 && xhr.status == 200)
            {
                texthtml = xhr.responseText;
                // On se sert de innerHTML pour refaire les listes de sélection en fonction du ou des choix
                document.getElementById("form_recherche").innerHTML = texthtml;
            }
        }
 
        // on définit la méthode (post) + le fichier de traitement + asynchrone (true)
        xhr.open("POST","listeschoix.php",true);
        xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        // on poste les paramètres à transmettre au fichier qui fera le traitement
 
        if(listeChangee != "" && valeurChoisie != "")
        {
            data = "lmodif="+listeChangee+"&valchoisie="+valeurChoisie;
        }
        xhr.send(data);
    } // Fin function majListes
 
<p><strong>Annales d'examens</strong></p>
<!-- Critères de recherche -->
<p>S&eacute;lectionnez de un &agrave; plusieurs crit&egrave;res de recherche et cliquez sur le bouton "Chercher".</p>
<hr />
<form id="form_recherche">
 
<?php
require("listeschoix.php");
?>
 
</form>
listeschoix.php :
Code PHP : 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
82
require("conn_db.php"); // Connexion à la BDD
 
mysql_query("SET NAMES 'utf8' ");
// Paramètres éventuellements passés par fonction Ajax majListes
if(isset($_POST['lmodif']) && $_POST['lmodif'] != '')
{
    $liste_changee = $_POST['lmodif'];
}
 
if(isset($_POST['valchoisie']) && $_POST['valchoisie'] != '')
{
    $valeur_choisie = $_POST['valchoisie'];
}
 
if(!isset($param))
{
    $param = array(); // tableau de tous les choix effectués par l'utilisateur
}
$param["$liste_changee"] = $valeur_choisie;
 
?>
<!-- Liste de choix du diplôme -->
<select id="sel_exam" onChange="majListes('sel_exam', this.options[this.selectedIndex].value)">
    <option>-- Dipl&ocirc;me --</option>
 
<?php 
$where = 'WHERE 1 ';
 
if($param['sel_annee'] != '')
{
    $where .= " AND Annee = ".intval($valeur_choisie)." ";
}
 
if($param['sel_session'] != '')
{
    $where .= " AND Session = '".mysql_real_escape_string($valeur_choisie)."' ";
}
 
if($param['sel_theme'] != '')
{
    $where .= " AND Contenu = '".mysql_real_escape_string($valeur_choisie)."' ";
}
 
$query = " 
    SELECT DISTINCT Examen 
    FROM examen 
    $where 
    ORDER BY Examen 
";
 
$result = mysql_query($query);
$affiche = '';
 
while ($row = mysql_fetch_row($result))
{
    $examen = $row[0];
    $affiche .= "<option value=\"$examen\" ";
    if($liste_changee == 'sel_exam' && $valeur_choisie == $examen)
    {
        $affiche .= "selected=\"selected\" ";
    }
    $affiche .= ">";
    $affiche .= $examen;
    $affiche .= "</option>";
} // fin while
 
echo $affiche;
?>
</select>
 
// puis la même chose pour les autres listes
 
<input id="seek" name="Chercher" type="submit" value="Chercher" />
<?php 
// Transfert du tableau des options déjà choisies
foreach($param as $cle=>$valeur)
{
?>
<input type="hidden" name="param['<?php echo $cle; ?>']" value="<?php echo $valeur; ?>" />
<?php 
}
?>
L'utilisateur choisit une option dans, par exemple, la liste des diplômes. Je récupère bien l'option choisie qui s'affiche dans la liste des diplômes et les autres listes sont paramétrées en fonction de ce choix.

Mais si l'utilisateur choisit maintenant une option supplémentaire dans une autre liste pour affiner son choix, la première sélection est annulée.

Je ne trouve pas comment garder en mémoire, en deux appels Ajax, la ou les premières sélections qui ont été faites afin que le WHERE de mes requêtes s'alimente petit à petit de toutes les options choisies et que ces options choisies restent affichées comme sélectionnées dans les listes.

Une idée ou une solution à me proposer ?

Merci d'avance à ceux qui répondront.