listes déroulantes et dépendantes en php!!!

bbk974
Invité n'ayant pas de compte PHPfrance

31 Juil 2007, 18:23

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???

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?

[php]
<?php
$db = NewADOConnection("");

$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>";

?>
[/php]


Merci d'avance

Modérateur PHPfrance
Modérateur PHPfrance | 7637 Messages

31 Juil 2007, 18:33

Modération :
bbk974, ce sujet a déjà été traité et des réponses ont été apportées et même un topic bien fait est disponible dans la FAQ où tu es censé passer avant de poster :roll:
Faire une petite recherche préalable n'est pas superflu.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

bbk974
Invité n'ayant pas de compte PHPfrance

31 Juil 2007, 18:35

merci pour le conseil, c'est ce que j'ai fait sauf que la méthode PHP utilisé dans un tutoriel utilise du MySQL et que je ne connais pas les équivalences en Oracle....

donc ça ne marche pas

Modérateur PHPfrance
Modérateur PHPfrance | 7637 Messages

31 Juil 2007, 19:05

Foncièrement ça ne change rien au problème.
Exemple d'adaptation rapide :

[php]<?php
$db = NewADOConnection("");

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

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

?>
<form method="POST" action="recherche.php" name="villePays">

Veuillez sélectionner le pays concerné :
<select name = 'Pays' size ='1' onchange="document.forms['villePays'].submit();">
<?php
while ($data=$res->FetchRow())
{
echo "<option value=\"".$data['id_pays']."\"> ".$data['nom_pays']." </option>";
}
?>

</select>
<br />

<?php
if (isset($_POST["Pays"]))
{
$id_pays = $_POST["Pays"];
$db->Execute("SELECT id_ville, nom_ville FROM villes WHERE villes.idpays=".$id_pays );
?>

Veuillez sélectionner la ville concernée :
<select name ='Ville' size ='1'>
<?php
while ($data2=$res2->FetchRow())
{
echo "<option value=\"".$data2['id_ville']."\"> ".$data2['nom_ville']." </option>";
}
?>
</select>

<?php
}
?>
</form>[/php]

tu ne dois pas simplement t'arreter au faite que le tuto est prévu pour MySQL :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 10056 Messages

31 Juil 2007, 23:17

Le but d'un tutoriel n'est pas de te donner une solution clé en main mais de t'expliquer les principes de fonctionnement... et en l'occurence il t'explique comment lier deux champs d'un formulaire :)

A partir de là, que les données viennent de mysql, oracle, excel, ou d'un bête tableau php n'a aucune importance. Tu sais où sont tes données, tu sais comment les récupérer et en suivant le tuto tu sauras quoi en faire. Tu bénéficies en plus du complément d'infos donné par Truc, tu as normalement tous les éléments en main pour que cela fonctionne, après ça ne dépend plus que de toi :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

bbk974
Invité n'ayant pas de compte PHPfrance

01 Août 2007, 14:30

merci beaucoup pour vos réponses même si mon cas n'est pas encore résolu!

Je me suis inspiré de la méthode php du tuto mais je ne connais pas les équivalences entre MySQL et Oracle. Je voudrai sélectionner un processus de la table "processes" qui me permettra de sélectionner une procédure de la table "procedures" parmis une liste de procédures liées au processus choisi.

///// indique que je ne connais pas l'équivalence

[php]<?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);

$idr = isset($_POST['processes'])?$_POST['processes']:null;

?>

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

<title>S&eacutelectionner un d&eacutepartement selon le pprocessus choisi</title>

</head>
<body style="font-family: verdana, helvetica, sans-serif; font-size: 85%">
<?php
if(isset($_POST['ok']) && isset($_POST['procedures']) && $_POST['procedures'] != "")
{
$processes_selectionne = $_POST['processes'];
$procedures_selectionne = $_POST['procedures'];
?>
<p>Vous avez s&eacutelectionn&eacute la proc&eacutedure <?php echo($procedures_selectionne); ?> dans la région <?php echo($processes_selectionne); ?></p>
<?php
}
?>
<h3>Trouver une procedure</h3>
echo'1';
<?php
/* On établit la connexion à MySQL avec mysql_pconnect() plutôt qu'avec mysql_connect()
* car on aura besoin de la connexion un peu plus loin dans le script */

