Problème pour lier 2 listes déroulantes PHP

Fermé
bbk91 - 31 juil. 2007 à 16:07
 Yohan - 26 juin 2008 à 10:41
Problème pour lier deux listes déroulantes PHP


Bonjour, j'ai un soucis qui me ralentit considérablement....


Comment lier deux listes déroulantes sous PHP, c'est à dire qu'une liste serait remplie suite à la sélection
d'un élément dans une première liste grâce à la connexion à une base de donnée(oracle)???

Par exemple, j'ai une liste de pays et en sélectionnant un pays, j'obtiens une liste de villes liées au pays sélectionné. Serait-ce un prog de ce style?

##$db = NewADOConnection("oci8");

$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);

echo '<form method="POST" action="recherche.php">';

$req="SELECT * FROM pays ORDER BY idpays";
$res=$db->Execute($req);

echo "<tr>";
echo "<td>";
echo "Veuillez sélectionner le pays concerné :";

echo "<select name = 'Pays' size ='1'>";
echo"<INPUT TYPE=HIDDEN NAME="id" VALUE=".$data['idpays'].">\n";

while ($data=$res->FetchRow())
{
echo "<option> ".$data['nom_pays']." </OPTION>";
}
echo "</select>";
echo "</td>";
echo "</tr>";#

if (isset($_POST["Pays"]))
{
$Pays = $_POST["Pays "];
$db->Execute("SELECT nom_ville FROM villes WHERE villes.idpays='.$data['idpays']." );
}

$req2="SELECT * FROM villes ORDER BY idville";
$res2=$db->Execute($req2);

echo "<tr>";
echo "<td>";
echo "Veuillez sélectionner la ville concernée :";
echo "<select name = 'Ville' size ='1'>";

while ($data2=$res2->FetchRow())
{
echo "<option> ".$data2['nom_ville']." </OPTION>";
}

echo "</select>";
echo "</td>";#

Merci d'avance
A voir également:

19 réponses

Si tu veux inspires toi de ce code (trois fichies) qui fonctionne en AJAX / Javascript, c'es tà dire sans avoir à recharger la page.

fichier config.php:
<?php
$host="localhost";
$Login="xxxxx";
$Pass="xxxxx";
$DB="test";
$Table="etudiants";
$champ_niv="niveau";
$champ_etud="etudiants";
?>


fichier liste_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>

fichier repPhpAjax.php:
<code><?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;
?>

</code>
0
le problème c'est que je ne me connecte pas à une base MySQL mais Oracle... en fait je souhaiterai finir en php tel que le code que j'ai rédigé ci-dessus est à compléter, je sais que j'y suis presque mais quoi faire?

Il faut que je récupère la valeur de la première liste pour m'en servir afin de nourrir le contenu de la deuxième liste...

Merci de m'avoir répondu. J'espère que vous pourriez m'aider dans ce sens là
0
Le fait d'utiliser Oracle plutôt que Mysql ne change pas grand chose à la méthode que je t'ai donné, il suffit que tu adaptes les lignes qui concernent les requettes à la base



Par contre dans le script que tu as donné plus haut, plusieurs remarques:


echo "<select name = 'Pays' size ='1'>";
echo"<INPUT TYPE=HIDDEN NAME="id" VALUE=".$data['idpays'].">\n";

while ($data=$res->FetchRow())
{
echo "<option> ".$data['nom_pays']." </OPTION>";
}
echo "</select>";


1- size="1" il vaut mieux mettre plus car c'est le nombre d'items affichés, ça veut dire que il faudra scrooler pour tout voir, mets 10

2- il ne faut pas mettre la ligne echo"<INPUT TYPE=HIDDEN NAME="id" VALUE=".$data['idpays'].">\n"; entre les balises <select> </select> ça risque de gêner la liste découlante, mets la en dehors

3- echo "<option> ".$data['nom_pays']." </OPTION>";
si tu mets <option en minuscules mets <:options> pareil

et rajoute value="...." car c'est ça qui sera posté et récupérable par $_POST !
echo "<option value=".$data['id_pays']."> ".$data['nom_pays']." </option>
tu peux mettre une valeur dans value="..." différente de ce qui s'affiche dans la ligne de la liste déroulante

4- $db->Execute("SELECT nom_ville FROM villes WHERE villes.idpays='.$data['idpays']." );
si tu veux utiliser la valeur postée alors:
$data_id_pays=$_POST['Pays'];
$db->Execute("SELECT nom_ville FROM villes WHERE villes.idpays='.$data_id_pays." );

