[AJAX] 3ème liste déroulante vide
Résolu
tximiti
Messages postés
27
Date d'inscription
Statut
Membre
Dernière intervention
-
Alain42 -
Alain42 -
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.'ai repris le code sur les livres et auteurs https://siddh.developpez.com/articles/ajax/#LIV-A. D'ailleurs qui est un excellent tutorial.
J'ai voulu rajouter une 3ème liste, mais malheureusement, elle ne se charge pas.
Je ne demande pas de réponse toute faite, mais comprenez ça fait plus de deux semaines que je suis dessus...S'il-vous-plait de l'aide
Voici une partie de mon formulaire dans lequel il y a mes trois listes déroulantes:
Voici mes fonctions AJAX :
Puis ma page liste-formations2.php :
Ma page liste-dates2.php :
Enfin ma page liste-lieux2.php :
Please help me !
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.'ai repris le code sur les livres et auteurs https://siddh.developpez.com/articles/ajax/#LIV-A. D'ailleurs qui est un excellent tutorial.
J'ai voulu rajouter une 3ème liste, mais malheureusement, elle ne se charge pas.
Je ne demande pas de réponse toute faite, mais comprenez ça fait plus de deux semaines que je suis dessus...S'il-vous-plait de l'aide
Voici une partie de mon formulaire dans lequel il y a mes trois listes déroulantes:
<div id="corps"> <form method="POST" name="formulaire" action="inscription1.php" onsubmit="return validateForm(this)"> <div id="titreForm">Inscription à une formation</div> <div id="corpForm"> <fieldset id="formation"> <legend>Formation</legend> <br /> <p> <label for="forma" title="Veuillez sélectionner la formation souhaitée" class="oblig">*Formation souhaitée :</label> <? include 'liste-formations2.php'; ?> </p> <p> <label for="date_forma" title="Veuillez sléectionner la date souhaitée" class="oblig">*Date:</label> <span id="date_form" style='display:inline'> <? include 'liste-dates2.php'; ?> </span> </p> <p> <label for="ref_forma" title="Veuillez saisir le lieu souhaité" class="oblig">Lieu :</label> <span id="lieu_form" style='display:inline'> <? include 'liste-lieux2.php'; ?> </span> </p> </fieldset>
Voici mes fonctions AJAX :
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; } ///// relation formation-date ////// /** * Méthode qui sera appelée sur le click du bouton */ function getDatte(){ 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 en utilisant l'id du span document.getElementById('date_form').innerHTML = leselect; } } // Ici on va voir comment faire du post xhr.open("POST","liste-dates2.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 du select de la formation sel = document.getElementById('formations'); idForma = sel.options[sel.selectedIndex].value; xhr.send("id_formations="+idForma); } ///// relation date-lieu ////// /** * Méthode qui sera appelée sur le click du bouton */ function getLieu(){ 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 en utilisant l'id du span document.getElementById('lieu_form').innerHTML = leselect; } } // Ici on va voir comment faire du post xhr.open("POST","liste-lieux2.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 du select de la date sel = document.getElementById('date_for'); idDatte = sel.options[sel.selectedIndex].value; xhr.send("id_date="+idDatte); }
Puis ma page liste-formations2.php :
<?PHP // include("connexionbd.php"); // Variables de connexion : ajustez ces paramètres selon votre propre environnement /* */$serveur = "localhost"; $user = "root"; $mdp = ""; $base = "agilicom"; $connexion = mysql_connect($serveur, $user, $mdp) or die ("Connexion au serveur impossible"); if (!$connexion) { die('Could not connect: ' . mysql_error()); } $choixbase = mysql_select_db($base, $connexion); ?> <select name='forma' id='formations' onchange='getDatte()'> <option value='-1'>Formations</option> <?php $sql = "SELECT id_formations, nom_formations FROM formation ORDER BY nom_formations"; $res = mysql_query ($sql) or die ("Exécution de la requête impossible"); while($row = mysql_fetch_assoc($res)){ echo "<option value='".$row['id_formations']."'>".$row['nom_formations']."</option>"; } ?> </select>
Ma page liste-dates2.php :
<?PHP // include("connexionbd.php"); // Variables de connexion : ajustez ces paramètres selon votre propre environnement /* */$serveur = "localhost"; $user = "root"; $mdp = ""; $base = "agilicom"; echo "<select name='date_formation' id='date_for' onchange='getLieu()'>"; if(isset($_POST["id_formations"])){ $connexion = mysql_connect($serveur, $user, $mdp) or die ("Connexion au serveur impossible"); if (!$connexion) { die('Could not connect: ' . mysql_error()); } $choixbase = mysql_select_db($base, $connexion); $res = mysql_query("SELECT* FROM date_formations WHERE id_formations= '".$_POST["id_formations"]."' ORDER BY date_date"); while($row = mysql_fetch_assoc($res)){ echo "<option value='".$row["id_date"]."'>".$row["date_date"]."</option>"; } } else echo "<option value='-1'>Choisir une date</option>"; echo "</select>"; ?>
Enfin ma page liste-lieux2.php :
<?PHP // include("connexionbd.php"); // Variables de connexion : ajustez ces paramètres selon votre propre environnement /* */$serveur = "localhost"; $user = "root"; $mdp = ""; $base = "agilicom"; // Affichage du lieu echo "<select name='lieu_formation'>"; if(isset($_POST["id_formations"])&& isset($_POST["id_date"])){ $connexion = mysql_connect($serveur, $user, $mdp) or die ("Connexion au serveur impossible"); if (!$connexion) { die('Could not connect: ' . mysql_error()); } $choixbase = mysql_select_db($base, $connexion); $res = mysql_query("SELECT* FROM date_formations WHERE id_formations='".$_POST["id_formations"]."' AND id_date='".$_POST["id_date"]."' ORDER BY lieu_date"); while($row = mysql_fetch_assoc($res)){ echo "<option value='".$row["id_date"]."'>".$row["lieu_date"]."</option>"; } } else echo "<option value='-1'>Choisir un lieu</option>"; echo "</select>"; ?>
Please help me !
A voir également:
- [AJAX] 3ème liste déroulante vide
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Supprimer page word vide - Guide
- Liste déroulante google sheet - Accueil - Guide bureautique
- Caractere vide - Guide
10 réponses
Je t'avoue que j'ai pas tout lu ton code parce que, je suis pas encore très callé en AJAX mais, je voudrais savoir;
est-ce que les deux premières listes marchent?
est-ce que les trois listes sont dépendantes?
ou bien la 2ème liste dépend de la 1ère et la 3ème liste dépend de la 2ème? Parce que dans ce cas, tu n'aurais qu'à répéter exactement le code de l'exemple mais, en changeant les données de la liste.
ou peut-être que je suis fatigué et que je dis n'importe quoi...
est-ce que les deux premières listes marchent?
est-ce que les trois listes sont dépendantes?
ou bien la 2ème liste dépend de la 1ère et la 3ème liste dépend de la 2ème? Parce que dans ce cas, tu n'aurais qu'à répéter exactement le code de l'exemple mais, en changeant les données de la liste.
ou peut-être que je suis fatigué et que je dis n'importe quoi...
J'avais fait ça pour un autre internaute de CCm: si tu veux t'en inspirer
trois fichiers:
config.php
<?php
$host="localhost";
$Login="root";
$Pass="allaurejul";
$DB="test";
$Table="etudiants";
$champ_niv="niveau";
$champ_etud="etudiants"
?>
listes_liees.php
<html>
<head>
<!-- Script de listes deroulantes liees avec appel par AJAX, (evite le rechargement de la page) -->
<script language="Javascript"type="text/JavaScript">
// Requette AJAX
function makeRequest(url,id_niveau,id_ecrire){
var http_request = false;
//créer une instance (un objet) de la classe désirée fonctionnant sur plusieurs navigateurs
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');//un appel de fonction supplémentaire pour écraser l'en-tête envoyé par le serveur, juste au cas où il ne s'agit pas de text/xml, pour certaines versions de navigateurs Mozilla
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Abandon :( Impossible de créer une instance XMLHTTP');
return false;
}
http_request.onreadystatechange = function() { traitementReponse(http_request,id_ecrire); } //affectation fonction appelée qd on recevra la reponse
// lancement de la requete
http_request.open('POST', url, true);
//changer le type MIME de la requête pour envoyer des données avec la méthode POST , !!!! cette ligne doit etre absolument apres http_request.open('POST'....
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
obj=document.getElementById(id_niveau);
data="val_sel="+obj.value;
http_request.send(data);
}
function traitementReponse(http_request,id_ecrire) {
var affich="";
if (http_request.readyState == 4) {
if (http_request.status == 200) {
// cas avec reponse de PHP en mode texte:
//chargement des elements reçus dans la liste
var affich_list=http_request.responseText;
obj = document.getElementById(id_ecrire);
obj.innerHTML = affich_list;
}
else {
alert('Un problème est survenu avec la requête.');
}
}
}
</script>
</head>
<?php
include ("config.php");
// Connexion a la base de donnees
$AccesBase = mysql_connect($host,$Login,$Pass);
mysql_select_db($DB,$AccesBase);
$QuestionBase = "SELECT DISTINCT $champ_niv FROM $Table ORDER BY $champ_niv ASC " ;
$result_recherche=mysql_db_query($DB, $QuestionBase) or die (mysql_error());
$nombre_enr=mysql_num_rows($result_recherche);
?>
<body>
<form name="test1" method="post" action="liste_liees.php" >
<div id="id_list1">Niveau:<br>
<select name="niv1" id="id_niv1" onChange="makeRequest('rep_PhpAjax.php','id_niv1','id_list2')">
<option>-- Choisissez --</option>
<?php
while ($row=mysql_fetch_assoc($result_recherche)){
?>
<option value="<?php echo $row[$champ_niv]?>"><?php echo $row[$champ_niv]?></option>
<?php
}
?>
</select>
<br><br>
</div>
<div id="id_list2">
<!-- ici sera charge la reponse mode texte de PHP à la request AJAX -->
</div>
</form>
</body>
</html>
repPhpAjax.php
<?php
// script PHP interrogation Base de donnees pour reponse a la requette AJAX
include ("config.php");
// Connexion a la base de donnees
$AccesBase = mysql_connect($host,$Login,$Pass);
mysql_select_db($DB,$AccesBase);
$QuestionBase = "SELECT * FROM $Table WHERE ".$champ_niv."='".$_POST[val_sel]."' ORDER BY ".$champ_etud." ASC " ;
$result_recherche=mysql_db_query($DB, $QuestionBase) or die (mysql_error());
// construction de la liste deroulante
$aff=="";
$aff=$aff."Etudiants:<br>
<select name='niv1' id='cont_list2' >
<option>-- Choisissez --</option>";
while ($row=mysql_fetch_assoc($result_recherche)){
$aff.="<option value=\"$row[$champ_etud]\">$row[$champ_etud]</option>";
}
$aff=$aff."</select><br><br>";
// envoi reponse Php a Ajax
echo $aff;
?>
trois fichiers:
config.php
<?php
$host="localhost";
$Login="root";
$Pass="allaurejul";
$DB="test";
$Table="etudiants";
$champ_niv="niveau";
$champ_etud="etudiants"
?>
listes_liees.php
<html>
<head>
<!-- Script de listes deroulantes liees avec appel par AJAX, (evite le rechargement de la page) -->
<script language="Javascript"type="text/JavaScript">
// Requette AJAX
function makeRequest(url,id_niveau,id_ecrire){
var http_request = false;
//créer une instance (un objet) de la classe désirée fonctionnant sur plusieurs navigateurs
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');//un appel de fonction supplémentaire pour écraser l'en-tête envoyé par le serveur, juste au cas où il ne s'agit pas de text/xml, pour certaines versions de navigateurs Mozilla
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Abandon :( Impossible de créer une instance XMLHTTP');
return false;
}
http_request.onreadystatechange = function() { traitementReponse(http_request,id_ecrire); } //affectation fonction appelée qd on recevra la reponse
// lancement de la requete
http_request.open('POST', url, true);
//changer le type MIME de la requête pour envoyer des données avec la méthode POST , !!!! cette ligne doit etre absolument apres http_request.open('POST'....
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
obj=document.getElementById(id_niveau);
data="val_sel="+obj.value;
http_request.send(data);
}
function traitementReponse(http_request,id_ecrire) {
var affich="";
if (http_request.readyState == 4) {
if (http_request.status == 200) {
// cas avec reponse de PHP en mode texte:
//chargement des elements reçus dans la liste
var affich_list=http_request.responseText;
obj = document.getElementById(id_ecrire);
obj.innerHTML = affich_list;
}
else {
alert('Un problème est survenu avec la requête.');
}
}
}
</script>
</head>
<?php
include ("config.php");
// Connexion a la base de donnees
$AccesBase = mysql_connect($host,$Login,$Pass);
mysql_select_db($DB,$AccesBase);
$QuestionBase = "SELECT DISTINCT $champ_niv FROM $Table ORDER BY $champ_niv ASC " ;
$result_recherche=mysql_db_query($DB, $QuestionBase) or die (mysql_error());
$nombre_enr=mysql_num_rows($result_recherche);
?>
<body>
<form name="test1" method="post" action="liste_liees.php" >
<div id="id_list1">Niveau:<br>
<select name="niv1" id="id_niv1" onChange="makeRequest('rep_PhpAjax.php','id_niv1','id_list2')">
<option>-- Choisissez --</option>
<?php
while ($row=mysql_fetch_assoc($result_recherche)){
?>
<option value="<?php echo $row[$champ_niv]?>"><?php echo $row[$champ_niv]?></option>
<?php
}
?>
</select>
<br><br>
</div>
<div id="id_list2">
<!-- ici sera charge la reponse mode texte de PHP à la request AJAX -->
</div>
</form>
</body>
</html>
repPhpAjax.php
<?php
// script PHP interrogation Base de donnees pour reponse a la requette AJAX
include ("config.php");
// Connexion a la base de donnees
$AccesBase = mysql_connect($host,$Login,$Pass);
mysql_select_db($DB,$AccesBase);
$QuestionBase = "SELECT * FROM $Table WHERE ".$champ_niv."='".$_POST[val_sel]."' ORDER BY ".$champ_etud." ASC " ;
$result_recherche=mysql_db_query($DB, $QuestionBase) or die (mysql_error());
// construction de la liste deroulante
$aff=="";
$aff=$aff."Etudiants:<br>
<select name='niv1' id='cont_list2' >
<option>-- Choisissez --</option>";
while ($row=mysql_fetch_assoc($result_recherche)){
$aff.="<option value=\"$row[$champ_etud]\">$row[$champ_etud]</option>";
}
$aff=$aff."</select><br><br>";
// envoi reponse Php a Ajax
echo $aff;
?>
Le principe avec AJAX:
Tu affiches une première liste avec dans la balise <select onChange="appel_fonction_Ajax("nom_liste1","id_a_ecrire2")"
Cette fonction vient lire le choix dans la liste par document.nom_formulaire.nom_liste.value
et envoie cette valeur en POST à un script php unique qui fait la requette vers la BD et renvoi le résultat sous forme d'une liste <select ...
avec les <options lues dans la BD
Ajax dès la réception charge cette liste dans la page HTML dans le div repéré par id="id_a_ecrire" grace à
document.getElementById("id_a_ecrire").innerHTML
Lorsque l'utilisateur fait son choix dans la deuxième liste par le <select onChange="appel_fonction_Ajax("nom_liste2","id_a_ecrire3")" le processus recomence mais c'est toujours le même script PHP qui est appelé, mais pas avec les mêmes parametres
Etc....
Donc avec l'exemple ci dessus tu devrait pouvoir refaire ton programme.
Tu affiches une première liste avec dans la balise <select onChange="appel_fonction_Ajax("nom_liste1","id_a_ecrire2")"
Cette fonction vient lire le choix dans la liste par document.nom_formulaire.nom_liste.value
et envoie cette valeur en POST à un script php unique qui fait la requette vers la BD et renvoi le résultat sous forme d'une liste <select ...
avec les <options lues dans la BD
Ajax dès la réception charge cette liste dans la page HTML dans le div repéré par id="id_a_ecrire" grace à
document.getElementById("id_a_ecrire").innerHTML
Lorsque l'utilisateur fait son choix dans la deuxième liste par le <select onChange="appel_fonction_Ajax("nom_liste2","id_a_ecrire3")" le processus recomence mais c'est toujours le même script PHP qui est appelé, mais pas avec les mêmes parametres
Etc....
Donc avec l'exemple ci dessus tu devrait pouvoir refaire ton programme.
Bon je dois vraiment être nulle parce que j'ai essayé ta solution et ça ne marche pas. Je ne comprends pas je suis tout ce que tu m'as dit à la lettre..J'arrive pas à voir où je me trompe....
Je t'envoie ce que j'ai fait :
la page listeAJAX.php :
Le formulaire n'a pas changé formulaire.php :
Le select sur ma page liste-formations12.php :
Le select sur ma page liste-dates12.php :
Peux-tu encore m'aiguiller s'il-te-plait...Merci en tout cas de ton aide !
Je t'envoie ce que j'ai fait :
la page listeAJAX.php :
// Requette AJAX pour la liaison formation-date function makeRequest('liste-dates12.php','formations','date_form'){ var http_request = false; //créer une instance (un objet) de la classe désirée fonctionnant sur plusieurs navigateurs if (window.XMLHttpRequest) { // Mozilla, Safari,... http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) { http_request.overrideMimeType('text/xml');//un appel de fonction supplémentaire pour écraser l'en-tête envoyé par le serveur, juste au cas où il ne s'agit pas de text/xml, pour certaines versions de navigateurs Mozilla } } else if (window.ActiveXObject) { // IE try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (!http_request) { alert('Abandon :( Impossible de créer une instance XMLHTTP'); return false; } http_request.onreadystatechange = function() { traitementReponse(http_request,'date_form'); } //affectation fonction appelée qd on recevra la reponse // lancement de la requete http_request.open('POST', 'liste-dates12.php', true); //changer le type MIME de la requête pour envoyer des données avec la méthode POST , !!!! cette ligne doit etre absolument apres http_request.open('POST'.... http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); obj=document.getElementById('formations'); data="id_formations="+obj.value; http_request.send(data); } function traitementReponse(http_request,'date_form') { var affich=""; if (http_request.readyState == 4) { if (http_request.status == 200) { // cas avec reponse de PHP en mode texte: //chargement des elements reçus dans la liste var affich_list=http_request.responseText; obj = document.getElementById('date_form'); obj.innerHTML = affich_list; } else { alert('Un problème est survenu avec la requête.'); } } }
Le formulaire n'a pas changé formulaire.php :
<form method="POST" name="formulaire" action="inscription1.php" onsubmit="return validateForm(this)"> <div id="titreForm">Inscription à une formation</div> <div id="corpForm"> <fieldset id="formation"> <legend>Formation</legend> <br /> <p> <label for="forma" title="Veuillez sélectionner la formation souhaitée" class="oblig">*Formation souhaitée :</label> <span id="form"> <? include 'liste-formations12.php'; ?> </span> </p> <p> <label for="date_forma" title="Veuillez sléectionner la date souhaitée" class="oblig">*Date:</label> <span id="date_form" > <? include 'liste-dates12.php'; ?> </span> </p> <p> <label for="ref_forma" title="Veuillez saisir le lieu souhaité" class="oblig">Lieu :</label> <span id="lieu_form" > <? include 'liste-lieux12.php'; ?> </span> </p> </fieldset>
Le select sur ma page liste-formations12.php :
<select name='forma' id='formations' onChange="makeRequest('liste-dates12.php','formations','date_form')"> <option value='-1'>Formations</option> <?php while($row = mysql_fetch_assoc($res)){ echo "<option value='".$row['id_formations']."'>".$row['nom_formations']."</option>"; } ?> </select>
Le select sur ma page liste-dates12.php :
<select name='date_formation' id='date_for' onChange="makeRequest2('liste-lieux12.php','date_for','lieu_form')">"; <?php if(isset($_POST['id_formations'])){ $sql = mysql_query("SELECT* FROM date_formations WHERE id_formations= '".$_POST['id_formations']."' ORDER BY date_date"); $res = mysql_query ($sql) or die ("Exécution de la requête impossible"); $nombre_enr=mysql_num_rows($res); while($row = mysql_fetch_assoc($res)){ echo "<option value='".$row["id_date"]."'>".$row["date_date"]."</option>"; } } else echo "<option value='-1'>Choisir une date</option>";?> </select>
Peux-tu encore m'aiguiller s'il-te-plait...Merci en tout cas de ton aide !
dans ta fonction AJAX, ne mets pas les parametres en "dur" mais laisse url,id_liste,id_ecrire
et tu passes les valeurs ces parametres lorsque tu appeles la fonction sur le onChange de la liste deroulante comme tu l'a fait.
Supprimes les include des trois scripts des listes.
Copie la une à sa place.
et mets des <div à la place des <span des deux autres listes
Essaye de comprendre comment ça marche en suivant le principe que je t'ai donné plus haut
et tu passes les valeurs ces parametres lorsque tu appeles la fonction sur le onChange de la liste deroulante comme tu l'a fait.
Supprimes les include des trois scripts des listes.
Copie la une à sa place.
et mets des <div à la place des <span des deux autres listes
Essaye de comprendre comment ça marche en suivant le principe que je t'ai donné plus haut
J'ai essayé de te corriger tes fichiers:
(utilises seulement une seule requette Ajax)
Formulaire.php:
<html>
<head>
<script language="Javascript"type="text/JavaScript">
// Requette AJAX pour la liaison formation-date
function makeRequest(url,id_niveau,id_ecrire,id_suivant){
var http_request = false;
//créer une instance (un objet) de la classe désirée fonctionnant sur plusieurs navigateurs
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');//un appel de fonction supplémentaire pour écraser l'en-tête envoyé par le serveur, juste au cas où il ne s'agit pas de text/xml, pour certaines versions de navigateurs Mozilla
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Abandon :( Impossible de créer une instance XMLHTTP');
return false;
}
http_request.onreadystatechange = function() { traitementReponse(http_request,id_ecrire); } //affectation fonction appelée qd on recevra la reponse
// lancement de la requete
http_request.open('POST', url, true);
//changer le type MIME de la requête pour envoyer des données avec la méthode POST , !!!! cette ligne doit etre absolument apres http_request.open('POST'....
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
obj=document.getElementById(id_niveau);
data="val_select="+obj.value;
http_request.send(data);
}
function traitementReponse(http_request,'date_form') {
var affich="";
if (http_request.readyState == 4) {
if (http_request.status == 200) {
// cas avec reponse de PHP en mode texte:
//chargement des elements reçus dans la liste
var affich_list=http_request.responseText;
obj = document.getElementById('date_form');
obj.innerHTML = affich_list;
}
else {
alert('Un problème est survenu avec la requête.');
}
}
}
</script>
</head>
<body>
<form method="POST" name="formulaire" action="inscription1.php" onsubmit="return validateForm(this)">
<div id="titreForm">Inscription à une formation</div>
<div id="corpForm">
<fieldset id="formation">
<legend>Formation</legend>
<br />
<p>
<label for="forma" title="Veuillez sélectionner la formation souhaitée" class="oblig">*Formation souhaitée :</label>
<span id="form">
<?PHP
// include("connexionbd.php");
// Variables de connexion : ajustez ces paramètres selon votre propre environnement
/* */$serveur = "localhost";
$user = "root";
$mdp = "";
$base = "agilicom";
$connexion = mysql_connect($serveur, $user, $mdp) or die ("Connexion au serveur impossible");
if (!$connexion) {
die('Could not connect: ' . mysql_error());
}
$choixbase = mysql_select_db($base, $connexion);
?>
<select name='forma' id='formations' onChange="makeRequest('liste-dates12.php','formations','date_form',')">
<option value='-1'>Formations</option>
<?php
$sql = "SELECT id_formations, nom_formations
FROM formation
ORDER BY nom_formations";
$res = mysql_query ($sql) or die ("Exécution de la requête impossible");
while($row = mysql_fetch_assoc($res)){
echo "<option value='".$row['id_formations']."'>".$row['nom_formations']."</option>";
}
?>
</select>
</span>
</p>
<!-- Liste 2 -->
<p>
<label for="date_forma" title="Veuillez sléectionner la date souhaitée" class="oblig">*Date:</label>
<div id="date_form" >
<!-- ici sera chargee la Liste 2 par Ajax-->
</div>
</p>
<!-- Liste 3 -->
<p>
<label for="ref_forma" title="Veuillez saisir le lieu souhaité" class="oblig">Lieu :</label>
<div id="lieu_form" >
<!-- ci sera chargee la Liste 3 par Ajax-->
</div>
</p>
</fieldset>
</body>
</html>
liste-dates12.php:
<select name='date_formation' id='date_for' onChange="makeRequest('liste-lieux12.php','date_for','lieu_form')">";
<?php
if(isset($_POST['val_select'])){
$sql = mysql_query("SELECT*
FROM date_formations
WHERE id_formations= '".$_POST['val_select']."'
ORDER BY date_date");
$res = mysql_query ($sql) or die ("Exécution de la requête impossible");
$nombre_enr=mysql_num_rows($res);
while($row = mysql_fetch_assoc($res)){
echo "<option value='".$row["id_date"]."'>".$row["date_date"]."</option>";
}
}
else
echo "<option value='-1'>Choisir une date</option>";?>
</select>
(utilises seulement une seule requette Ajax)
Formulaire.php:
<html>
<head>
<script language="Javascript"type="text/JavaScript">
// Requette AJAX pour la liaison formation-date
function makeRequest(url,id_niveau,id_ecrire,id_suivant){
var http_request = false;
//créer une instance (un objet) de la classe désirée fonctionnant sur plusieurs navigateurs
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');//un appel de fonction supplémentaire pour écraser l'en-tête envoyé par le serveur, juste au cas où il ne s'agit pas de text/xml, pour certaines versions de navigateurs Mozilla
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Abandon :( Impossible de créer une instance XMLHTTP');
return false;
}
http_request.onreadystatechange = function() { traitementReponse(http_request,id_ecrire); } //affectation fonction appelée qd on recevra la reponse
// lancement de la requete
http_request.open('POST', url, true);
//changer le type MIME de la requête pour envoyer des données avec la méthode POST , !!!! cette ligne doit etre absolument apres http_request.open('POST'....
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
obj=document.getElementById(id_niveau);
data="val_select="+obj.value;
http_request.send(data);
}
function traitementReponse(http_request,'date_form') {
var affich="";
if (http_request.readyState == 4) {
if (http_request.status == 200) {
// cas avec reponse de PHP en mode texte:
//chargement des elements reçus dans la liste
var affich_list=http_request.responseText;
obj = document.getElementById('date_form');
obj.innerHTML = affich_list;
}
else {
alert('Un problème est survenu avec la requête.');
}
}
}
</script>
</head>
<body>
<form method="POST" name="formulaire" action="inscription1.php" onsubmit="return validateForm(this)">
<div id="titreForm">Inscription à une formation</div>
<div id="corpForm">
<fieldset id="formation">
<legend>Formation</legend>
<br />
<p>
<label for="forma" title="Veuillez sélectionner la formation souhaitée" class="oblig">*Formation souhaitée :</label>
<span id="form">
<?PHP
// include("connexionbd.php");
// Variables de connexion : ajustez ces paramètres selon votre propre environnement
/* */$serveur = "localhost";
$user = "root";
$mdp = "";
$base = "agilicom";
$connexion = mysql_connect($serveur, $user, $mdp) or die ("Connexion au serveur impossible");
if (!$connexion) {
die('Could not connect: ' . mysql_error());
}
$choixbase = mysql_select_db($base, $connexion);
?>
<select name='forma' id='formations' onChange="makeRequest('liste-dates12.php','formations','date_form',')">
<option value='-1'>Formations</option>
<?php
$sql = "SELECT id_formations, nom_formations
FROM formation
ORDER BY nom_formations";
$res = mysql_query ($sql) or die ("Exécution de la requête impossible");
while($row = mysql_fetch_assoc($res)){
echo "<option value='".$row['id_formations']."'>".$row['nom_formations']."</option>";
}
?>
</select>
</span>
</p>
<!-- Liste 2 -->
<p>
<label for="date_forma" title="Veuillez sléectionner la date souhaitée" class="oblig">*Date:</label>
<div id="date_form" >
<!-- ici sera chargee la Liste 2 par Ajax-->
</div>
</p>
<!-- Liste 3 -->
<p>
<label for="ref_forma" title="Veuillez saisir le lieu souhaité" class="oblig">Lieu :</label>
<div id="lieu_form" >
<!-- ci sera chargee la Liste 3 par Ajax-->
</div>
</p>
</fieldset>
</body>
</html>
liste-dates12.php:
<select name='date_formation' id='date_for' onChange="makeRequest('liste-lieux12.php','date_for','lieu_form')">";
<?php
if(isset($_POST['val_select'])){
$sql = mysql_query("SELECT*
FROM date_formations
WHERE id_formations= '".$_POST['val_select']."'
ORDER BY date_date");
$res = mysql_query ($sql) or die ("Exécution de la requête impossible");
$nombre_enr=mysql_num_rows($res);
while($row = mysql_fetch_assoc($res)){
echo "<option value='".$row["id_date"]."'>".$row["date_date"]."</option>";
}
}
else
echo "<option value='-1'>Choisir une date</option>";?>
</select>
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Si tu n'y arrives pas je reviens en fin de semaine.
Et si tu veux je peux te faire les fichiers complets qui fonctionnent, je les testerai sur mon serveur.
Bon courabge
Et si tu veux je peux te faire les fichiers complets qui fonctionnent, je les testerai sur mon serveur.
Bon courabge
Je dois vraiment être un cas désespéré....J'ai essayé de faire les modifications sans reprendre les fichiers que tu m'as donné ...Ca ne marchait pas, alors j'ai repris directement les fichiers modifiés que tu m'as mis..Et ca ne marche pas, ça vient donc de mon code...Mais où je le lis et relis, enlève, remets, change, rien n'y fait...Au secours..Merci de ton aide...Merci !
Alors récapitulons, j'ai continué mes recherches avec mon premier code. Et on m'a un peu aidé à comprendre mon problème, il me manquait pour la deuxième fonction AJAX un bout de code, je vous le mets :
Mais j'ai encore un souci : lorsque je sélectionne une formation, ça me met direct la date, et non <-- choisir une date -->, ce qui fait que le lieu ne change que si j'ai plusieurs dates et que je clique sur une autre de ses dates, si je n'ai qu'une date alors le lieu ne change pas...Faut que je continue à chercher...
sel = document.getElementById('date_for'); idDatte = sel.options[sel.selectedIndex].value; var data = ("id_formations="+idForma+"&id_date="+idDatte) ; xhr.send(data);
Mais j'ai encore un souci : lorsque je sélectionne une formation, ça me met direct la date, et non <-- choisir une date -->, ce qui fait que le lieu ne change que si j'ai plusieurs dates et que je clique sur une autre de ses dates, si je n'ai qu'une date alors le lieu ne change pas...Faut que je continue à chercher...
Mes trois listes fonctionnent !!! J'ai changé la place de l'option avec valeur null dans la page liste-dates.php :
<select name='date_formation' id='date_for' onchange='getLieu()'> <option value='null'>Choisir une date</option> <?php if(isset($_POST["id_formations"])){ $res = mysql_query("SELECT* FROM date_formations WHERE id_formations= '".$_POST["id_formations"]."' ORDER BY date_date"); while($row = mysql_fetch_assoc($res)){ echo "<option value='".$row["id_date"]."'>".$row["date_date"]."</option>"; } }?> </select>
Un énorme merci à Alain42 qui m'a aidé, ce qui m'a redonné le moral et que je n'ai pas abandonné!Merci !!!!
Alors félicitations !!
Très content d'avoir pu t'aider.
Par contre il n'est pas logique que tu utilises deux fonctions MaqueRequest AJAX.
C'est la raison pour laquelle on utilise des arguments sous forme de varaibles
Maquerequest(url,id_lire_id_ecrire)
Et c'est lors de l'appel de la fonction dans la page que tu lui passe les valeurs de ces arguments.
C'est tout l' intêret des fonctions, c'est de pouvoir servir plusieurs fois;
Bon continuation pour tes études.
Très content d'avoir pu t'aider.
Par contre il n'est pas logique que tu utilises deux fonctions MaqueRequest AJAX.
C'est la raison pour laquelle on utilise des arguments sous forme de varaibles
Maquerequest(url,id_lire_id_ecrire)
Et c'est lors de l'appel de la fonction dans la page que tu lui passe les valeurs de ces arguments.
C'est tout l' intêret des fonctions, c'est de pouvoir servir plusieurs fois;
Bon continuation pour tes études.
C'est moi qui revient au cas ou tu repasserait par là.
Je veux aussi te signaler un bug possible/
- si l'utilisateur sélectionne une valeur dans la liste 1, puis dans la liste 2, il aura la liste 3 correspondante à cette valeur (lue dans la BD).
Et si l'utilisateur modifie ensuite son choix dans la liste 1, la liste 2 s'affiche bien avec les valeurs de la BD lues par rapport à ce nouveau choix, mais la liste 3 ne correspond plus au dernier choix , si l'utilisateur ne modifie pas son choix dans la liste 2 !!!.
Donc il faudrait passer par une fonction Javascript intermediaire
dans l'appel depuis la liste 1 au lieu de makeRequest(.......
tu mets MiseAJ(........... et les mêmes parametres
et tu crée une fonction JS qui va d'abord effacer puispeller la fct MakeRequest
function MiseAJ(tous les arguments){
document.getElementById(id_liste2).innerHTML="";
document.getElementById(id_liste3).innerHTML="";
makeRequest(tous les arguments);
}
}
Je veux aussi te signaler un bug possible/
- si l'utilisateur sélectionne une valeur dans la liste 1, puis dans la liste 2, il aura la liste 3 correspondante à cette valeur (lue dans la BD).
Et si l'utilisateur modifie ensuite son choix dans la liste 1, la liste 2 s'affiche bien avec les valeurs de la BD lues par rapport à ce nouveau choix, mais la liste 3 ne correspond plus au dernier choix , si l'utilisateur ne modifie pas son choix dans la liste 2 !!!.
Donc il faudrait passer par une fonction Javascript intermediaire
dans l'appel depuis la liste 1 au lieu de makeRequest(.......
tu mets MiseAJ(........... et les mêmes parametres
et tu crée une fonction JS qui va d'abord effacer puispeller la fct MakeRequest
function MiseAJ(tous les arguments){
document.getElementById(id_liste2).innerHTML="";
document.getElementById(id_liste3).innerHTML="";
makeRequest(tous les arguments);
}
}
Merci pour toute cette aide, ça fait du bien ! Lol ! Tu sais je ne suis pas encore très calée c'est pour ça que je ne sais pas encore optimier et que j'utilise deux fonctions. J'ai vérifié pour le bug que tu m'indiques mais en fait ça fonctionne bien. Ce que j'ai fait, c'est ce que quand l'internaute choisi une autre formation, la liste déroulante des dates réaffiche aussitot choisir une date, et la nouvelles dates correspondantes n'ont plus qu'à être sélectionnées...Et donc enfin une fois que la nouvelle date est sélectionnée, s'affiche le lieu correspondant.
Merci de ton aide précieuse ;-)
Merci de ton aide précieuse ;-)
En fait, l'internaute sélectionne une formation pour ensuite sélectionner une date et enfin en fonction de cette date un lieu.
Donc la deuxième (date) qui dépend de la 1ère (formation) et la troisième (lieu) dépend de la seconde, donc j'ai fait comme tu as dit j'ai répété le code...Et ça ne marche pas....J'ai vérifié si je m'étais trompée dans les noms ou id et je ne vois rien..Alors peut-être que je suis bigleuse..Enfin ça oui depuis le temps que je suis dessus ! :-(