//////$connexion = mysql_pconnect($serveur, $admin, $mdp);
if($connexion != false)
{
////// $choixbase = mysql_select_db($base, $connexion);
$req="SELECT * FROM processes ORDER BY idprocess";
$rech_processes = $db->Execute($req);
$code_processes = array();
$processes = array();
/* On active un compteur pour les processus */
$nb_process = 0;
if($rech_processes != false)
{
///// while($ligne = mysql_fetch_assoc($rech_processes))
{
array_push($code_processes, $ligne['idprocess']);
array_push($processes, $ligne['processes']);

/* On incrémente de compteur */
$nb_processes++;
}
}
?>
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgprocedures">
<fieldset style="border: 3px double #333399">
<legend>Sélectionnez une région</legend>
<select name="processes" id="processes" onchange="document.forms['chgprocedures'].submit();">
<option value="-1">- - - Choisissez un processus - - -</option>
<?php
for($i = 0; $i < $nb_processes; $i++)
{
?>
<option value="<?php echo($code_processes[$i]); ?>"<?php echo((isset($idr) && $idr == $code_processes[$i])?" selected=\"selected\"":null); ?>><?php echo($processes[$i]); ?></option>
<?php
}
?>
</select>
<?php
///// mysql_free_result($rech_processes);
/* On commence par vérifier si on a envoyé un numéro de région et le cas échéant s'il est différent de -1 */

if(isset($idr) && $idr != -1)
{
/* Cération de la requête pour avoir les départements de cette région */
$req2 = "SELECT `idprocedure`, `procedures`".
" FROM `procedures`".
" WHERE `idprocess` = ". $idr ."".
" ORDER BY `idprocedure`;";
if($connexion != false)
{
$rech_procedures = $db->Execute($req2);
/* Un petit compteur pour les procédures */
$nd = 0;
/* On crée deux tableaux pour les numéros et les noms des départements */
$code_procedures = array();
$nom_procedures = array();
/* On va mettre les numéros et noms des départements dans les deux tableaux */

/////// while($ligne_dept = mysql_fetch_assoc($rech_dept))
{
array_push($code_procedures, $ligne_procedures['idprocedure']);
array_push($nom_procedures, $ligne_procedures['procedures']);
$nd++;
}
/* Maintenant on peut construire la liste déroulante */
?>
<select name="procedures" id="procedures">
<?php
for($d = 0; $d<$nd; $d++)
{
?>
<option value="<?php echo($code_procedures[$d]); ?>"<?php echo((isset($procedures_selectionne) && $procedures_selectionne == $code_procedures[$d])?" selected=\"selected\"":null); ?>><?php echo($nom_procedures[$d]." (". $code_procedures[$d] .")"); ?></option>
<?php
}
?>
</select>
<?php
}
/* Un petit coup de balai */
////// mysql_free_result($rech_dept);
}
?>
<br /><input type="submit" name="ok" id="ok" value="Envoyer" />
</fieldset>
</form>
<?php
/* Terminé, on ferme la connexion */
mysql_close($connexion);
}
else
{
/* Si on arrive là, c'est pas bon signe, il faut vérifier les
* paramètres de connexion, mot de passe, serveur pas démarré etc... */
?>
<p>Un incident s&cuteest produit lors de la connexion &agrave la base de données, veuiillez essayer &agrave nouveau ult&eacuterieurement.</p>
<?php
}
?>
</body>
</html> [/php]


Merci encore

Modérateur PHPfrance
Modérateur PHPfrance | 7637 Messages

01 Août 2007, 14:36

les equivalences tu les as déjà dans ton 1er script

[php]while($ligne = mysql_fetch_assoc($rech_processes))
// ==>
while ($data=$rech_processes->FetchRow()) [/php]

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

bbk974
Invité n'ayant pas de compte PHPfrance

01 Août 2007, 14:47

d'accord mais pour les autres :


Code : Tout sélectionner

$connexion = mysql_pconnect($serveur, $admin, $mdp);
$choixbase = mysql_select_db($base, $connexion);
mysql_free_result($rech_regions);
$rech_dept = mysql_query($sql2, $connexion);
mysql_free_result($rech_dept);
mysql_close($connexion);


Je n'arrive plus à avancer dans mon projet car ces listes liées sont primordiales

CDLT

ViPHP
ViPHP | 5810 Messages

01 Août 2007, 15:43

Un peux de jugeotte. Regarde les fonctions dans le manuel php, lis les descriptifs des fonctions mysql, et tu trouveras facilement leurs équivalents côté Oracle.

bbk974
Invité n'ayant pas de compte PHPfrance

01 Août 2007, 16:58

j'ai compris ce que ces lignes veulent dire en MySQL mais je ne sais pas les transcrire pour oracle


plllllllllllleeeaase!

ViPHP
ViPHP | 5810 Messages

01 Août 2007, 17:28

bah à ce moment là, tu trouves la doc Oracle, et tu fais la même chose. On ne va pas tout te faire non plus.

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 10056 Messages

01 Août 2007, 18:01

Toutes les fonctions php pour accéder aux données d'oracle sont décrites dans la documentation (faut vraiment bookmarquer ce site, le mettre en page d'accueil, l'envoyer à 10 personnes de ta contact list, et le lire le soir avant de se coucher ;))

http://fr2.php.net/manual/fr/ref.oci8.php

Tu ne devrais pas avoir de difficulter pour trouver l'équivalent oracle des fonctions utilisées pour mysql :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

bbk974
Invité n'ayant pas de compte PHPfrance

03 Août 2007, 11:16

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

[php]
<!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>

[/php]

Mais on peut voir dans les commentaires ou je peux bloquer.
Je suis désespéré. Merci

bbk974
Invité n'ayant pas de compte PHPfrance

08 Août 2007, 13:04

nouvelle orientation, nouveau problème, la premièreliste se remplit mais n'appelle pas la deuxième en fonction du choix de la première liste:

Code : Tout sélectionner

<!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 heading 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>



et le fichier repAjaxPhp qui va avec:

Code : Tout sélectionner

<?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['idprocedure']."</option>";
      }
      
$aff.="</select><br><br>";
// envoi reponse Php a Ajax   
echo $aff;
echo "<br><br>Valeur postee: ".$_POST['val_sel'];
         
?>



Quelqu'un pourrait il me sauver la vie?

Eléphanteau du PHP | 13 Messages

08 Août 2007, 14:37

salut, comme j'ai dit hier à quelqu'un, je me suis aider de cet librairie et je me suis bien débrouillé :
http://www.roodali.com/index.php?2007/0 ... -mysql-php