tu remarqueras que c'est l'id qui est posté car c'est cette valeur qui est mise dans les lignes <options
0
Je suis reparti vers votre solution mais ça ne marche pas...cela fait deux semaines qu je suis bloqué. Mon projet passe par ces lignes de code...
Je veux deux listes : une qui contient des processus de la table "processes"(:idprocess et heading=intitulé) et l'autre des procédures de la table "procedures" (:idprocedure et heading=intitulé)

fichier config.php:
<?php

$champ_pros="idprocess";
$champ_prod="idprocedure";
?>



fichier liste_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) { // 
            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
            }
        } 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
// Connexion a la base de donnees  
include "modules/adodb/adodb.inc.php";
include "config/config.php";
// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "select heading from processes order by idprocess ASC"; 
$res=$db->Execute($req);
$nombre_enr=mysql_num_rows($result_recherche);// *****Equivalent, pas en MySQL?
?>
<body>
<form name="test1" method="post" action="liste_liees.php"  >
	<div id="id_list1">Processus:<br>
		<select name="pros1" id="id_pros1" onChange="makeRequest('rep_PhpAjax.php','id_pros1','id_list2')">
<option>-- Choisissez --</option>
<?php
while ($data=$res->FetchRow()){
?>
<option value="<?php echo $row[$champ_pros]?>"><?php echo $row[$champ_pros]?></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>



fichier repPhpAjax.php:
<?php
// script PHP interrogation Base de donnees pour reponse a la requete AJAX
include "modules/adodb/adodb.inc.php";
include "config/config.php";

// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "select * from processes where ".$champ_pros."= '".$_POST[val_sel]."' ORDER BY ".$champ_prod." ASC " ;"; 
$res=$db->Execute($req);

// construction de la liste deroulante
$aff=="";
$aff=$aff."Procédure:<br> //***il manquerait apparement une ; ou je sais pas quoi sur les deux lignes dessus 		<select name='pros1' id='cont_list2' >
		<option>-- Choisissez --</option>";
		while ($data=$res->FetchRow()) {
$aff.="<option value=".$data[$champ_prod].">".$data[$champ_prod]."</option>"; 
		}
	$aff=$aff."</select><br><br>";
// envoi reponse Php a Ajax	
	echo $aff;
?>



Aidez moi s'il vous plaît!!!!


MErci

bbk974
0
Merci de m'avoir répondu mais entre temps je me suis orienté vers une autre solution qui est :


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<head>
<?php

	include "modules/adodb/adodb.inc.php";
	include "config/config.php";
	$db = NewADOConnection("oci8");
	$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
	$db->Connect($cstr, $USER, $PWD);
	
?>
	<script type="text/javascript">
	
	function Choix(formulaire) 
		{
		i = formulaire.boite1.selectedIndex;
		if (i == 0) 
		    {
			$nrows = $res-> Fieldcount();
		    }
		 for(i=0;i<nrows;i++) 
//la ca serait por prendre en compte le nombre de cas mais je ne sais pas comment l'exprimer
		    {
		    formulaire.boite2.options[i].text="";
		    }
		  return;
		}

		switch (i) 
	    {
<?php 

while("select * from processes order by processus.heading") ;
{
echo "case 'idprocedure' : var txt = new Array ("select * from procedures where procedures.idprocess='boite1' order by procedures.heading");break;

//comment utiliser "case" avec des requetes SQL pour générer automatiquement le contenu de la deuxième liste?	
}

echo ,"procedures"

?>

close recordset
	      }
			
		formulaire.boite2.options[0].text="--- Choisissez une procedure ---";
		for (i=0;i<$nrows;i++)
		  {
		formulaire.boite2.options[i+1].text=txt[i];
		  }
		} 
  </script>	

</head>

<body>

	<form action="#" name="formulaire">
	<?php

	$req="SELECT * FROM processes  ORDER BY idprocess";	
	$res=$db->Execute($req);

	?>
	
		<select name="boite1" onChange='Choix(this.form)'>
		<option selected>--- Choisissez un processus ---</option>
		
	<?php
		while ($data=$res->FetchRow())
		{
			echo "<option> ".$data['HEADING']." </option>"; 
		} 
	?>
			
		<select name="boite2" OnChange="alert('vous avez choisi : \n Le processus ' + formulaire.boite1.selectedIndex + ' et la page ' +formulaire.boite2.selectedIndex+ '')">
			<option selected>--- Choisissez une procédure ---</option>

			<option></option>
			<option></option>
			<option></option>
		</select>
	</form> 

