Page 1 sur 1

liste déroulante dynamique

Posté : 07 sept. 2012, 13:44
par biddal
Bonjour ,
Voilà je souhaite faire des listes déroulantes dynamiques! Lorsque je sélectionne un choix dans ma première liste je veux que certaines choses bien précises s'affichent dans ma deuxième.
Pour cela j'ai récupéré un code que je met ci-contre:
<?php
/* Variables de connexion : ajustez ces paramètres selon votre propre environnement */
$serveur = "localhost";
$admin   = "root";
$mdp     = "";
$base    = "gestion_stock";
?>
<?php
/* Requête SQL de récupération des données de la première liste */
$sql = "SELECT * ".
       "FROM `situation` ";
/* Connexion et exécution de la requête */
$connexion = mysql_connect($serveur, $admin, $mdp);
if($connexion != false)
{
    $choixbase = mysql_select_db($base, $connexion);
    $recherche = mysql_query($sql, $connexion);
    /* Création du tableau PHP des valeurs récupérées */
    $situation = array();
    $id = 0;
    while($ligne = mysql_fetch_assoc($recherche))
    {
        $situation[$ligne['nom_situ']] = $ligne['nom_situ'];
    }
	echo "
		<form action=".$_SERVER['PHP_SELF']." method=\"post\" id=\"situation\">
			<fieldset style=\"border: 3px double #333399\">
				<legend>
					Sélectionnez une situation
				</legend>
				<select name=\"situation\" id=\"situation\" onchange=\"getPositions(this.value);\">
					<option value=\"vide\">- - - Choisissez une situation - - -</option>";
					/* Construction de la première liste : on se sert du tableau PHP */
					foreach($situation as $nr => $nom)
					{
						echo "<option value=".$nr.">".$nom."</option>";
					}
					echo "
				</select>";
				/* <!-- ICI, le secret : on met un bloc avec un id ou va s'insérer le code de
				//la seconde liste déroulande --> */
				echo "<span id=\"blocPositions\"></span><br />
				<input type=\"submit\" name=\"ok\" id=\"ok\" value=\"Envoyer\" />
			</fieldset>
		</form>";
	}
	else
	{
		/*  Si vous arrivez ici, vous avez un gros problème avec la connexion au serveur de base de données */
	}
?>
Pour la page avec les listes déroulantes!
----------------------------------------------------------------------------------------------------------------
<?php
/**
 * Code qui sera appelé par un objet XHR et qui
 * retournera la liste déroulante des positions
 * correspondantes à la situation sélectionnée.
 */
/* Paramètres de connexion */
$serveur = "localhost";
$admin   = "root";
$mdp     = "";
$base    = "gestion_stock";

/* On récupère l'identifiant de la situation choisie. */
$idr = isset($_GET['idr']) ? $_GET['idr'] : false;
/* Si on a une situation, on procède à la requête */
if(false !== $idr)
{
    /* Cération de la requête pour avoir les positions de cette situation */
    $sql2 = "SELECT `nom_pos`".
            " FROM `position`".
            " WHERE `typ_pos` = ". $idr ."";
    $connexion = mysql_connect($serveur, $admin, $mdp);
    mysql_select_db($base, $connexion);
    $rech_pos = mysql_query($sql2, $connexion);
	/* Un petit compteur pour les départements */
    $nd = 0;
    /* On crée deux tableaux pour les numéros et les noms des positions */
    $code_pos = array();
    $nom_pos = array();
    /* On va mettre les numéros et noms des positions dans les deux tableaux */
    while(false != ($ligne_pos = mysql_fetch_assoc($rech_pos)))
    {
        $code_pos[] = $ligne_pos['typ_pos'];
        $nom_pos[]  = $ligne_dept['nom_pos'];
		$nd++;
    }
    /* Maintenant on peut construire la liste déroulante */
    $liste = "";
    $liste .= '<select name="position" id="position">'."\n";
    for($d = 0; $d < $nd; $d++)
    {
        $liste .= '  <option value="'. $code_pos[$d] .'">'. htmlentities($nom_pos[$d]) .' ('. $code_pos[$d] .')</option>'."\n";
    }
    $liste .= '</select>'."\n";
    /* Un petit coup de balai */
    mysql_free_result($rech_pos);
    /* Affichage de la liste déroulante */
    echo($liste);
}
/* Sinon on retourne un message d'erreur */
else
{
    echo("<p>Une erreur s'est produite. La région sélectionnée comporte une donnée invalide.</p>\n");
}
?>
et la dernière page qui est une page java

