Forum d'entraide PHPFrance

Venez poser vos questions PHP, MySQL, HTML, CSS, Javascript, Gestion de serveurs à la communauté PHPfrance

Vers le contenu

» Masquer les résultats de la recherche

Recherche dynamique PHPfrance

  1. Effectuez une recherche, les résultats s'afficheront dynamiquement ici.

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

Pour ceux qui débutent en PHP.

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

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

Syntaxe: [ Télécharger ] [ Masquer ]
Code 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>";



?>

 



Merci d'avance
bbk974
 

Messagepar Truc 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
Avatar de l’utilisateur
Truc
Modérateur PHPfrance
Modérateur PHPfrance
 
Messages: 7637
Inscription: 01 Sep 2005, 18:56
Localisation: Lille

Messagepar bbk974 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
bbk974
 

Messagepar Truc 31 Juil 2007, 19:05

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

Syntaxe: [ Télécharger ] [ Masquer ]
Code 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>


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
Truc
Modérateur PHPfrance
Modérateur PHPfrance
 
Messages: 7637
Inscription: 01 Sep 2005, 18:56
Localisation: Lille

Messagepar Ryle 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...
Avatar de l’utilisateur
Ryle
Modérateur PHPfrance
Modérateur PHPfrance
 
Messages: 9763
Inscription: 07 Fév 2006, 17:25
Localisation: Lat: 48°89. Long: 2°30.

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

Messagepar bbk974 01 Aoû 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

Syntaxe: [ Télécharger ] [ Masquer ]
Code 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>



Merci encore
bbk974
 

Messagepar Truc 01 Aoû 2007, 14:36

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

Syntaxe: [ Télécharger ] [ Masquer ]
Code php
while($ligne = mysql_fetch_assoc($rech_processes))  

// ==>

while ($data=$rech_processes->FetchRow())

/!\ 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
Truc
Modérateur PHPfrance
Modérateur PHPfrance
 
Messages: 7637
Inscription: 01 Sep 2005, 18:56
Localisation: Lille

Messagepar bbk974 01 Aoû 2007, 14:47

d'accord mais pour les autres :


$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
bbk974
 

Messagepar Sékiltoyai 01 Aoû 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.
Avatar de l’utilisateur
Sékiltoyai
ViPHP
ViPHP
 
Messages: 5735
Inscription: 22 Avr 2007, 14:53
Localisation: Rennes

Messagepar bbk974 01 Aoû 2007, 16:58

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


plllllllllllleeeaase!
bbk974
 

Messagepar Sékiltoyai 01 Aoû 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
Sékiltoyai
ViPHP
ViPHP
 
Messages: 5735
Inscription: 22 Avr 2007, 14:53
Localisation: Rennes

Messagepar Ryle 01 Aoû 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...
Avatar de l’utilisateur
Ryle
Modérateur PHPfrance
Modérateur PHPfrance
 
Messages: 9763
Inscription: 07 Fév 2006, 17:25
Localisation: Lat: 48°89. Long: 2°30.

Messagepar bbk974 03 Aoû 2007, 11:16

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

Syntaxe: [ Télécharger ] [ Masquer ]
Code 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>



 


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

Messagepar bbk974 08 Aoû 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:

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

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

coup de pouce!

Messagepar phil47 08 Aoû 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
phil47
Embryon
 
Messages: 13
Inscription: 07 Aoû 2007, 11:44

Suivante

Retourner vers PHP débutant

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 18 invités