</body>




Merci d'avance
0

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

Posez votre question
Je suis reparti vers votre solution mais ça ne marche pas...cela fait deux semaines qu je suis bloqué. Mon projet passe par ces lignes de code...
Je veux deux listes : une qui contient des processus de la table "processes"(:idprocess et heading=intitulé) et l'autre des procédures de la table "procedures" (:idprocedure et heading=intitulé)

fichier config.php:

<?php

$champ_pros="idprocess";
$champ_prod="idprocedure";
?>



fichier liste_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) { // 
            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
            }
        } 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
// Connexion a la base de donnees  
include "modules/adodb/adodb.inc.php";
include "config/config.php";
// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "select heading from processes order by idprocess ASC"; 
$res=$db->Execute($req);
$nombre_enr=mysql_num_rows($result_recherche);// *****Equivalent, pas en MySQL?
?>
<body>
<form name="test1" method="post" action="liste_liees.php"  >
	<div id="id_list1">Processus:<br>
		<select name="pros1" id="id_pros1" onChange="makeRequest('rep_PhpAjax.php','id_pros1','id_list2')">
<option>-- Choisissez --</option>
<?php
while ($data=$res->FetchRow()){
?>
<option value="<?php echo $row[$champ_pros]?>"><?php echo $row[$champ_pros]?></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>


fichier repPhpAjax.php:
<?php
// script PHP interrogation Base de donnees pour reponse a la requete AJAX
include "modules/adodb/adodb.inc.php";
include "config/config.php";

// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "select * from processes where ".$champ_pros."= '".$_POST[val_sel]."' ORDER BY ".$champ_prod." ASC " ;"; 
$res=$db->Execute($req);

// construction de la liste deroulante
$aff=="";
$aff=$aff."Procédure:<br> //***il manquerait apparement une ; ou je sais pas quoi sur les deux lignes dessus 		<select name='pros1' id='cont_list2' >
		<option>-- Choisissez --</option>";
		while ($data=$res->FetchRow()) {
$aff.="<option value=".$data[$champ_prod].">".$data[$champ_prod]."</option>"; 
		}
	$aff=$aff."</select><br><br>";
// envoi reponse Php a Ajax	
	echo $aff;
?>


Aidez moi s'il vous plaît!!!!


MErci

bbk974
0
ted470 Messages postés 28 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 27 février 2009 19
6 août 2007 à 14:43
salut à tous, ce lien vous aidera :
http://www.roodali.com/index.php?2007/07/03/9-2-listes-deroulantes-liees-avec-ajax-mysql-php
0
Slt, j'aimerai savoir a qoui correspond bien_immo? car moi je voudrais travailler qu'avec deux tables
"processes" et "procedures" et je crois que dans l'exemple il y en a 3... liste des procedures nourrit grâce à la sélection d'un processus dans la première liste...
0
Non dans mon exemple ci dessus il n'y a que 2 listes

Par contre:
// construction de la liste deroulante
$aff=="";
$aff=$aff."Procédure:<br> //***il manquerait apparement une ; ou je sais pas quoi sur les deux lignes dessus <select name='pros1' id='cont_list2' >
<option>-- Choisissez --</option>";
while ($data=$res->FetchRow()) {
$aff.="<option value=".$data[$champ_prod].">".$data[$champ_prod]."</option>";
}
$aff=$aff."</select><br><br>";
// envoi reponse Php a Ajax
echo $aff;


une erreur:
ce n'est pas $aff==""; mais $aff="";


-concatenes bien en faisant $aff.=" à chaque fois

Si tu veux visualiser ce que tu reçoit de repAjaxPhp.php mets un
alert("Reponse PHP: "+http_request.responseText);
après // cas avec reponse de PHP en mode texte:
dans la fonction Traitement de la réponse
0
merci beaucoup de m'aider alain42!

et pour cette partie de code?
<?php
// Connexion a la base de donnees  
include "modules/adodb/adodb.inc.php";
include "config/config.php";
// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "select heading from processes order by idprocess ASC"; 
$res=$db->Execute($req);
$nombre_enr=mysql_num_rows($result_recherche);// *****Equivalent, pas en MySQL?
?>


quel est l'équivalent de la dernière ligne de code, je ne sais pas comment faire?

CDLT

bbk974
0
$nombre_enr=mysql_num_rows($result_recherche);
Cette ligne tu peux la suprimer je l'avais mise pour moi au début pour débugger le script je faisait un echo $nombre_enr pour voir si on lisait qq chose dans la base, donc inutile maintenant

une petite remarque en passant, pour une meilleure lisibilité il vaut mieux ecrire:

$req = "SELECT heading FROM processes ORDER BY idprocess ASC";

que
$req = "select heading from processes order by idprocess ASC";

ça marche pareil mais c'est plus facile à lire donc à débugger
0
merci, le problème ,c'est qu'il n'y a rien qui apparaît dans la première liste, je ne sais pourquoi ce n'est pas encore bon

donc voila mon code dans l'intégralité:

fichier liste_liees.php:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> 
<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) { // 
            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
            }
        } 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