[javascript]/**
* Lister les départements d'une région avec un objet
* XMLHTTPRequest.
*/
/* Création de la variable globale qui contiendra l'objet XHR */
var requete = null;
/**
* Fonction privée qui va créer un objet XHR.
* Cette fonction initialisera la valeur dans la variable globale définie
* ci-dessus.
*/
function creerRequete()
{
try
{
/* On tente de créer un objet XmlHTTPRequest */
requete = new XMLHttpRequest();
}
catch (microsoft)
{
/* Microsoft utilisant une autre technique, on essays de créer un objet ActiveX */
try
{
requete = new ActiveXObject('Msxml2.XMLHTTP');
}
catch(autremicrosoft)
{
/* La première méthode a échoué, on en teste une seconde */
try
{
requete = new ActiveXObject('Microsoft.XMLHTTP');
}
catch(echec)
{
/* À ce stade, aucune méthode ne fonctionne... mettez donc votre navigateur à jour ;) */
requete = null;
}
}
}
if(requete == null)
{
alert('Impossible de créer l\'objet requête,\nVotre navigateur ne semble pas supporter les object XMLHttpRequest.');
}
}
/**
* Fonction privée qui va mettre à jour l'affichage de la page.
*/
function actualiserPositions()
{
var listePos = requete.responseText;
var blocListe = document.getElementById('blocPos');
blocListe.innerHTML = listePos;
}

/**
* Fonction publique appelée par la page affichée.
* Cette fonction va initialiser la création de l'objet XHR puis appeler
* le code serveur afin de récupérer les données à modifier dans la page.
*/
function getPositions(idr)
{
/* Si il n'y a pas d'identifiant de situation, on fait disparaître la seconde liste au cas où elle serait affichée */
if(idr == 'vide')
{
document.getElementById('blocPos').innerHTML = '';
}
else
{
/* À cet endroit précis, on peut faire apparaître un message d'attente */
var blocListe = document.getElementById('blocPos');
blocListe.innerHTML = "Traitement en cours, veuillez patienter...";
/* On crée l'objet XHR */
creerRequete();
/* Définition du fichier de traitement */
var url = 'pos.php?idr='+ idr;
/* Envoi de la requête à la page de traitement */
requete.open('GET', url, true);
/* On surveille le changement d'état de la requête qui va passer successivement de 1 à 4 */
requete.onreadystatechange = function()
{
/* Lorsque l'état est à 4 */
if(requete.readyState == 4)
{
/* Si on a un statut à 200 */
if(requete.status == 200)
{
/* Mise à jour de l'affichage, on appelle la fonction apropriée */
actualiserPos();
}
}
};
requete.send(null);
}
}[/javascript]

Ma première liste fonctionne correctement sous IE mais pas sous Firefox elle me marque :

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in K:\Boulot\intra_CTDR\admin\formajout.php on line 21. Et la deuxième ne fonctionne pas du tout!
Quelqu'un saurait m'aider en modifiant mon code ou alors en me proposant autre chose je suis un peu perdu là!

Merci d'avance bonne journée!

Re: liste déroulante dynamique

Posté : 07 sept. 2012, 13:54
par xTG
formajout.php c'est le premier fichier ou bien celui qui est appelé avec de l'Ajax ? (Et au passage, c'est du javascript et non du java qui est un tout autre langage ;) )

Car tu utilises une variable dans la requête sans même la vérifier :
$sql2 = "SELECT `nom_pos`".
            " FROM `position`".
            " WHERE `typ_pos` = ". $idr ."";
Cela pourrait être n'importe quoi d'autre qu'un entier, c'est même une jolie faille permettant de faire de l'injection sql.
Il faut vérifier le type (le contenu de la variable) avant de l'utiliser ainsi que l'échapper au moyen de mysql_real_escape_string().

Pour débuguer regarde ce qu'il y a dans $idr quand le programme plante sur cette erreur.
Tu peux aussi utiliser une extension comme Firebug pour voir la requête Ajax envoyée ainsi que ses valeurs.

Re: liste déroulante dynamique

Posté : 07 sept. 2012, 14:24
par biddal
Merci pour la réponse !
Mais je t'avouerai que je ne sais pas du tout ou j'en suis ! Je n'ai fait que du php et du html et un peu de css après niveau javascript et ajax voilà j'y connais rien! J'ai repris le code que j'ai trouvé sur internet et essayé de le modifier en fonction de mon projet mais voilà je suis perdu là!
Pour essayer de répondre à ts questions formajout.php est le fichierde ma liste ! Pour ce qui est de l'Ajax (je ne savais même pas qu'il y en avait ) je pense que c est dans le fichier .js qui lui est appelé dans mon index.php avec le code
<script type="text/javascript" src="./pos_xhr.js" charset="iso_8859-1"></script>
Je ne peux malheureusement rien te dire d'autre je suis complétement pommé :p! Je ne souhaite pourtant faire qu'une simple liste déroulante dynamique lol
Merci encre pour ton aide

Re: liste déroulante dynamique

Posté : 07 sept. 2012, 14:36
par xTG
Si tu es si pommé que cela je te conseillerai plutôt de te tourner vers un script plus suivi et mieux rédigé, tu perdras moins de temps. :mrgreen:
AB en a posté un sur ce forum et se ferra un joie de répondre à toutes les interrogations que tu pourrais avoir sur son code : faq-tutoriels/listes-liees-avec-html-ja ... 55580.html
Il a déjà été utilisé par plus d'une personne sur ce forum et tout le monde en a été content.

Re: liste déroulante dynamique

Posté : 07 sept. 2012, 14:40
par biddal
Ok merci beaucoup pour ton aide. Bonne journée à toi