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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : listes déroulantes et dépendantes en php!!!

par bbk974 » 08 août 2007, 17:37

j'ai essayé pas mal de méthodes. Y'en a une sur laquelle je me suis arrété jusqu'à ce que je déprime! J'ai deux tables processes(idprocess,heading) et procedures(idprocedure,heading,idprocess). ->heading=intitulé

Avec le code suivant, je remplis la première liste mais quand je clique sur un processus, rin ne se passe dans la deuxième liste qui n'est seulement remplie par "choisissez.."

J'ai pri trop de retard, j'en ai marre car ça me bloque complétement!

**FICHIER processus2.php**

Code : Tout sélectionner

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <html> <head> <title>S&eacutelection proc&eacutedure</title> <script type='text/javascript'> function getXhr(){ var xhr = null; if(window.XMLHttpRequest) // Firefox et autres xhr = new XMLHttpRequest(); else if(window.ActiveXObject){ // Internet Explorer try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } } else { // XMLHttpRequest non supporté par le navigateur alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); xhr = false; } return xhr; } /** * Méthode qui sera appelée sur le click du bouton */ function go(){ var xhr = getXhr(); // On défini ce qu'on va faire quand on aura la réponse xhr.onreadystatechange = function(){ // On ne fait quelque chose que si on a tout reçu et que le serveur est ok if(xhr.readyState == 4 && xhr.status == 200){ leselect = xhr.responseText; // On se sert de innerHTML pour rajouter les options a la liste document.getElementById('procedures').innerHTML = leselect; } } // Ici on va voir comment faire du post xhr.open("POST","ajaxprocedures.php",true); // ne pas oublier ça pour le post xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); // ne pas oublier de poster les arguments // ici, l'identifiant du processus sel = document.getElementById('processes'); idProcess = sel.options[sel.selectedIndex].value; xhr.send("idprocess="+idProcess); } </script> </head> <body> <form> <fieldset style="width: 650px"> <legend>Choix</legend> <label>Processus</label> <select name='processes' id='processes' onchange='go()'> <option value='-1'>Aucun</option> <?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); $req="SELECT * FROM processes ORDER BY heading ASC"; $res=$db->Execute($req); while ($data=$res->FetchRow()) { echo"<option value='".$data["IDPROCESS"]."'>".$data["HEADING"]."</option>"; } ?> </select> <label>Procedure</label> <div id='Procedure' style='display:inline'> <select name='procedure'> <option value='-1'>Choisir un processus</option> </select> </div> </fieldset> </form> </body> </html>
**FICHIER ajaxprocedures.php**

Code : Tout sélectionner

<<?php echo "<select name='procedure'id='procedure'>"; if(isset($_POST["idprocess"])){ 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); $req = "SELECT * FROM procedures WHERE idprocess=".$_POST["idprocess"]." ORDER BY idprocedure"; while ($data=$res->FetchAssoc()) { echo "<option value='".$data["idprocedure"]."'>".$data["heading"]."</option>"; } } echo "</select>"; ?>
Merci à tous de m'aider[/b]

par Ryle » 08 août 2007, 17:07

Pour ça faut consulter un forum de psychologie, nous on pourra juste t'aider pour des problèmes en php :wink:

Que tes données proviennent de mysql, de fichiers textes que tu parses, d'un télégramme chanté ou d'un pigeon voyageur, ne change absolument rien au principe de fonctionnement, suffit juste de les afficher dans ton script php...
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
Si tu nous disais plutot ce qui ne fonctionne pas ? quelles sont les alertes qui apparaissent ? les messages d'erreur ? les données sont elles bien envoyées à la page php ? est ce que le code du script php fonctionne si tu l'appelles en lui passant les paramètre dans le navigateur ? quelles sont les valeurs retournées ? l'élément dans lequel tu écris existe-t-il ? .......

par Invité » 08 août 2007, 16:46

j'ai essayé cette méthode mais je n'y arrive pas, je n'utilise pas MySQL...

je déprime là!

par Ryle » 08 août 2007, 16:41

C'est parce qu'elle n'a pas de jambes... :x

Si tu nous disais plutot ce qui ne fonctionne pas ? quelles sont les alertes qui apparaissent ? les messages d'erreur ? les données sont elles bien envoyées à la page php ? est ce que le code du script php fonctionne si tu l'appelles en lui passant les paramètre dans le navigateur ? quelles sont les valeurs retournées ? l'élément dans lequel tu écris existe-t-il ? .......

par Invité » 08 août 2007, 16:23

j'ai déja essayé cette méthode mais ca ne marche pas...

coup de pouce!

par phil47 » 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

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

par bbk974 » 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 :
<!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

par Ryle » 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 :)

par Sékiltoyai » 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.

par bbk974 » 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!

par Sékiltoyai » 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.

par bbk974 » 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

par Truc » 01 août 2007, 14:36

les equivalences tu les as déjà dans ton 1er script
while($ligne = mysql_fetch_assoc($rech_processes))  
// ==>
while ($data=$rech_processes->FetchRow()) 

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

par bbk974 » 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 

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