alert("Reponse PHP: "+http_request.responseText);
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
// Connexion a la base de donnees  
include "modules/adodb/adodb.inc.php";
include "config/config.php";
// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "SELECT heading FROM processes ORDER BY idprocess ASC"; 
$res=$db->Execute($req);

?>
<body>
<form name="test1" method="post" action="liste_liees.php"  >
<div id="id_list1">Processus:<br>
<select name="pros1" id="id_pros1" onChange="makeRequest('rep_PhpAjax.php','id_pros1','id_list2')">
<option>-- Choisissez --</option>
<?php
while ($data=$res->FetchRow()){
?>
<option value="<?php echo $data[$champ_pros]?>"><?php echo $data[$champ_pros]?></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>


fichier rePHPAjax.php:

<?php
// script PHP interrogation Base de donnees pour reponse a la requete AJAX
include "modules/adodb/adodb.inc.php";
include "config/config.php";

// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "SELECT * FROM processes WHERE ".$champ_pros."= '".$_POST[val_sel]."' ORDER BY ".$champ_prod." ASC " ;"; 
$res=$db->Execute($req);

// construction de la liste deroulante" .
$aff="";
$aff.="Procédure:";
echo"<br>";
echo"<select name='pros1' id='cont_list2' >";
echo"<option>-- Choisissez --</option>";
while ($data=$res->FetchRow()) {
$aff.="<option value=".$data[$champ_prod].">".$data[$champ_prod]."</option>"; 
		}
$aff=$aff."</select><br><br>";
// envoi reponse Php a Ajax	
echo $aff; 
			
?>

Merci
0
Normal tu utilises
<?php
while ($data=$res->FetchRow()){
?>
<option value="<?php echo $data[$champ_pros]?>"><?php echo $data[$champ_pros]?></option>


or FetchRow renvoi le rang donc accessible par le numero (le rang) du champ de la base


<?php
while ($data=$res->FetchRow()){
?>
<option value="<?php echo $data[0]?>"><?php echo $data[0]?></option>



si $champ_pros est ton premier champ de ta table, sinon adaptes


Ou si tu veux conserver le nom du champ, ce qui est plus "parlant" tu utilises FetchAssoc()
0
oki merci, la première liste est remplie mais quand je sélectionne un processus, le message "un pb est survenu avec la requete" apparaît...

Je sais que j'y suis presque...mais je pense que le fichier repPhpAjax.php n'est pas juste

merci alain42

bbk974
0
Oui tu as une erreur à cette ligne:

$req = "SELECT * FROM processes WHERE ".$champ_pros."= '".$_POST[val_sel]."' ORDER BY ".$champ_prod." ASC "; 


il y avait ;" en trop à la fin
0
le problème est toujours là. Je suis désespéré car je dois bientôt rendre mon travail fourni et j'ai pri trop de retard ....

N'y aurait-il pas un problème avec val_sel???

Merci encore et encore...

bbk974
0
Mets ce code dans le fichier repAjaxPhp.php:

<?php
// script PHP interrogation Base de donnees pour reponse a la requete AJAX
include "modules/adodb/adodb.inc.php";
include "config/config.php";

// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "SELECT * FROM processes WHERE ".$champ_pros."= '".$_POST[val_sel]."' ORDER BY ".$champ_prod." ASC " ;
$res=$db->Execute($req);

// construction de la liste deroulante" .
$aff="";
$aff.="Procédure:";
$aff.="<br>";
$aff.="<select name='pros1' id='cont_list2' >";
$aff.="<option>-- Choisissez --</option>";
while ($data=$res->FetchAssoc()) {
$aff.="<option value=".$data[$champ_prod].">".$data[$champ_prod]."</option>"; 
		}
$aff.="</select><br><br>";
// envoi reponse Php a Ajax	
echo $aff; 
			
?>


Il y avait la aussi le pb de FetchRow, plus qq echo qui n'avaient rien a y faire.
0
bbk974 > Alain42
7 août 2007 à 11:11
Bonjour Alain42,

J'ai effectué le remplacement de fichier et modifié une petite faute dans liste_liees.php mais ça ne fonctionne toujours pas. quand je sélectionne un processus, cela m'affiche comme message "réponse PHP" dans une fenêtre Attention....

Je sais que ça doit être une petite errur qui traîne cela dit je ne sais pas où!

bbk974
0
Alain42 > Alain42
7 août 2007 à 11:16
L'affichage dans une fenêtre Attention: Reponse PHP est normal puisque pour voir ce qui se passe je t'ai fait rajouter une boite alert dans la fct Ajax (il faudra penser à l'enlever après qd ça marchera !)

Qu'y a t'il d'écrit après Reponse PHP: dans cette boite d'alert ?
0
bbk974 > Alain42
7 août 2007 à 11:28
rien cela met "reponse Php:" puis rien
0
kore62 Messages postés 9 Date d'inscription samedi 4 août 2007 Statut Membre Dernière intervention 23 août 2007 10
6 août 2007 à 22:47
https://www.developpez.net/forums/d354143/java/developpement-web-java/frameworks-web/struts-1/menu-deroulant-dynamiquepstruts/

Va sur ce lien il ya la reponse a ta question ;)

En fait j crois que ca te servira a rien, cette solution utilise struts ca rien a voir j suis fatigué moi... j ele laisse a k ou lol Bonne soiree!!
0
Il doit y avoir un pb dans le fichier repAjaxPhp.php

Essaye en mettant comme ça dans ce fichier, tu devrais avoir quelque chose dans ta boite d'alaerte après Reponse PHP.

J'ai mis en commentaire la partie concernant la BD, on verra si c'est ça qui gène.

<?php
// script PHP interrogation Base de donnees pour reponse a la requete AJAX
/*include "modules/adodb/adodb.inc.php";
include "config/config.php";

// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "SELECT * FROM processes WHERE ".$champ_pros."= '".$_POST[val_sel]."' ORDER BY ".$champ_prod." ASC " ;
$res=$db->Execute($req);
*/
// construction de la liste deroulante" .
$aff="";
$aff.="Procédure:";
$aff.="<br>";
$aff.="<select name='pros1' id='cont_list2' >";
$aff.="<option>-- Choisissez --</option>";
/*
while ($data=$res->FetchAssoc()) {
$aff.="<option value=".$data[$champ_prod].">".$data[$champ_prod]."</option>"; 
		}
		*/
$aff.="</select><br><br>";
// envoi reponse Php a Ajax	
echo $aff; 
			
?>
0
oui cela m'affiche apres "reponse PHP" la ligne de code suivante :
$aff.="Procédure:";
$aff.="<br>";
$aff.="<select name='pros1' id='cont_list2' >";
$aff.="<option>-- Choisissez --</option>";


sans les $aff.=

Apres que jai clicqué sur ok, le menu procedure s'affiche mais il n' a que la ligne "choisissez" bien entendu!

Est ce un pb de BD?
0
Oui c'est ta procedure d'interro de la BD qui pose pb puisque en l'isolant ça repond.

donc tu enlèves les /* */ pour la remettre et tester

(La methode que je viens te te faire utiliser pour debugger, j'appelle ça saucissonner, c a d découper le pb en tranches pour isoler ou ça coince)

Par contre je ne peux pas t'aider pour la partie BD, je ne la connais pas .
Compares avec la même partie dans le fichier listes_deroulantes.php
0
bbk974 > Alain42
7 août 2007 à 12:32
en fait j'ai deux tables comme tu as pu le voir :

*processes avec idprocess comme identifiant et heading(pour l'intitulé)
*procedures avec idprocedure comme identifiant,heading et idprocess comme clé étrangère.

L'erreur ne viendrait elle pas de :

**
$req = "SELECT * FROM processes WHERE ".$champ_pros."= '".$_POST[val_sel]."' ORDER BY ".$champ_prod." ASC " ; 


-> val_sel est-il approprié pour le renvoi d'info car c'est la première fois qu'elle apparaît.

OU

-> la requete porte sur les processes mais ne devrait-elle pas être sur les procedures comme je voudrais que la 2eme liste dépende du choix dans la 1ere liste.


**
$aff.="<select name='pros1' id='cont_list2' >";


-> Est ce bien pros1 et cont_list2 ? car à la base pros1 est déja utilisé pour les processes

CDLT

bbk974
0
Alain42 > Alain42
7 août 2007 à 13:19
val_sel est le nom de la variable postée par Ajax (voir dans fonction makerequest) donc c'est normal.

peux tu en laissant les /* */ comme precedement dans la partie interro BD et mettre après echo $aff;

echo "<br><br>Valeur postee: ".$_POST['val_sel']; pour voir ce que tu reçois de Ajax, si c'est bien la selection première liste
0
bbk974 > Alain42
7 août 2007 à 13:37
effectivement ce que je reçois d'Ajax est bien ce que j'ai sélectionné dans la première liste...
0
Si ça ne marche toujours pas envoie moi le code des trois fichiers en leur état actuel, je vais essayer de simuler chez moi sur une base Mysql.
0
Merci alain42.

malheureusement ça ne marche toujours pas, je suis dépité.

Voici les fichiers:

fichier liste_liees.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> 
<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) 
        	{ 
            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
            }
			}
			 else if (window.ActiveXObject)
 			{ 
            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
alert("Reponse PHP: "+http_request.responseText);
var affich_list=http_request.responseText;
obj = document.getElementById(id_ecrire); 
obj.innerHTML = affich_list;
		} 
		else {
                alert('Un probleme est survenu avec la requete.');
        }
    }
}
</script>
</head>

<?php
// Connexion a la base de donnees  
include "modules/adodb/adodb.inc.php";
include "config/config.php";
// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "SELECT * FROM processes ORDER BY idprocess ASC"; 
$res=$db->Execute($req);

?>
  <body>
	<form method="post" action="liste_liees.php">
		<div id="id_list1">Processus:<br>
		<select name="pros1" id="id_pros1" onChange="makeRequest('repPhpAjax.php','id_pros1','id_list2')">
		<option>-- Choisissez --</option>
		
<?php
			while ($data=$res->FetchRow())
			{
?>

<option value="<?php echo $data[0]?>"><?php echo $data[0]?></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>


fichier repPhpAjax.php

<?php
// script PHP interrogation Base de donnees pour reponse a la requete AJAX
include "modules/adodb/adodb.inc.php";
include "config/config.php";

// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "SELECT * FROM procedures WHERE idprocess= '".$_POST[val_sel]."' ORDER BY idprocedure " ;
$res = $db->Execute($req );

// construction de la liste deroulante" .
$aff="";
$aff.="Proc&eacutedure:";
$aff.="<br>";
$aff.="<select name='prod1' id='cont_list2' >";
$aff.="<option>-- Choisissez --</option>";

while ($data=$res->FetchAssoc()) {
$aff.="<option value=".$data['idprocedure'].">".$data['heading']."</option>"; 
		}
		
$aff.="</select><br><br>";
// envoi reponse Php a Ajax	
echo $aff; 
echo "<br><br>Valeur postee: ".$_POST['val_sel'];
			
?>


Voici les tables:

CREATE
TABLE PROCEDURES (
IDPROCEDURE NUMBER NOT NULL,
IDPARENT NUMBER NULL,
HEADING VARCHAR2(45) NULL,
SUMMARY VARCHAR2(255) NULL,
IDUSER NUMBER NULL,
IDPROCESS NUMBER NULL
)
/

ALTER TABLE PROCEDURES
ADD CONSTRAINT PROCEDURES_PK PRIMARY KEY (
IDPROCEDURE
)
/

ALTER TABLE PROCEDURES
ADD CONSTRAINT FK_PROCEDURES FOREIGN KEY (
IDPROCESS
) REFERENCES PROCEDURES (
IDPROCEDURE
)
/

-----------------------------------------------------------------


CREATE
TABLE PROCESSES (
IDPROCESS NUMBER NOT NULL,
HEADING VARCHAR2(45) NULL,
IDUSER NUMBER NULL
)
/

Voila, j'espere que tu pourras m'aider.

Merci

bbk974
0
Rebonjour,

Je viens de faire l'essai chez moi sur une base mysql de test que j'ai essayé de remplir avec des valeurs "bidon"
J'ai remis bien sur tes procedures d'appel de base oracle.

Juste deux remarques, si tu veux que ds la première liste s'affiche le heading, mets:
<option value="<?php echo $data[0]?>"><?php echo $data[2]?></option>


ensuite il faudra

alors essayes avec ces fichiers:

listes_liees.php:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> 
<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) 
        	{ 
            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
            }
			}
			 else if (window.ActiveXObject)
 			{ 
            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
//alert("Reponse PHP: "+http_request.responseText);
var affich_list=http_request.responseText;
obj = document.getElementById(id_ecrire); 
obj.innerHTML = affich_list;
		} 
		else {
                alert('Un probleme est survenu avec la requete.');
        }
    }
}
</script>
</head>

