|
|
|
|
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
Configuration: Windows XP Internet Explorer 6.0
Si tu veux inspires toi de ce code (trois fichies) qui fonctionne en AJAX / Javascript, c'es tà dire sans avoir à recharger la page.
<?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> |
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?
|
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
|
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 |
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...
<?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 |
Salut à tous, ce lien vous aidera :
|
Non dans mon exemple ci dessus il n'y a que 2 listes
|
$nombre_enr=mysql_num_rows($result_recherche);
$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
|
Normal tu utilises
<?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() |
Répondre à Alain42
|
http://www.developpez.net/forums/showthread.php?t=354143
|
Il doit y avoir un pb 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;
?>
|
Répondre à Alain42
|
Rebonjour,
<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édure:";
$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'];
?>
|
Le message est parti en cours de frappe de ma deuxième remarque, c'était :
|
Salut
|