<?php
// Connexion a la base de donnees  
//include "modules/adodb/adodb.inc.php";
// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "SELECT * FROM processes ORDER BY idprocess ASC"; 
$res=$db->Execute($req);


?>
  <body>
	<form method="post" action="liste_liees.php">
		<div id="id_list1">Processus:<br>
		<select name="pros1" id="id_pros1" onChange="makeRequest('repPhpAjax.php','id_pros1','id_list2')">
		<option>-- Choisissez --</option>
		
<?php
			while ($data=$res->FetchRow()){
?>

<option value="<?php echo $data[0]?>"><?php echo $data[0]?></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 requete AJAX
include "modules/adodb/adodb.inc.php";
include "config/config.php";

// Connexion a la base de donnees  
$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "SELECT * FROM procedures WHERE idprocess= '".$_POST['val_sel']."' ORDER BY idprocedure " ;
$res = $db->Execute($req );

// construction de la liste deroulante" .
$aff="";
$aff.="Proc&eacutedure:";
$aff.="<br>";
$aff.="<select name='prod1' id='cont_list2' >";
$aff.="<option>-- Choisissez --</option>";

while ($data=$res->FetchAssoc()) {
$aff.="<option value=".$data['idprocedure'].">".$data['heading']."</option>"; 
		}
		
$aff.="</select><br><br>";
// envoi reponse Php a Ajax	
echo $aff; 
//echo "<br><br>Valeur postee: ".$_POST['val_sel'];
			
?>
0
Le message est parti en cours de frappe de ma deuxième remarque, c'était :

il faudra que tu modifies dans la balise <form .... action="listes_liees.php" par le nom du script que tu vas appeler pour traitement ensuite lorsque l'utilisateur appuiera sur le bouton Envoyer, et traitement des valeurs deuxième liste. Parceque je suppose que si tu as fait ces listes c'est qu'ensuite tu vas en faire qq chose.
0
C'est ce que je pensais faire, c'est ce que j'ai fait d'ailleurs car j'ai effectué un renvoi d'infos qui permettra de visualiser les infos saisies avant validation finale.


Mais il me manque toujours ces....listes liées! Je ne comprends toujours pas pourquoi je n'y arrive pas!
Mis à part vous, personne ne peut m'aider et je dois tout rendre venadredi prochain....snif!

CDLT

bbk91
0
Pour simplifier on va abandonner la solution par Ajax, voici donc une solution entiérement PHP, la pge se recharge, mais la sélection faite dans la première liste est conservée grace à:
<?php if($_POST['pros1']==$data[0]){echo "selected";} ?> que j'ai rajouté dans la ligne <option> liste 1
Ca marche avec ma BD mysql, alors si pas bon avec Oracle vois de ce côté la (cle etrangère ?)

donc le fichier listes_liees.php: ( si tu changes le nom, changes aussi dans la balise <form action= .....

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> 
<html>
<head>

</head>

<?php

include "modules/adodb/adodb.inc.php";
// Connexion a la base de donnees  

$db = NewADOConnection("oci8");
$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=$PROTOCOL)(HOST=$HOST)(PORT=$PORT))(CONNECT_DATA=(SID=$SID)))";
$db->Connect($cstr, $USER, $PWD);
$req = "SELECT * FROM processes ORDER BY idprocess ASC"; 
$res=$db->Execute($req);

?>
  <body>
	<form method="post" action="listes_liees.php">
		<div id="id_list1">Processus:<br>
		<select name="pros1" id="id_pros1" onChange="submit()">
		<option>-- Choisissez --</option>
		
<?php
			while ($data=$res->FetchRow()){
			
?>

<option value="<?php echo $data[0]?>" <?php if($_POST['pros1']==$data[0]){echo "selected";} ?>><?php echo $data[1]?></option>

<?php
			}
?>
       </select> 
       <br><br>
       </div>
<?php	
	if(isset($_POST['pros1']) && $_POST['pros1']!=""){
//echo "valeur postee: ".$_POST['pros1'];
$cnx=mysql_connect('localhost','scriptPhp','script63') or die(mysql_error());
$db=mysql_select_db('test',$cnx)or die(mysql_error());
$req = "SELECT * FROM procedures WHERE idprocess= '".$_POST['pros1']."' ORDER BY idprocedure " ; 
$res=mysql_query($req);
?>
		<select name="prod1" id="id_prod1" >
		<option>-- Choisissez --</option>
		
<?php
			while ($data=$res->FetchRow()){
			
?>

<option value="<?php echo $data[0]?>" ><?php echo $data[2]?></option>

<?php
			}
?>
       </select> 
       <br><br>
<?php
}
?>
    </form>
  </body>
</html>
0
bbk974 > Alain42
9 août 2007 à 16:21
oooooooooooooooooouuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuaaaaaaaaaaaiiiiiiiiiiiiissssss!!!!


Merci 1 million de fois alain42, ça marche enfin, j'ai adapté les 2-3lignes MySQL et ça marche!

Heureusement que des gens comme toi existent pour nous faire avancer et redonner le sourire!

Merci encore et encore!

PS:peut être que j'aurais 2/3 questions pour la suite de mes aventures!!!!!

CDLT

bbk874
0
Alain42 > Alain42
9 août 2007 à 16:27
J'en suis aussi heureux que toi, ça commençait à m'inquiéter.

Quelle solution as tu prise:

PHP (la dernière que je viens de te donner) ou Ajax ?
0
bbk974 > Alain42
9 août 2007 à 16:39
ah oui dernier question: Je suppose que pour 3 listes liées, c'est le même principe?
0
Je suis absent de demain matin à après le 15 Aôut
0
Oui j'ai pris la dernière, je te remercie encore!

A bientot peut-être!
0
Pour trois listes liees c'est le même principe.

Par contre tu devras faire le traitement "final" dans ce même fichier listes_liees.php, en mettant un test sur le bouton name='envoyer'

si $_POST['envoyer']
traitement....
etc..

Cordialement

Alain
0
bbk974 > Alain42
16 août 2007 à 12:40
J'ai un souci pour 3 listes déroulantes!!
0
Alain42 > Alain42
19 août 2007 à 20:57
Quel souci ?
0
salut
c'est hichem

j'ai déja utiliser le script suivant pour rélier deux liste la prémiére liste présente le ville de départ et selon la prémiére liste une deuxiéme liste doit être chargé selon la valeur choisi dans la prémiéere liste en faisant tjs selection à partir de la base de donnée sans réchargé la page , bon j'ai utiliser votre script mais un message s'affiche"Un problème est survenu avec la requête."

alors je ne saisd pas c'est quoi le problémé ou , ou il est ele probléme voila le script:


*************************page *****************************
<?php
// script PHP interrogation Base de donnees pour reponse a la requette AJAX

$host="mysql5-6";
$Login="voyagesneet";
$Pass="Oi61QY3m";
$DB="voyagesneet";
$Table="vol";
$champ_niv="depart";
$champ_etud="retour";
// 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;
?>

*****************************************************************************
*****************************page listes_liees**********************************

<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
$host="mysql5-6";
$Login="voyagesneet";
$Pass="Oi61QY3m";
$DB="voyagesneet";
$Table="vol";
$champ_niv="depart";
$champ_etud="retour";
// 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>
*******************************************************

merçi j'attend votre réponse mr sachant que j'utlise un seul table 'vol' qui contient un champ intitulé 'depart' et un autre 'retour'

php/mysql


merçi
0
J'arrive sans doute un peu tard mais déjà je voudrais remercier la personne qui a coder ces listes (Alain42 me semble - t -il)
Quant à votre problème hichem j'avais le même car mon fichier ajax ne portait pas le même nom que dans le onChange onChange="makeRequest('rep_PhpAjax.php','id_niv1','id_list2')"
0