Faire une sélection multiple

Eléphanteau du PHP | 17 Messages

21 déc. 2007, 18:31

Je veux faire une sélection multiple et voici :
le script qui me permet de sécetionner le pays :
ajax.php
<html>

	<head>
	
<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 go1(){
				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('region').innerHTML = leselect;
					}
				}

				// Ici on va voir comment faire du post
				xhr.open("POST","region.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'id de l'auteur
				sel = document.getElementById('pays');
				idpays = sel.options[sel.selectedIndex].value;
				xhr.send("idPays="+idpays);
			}
			
			
			
		</script>

	</head>
	
<body>

		<form>
			<fieldset style="width: 760px">
				<legend>Liste liées</legend>
				<label>Pays</label>
				<select name='pays' id='pays' onchange='go1()'>
					<option value='-1'>[ Choisir un pays ]</option>
					<?
						mysql_connect("localhost","gelux","facturier");
						mysql_select_db("test");
						$res = mysql_query("SELECT * FROM pays ORDER BY nom");
						while($row = mysql_fetch_assoc($res)){
							echo "<option value='".$row["id_pays"]."'>".$row["nom"]."</option>";
						}
					?>
				</select>
				<label>Région</label>
				<div id='region' style='display:inline'>
				<select name='region'>
					<option value='-1'>[ Choisir une région ]</option>
				</select>
				<label>Ville</label>
				<div id='ville' style='display:inline'>
				<select name='ville'>
					<option value='-1'>[ Choisir une ville ]</option>
				</select>
				</div>
			</fieldset>
		</form>

</body>

</html>
Le second script sert à sélectionner la région du pays choisi:
region.php
<html>

	<head>
	
<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 go2(){
				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('ville').innerHTML = leselect;
					}
				}

				// Ici on va voir comment faire du post
				xhr.open("POST","ville.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'id de l'auteur
				sel = document.getElementById('region');
				idregion = sel.options[sel.selectedIndex].value;
				xhr.send("idRegion="+idregion);			
			}
			
			
			
			
		</script>

	</head>
	
	
<body>

<?php

	echo '<input type="hidden" id="valeur" name="valeur" value="'.$_POST["idPays"].'">';

	echo "<select name='region' id='region' onchange='go2()'>";
	if(isset($_POST["idPays"])){
		mysql_connect("localhost","gelux","facturier");
		mysql_select_db("test");
		$res = mysql_query("SELECT * FROM region 
			WHERE id_pays=".$_POST["idPays"]." ORDER BY nom") or die ('EREUR'.mysql_error());
		while($row = mysql_fetch_assoc($res)){
			echo "<option value='".$row["id_region"]."'>$row[nom] ($row[id_region]) </option>";
		}
	}
	echo "</select>";
	
?>
	

				<label>Ville</label>
				<div id='ville' style='display:inline'>
				<select name='ville'>
					<option value='-1'>[ Choisir une ville ]</option>
				</select>
				</div>
		
				
</body>

</html>
La troisième page me permet enfin de sélectionner la ville associée:
ville.php

<?php
	echo "<select name='ville'>";
	if(isset($_POST["idRegion"]) AND isset(($_POST["idValeur"]))){
		mysql_connect("localhost","gelux","facturier");
		mysql_select_db("test");
		$res = mysql_query("SELECT * FROM ville 
			WHERE id_pays=".$_POST["idValeur"]." AND id_region=".$_POST["idRegion"]." ORDER BY nom") or die ('EREUR'.mysql_error());
		while($row = mysql_fetch_assoc($res)){
			echo "<option value='".$row["id_ville"]."'>$row[nom] ($row[id_region]) </option>";
		}
	}
	echo "</select>";
	
?>

Mon gros problème est que les deux dernières pages ne répondent pas.

SVP, aidez moi à trouver une solution car cela fait longtemps que je traine sur ce code.

Merci pour tout !!!
--- Ayntic ---

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 déc. 2007, 23:04

ça ne risque pas de marcher car t'as un problème de noms de variables.
Les noms des paramètres $_POST que tu utilise dans les conditions SQL WHERE ne correspondent pas aux noms des listes qui normalement correspondent à ses paramètres.

Par exemple:
Dans la requête SQL des régions:
$res = mysql_query("SELECT * FROM region 
            WHERE id_pays=".$_POST["idPays"]." ORDER BY nom") or die ('EREUR'.mysql_error()); 
Le paramètre $_POST["idPays"] ne correspond pas au nom de la liste des pays telque c'est écrit dans HTML, je cite :

Code : Tout sélectionner

<select name='pays' id='pays' onchange='go1()'>
Correction: Dans HTML, le nom de la liste doit être le même que celui utilisé dans $_POST par PHP.

A vrai dire, tu as commi cette erreur pour toutes les listes et $_POST dans tes codes.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 17 Messages

24 déc. 2007, 13:20

Merci !
Mais je pense que le problème réside ailleurs. Je m'explique :
sadeq a dit
Les noms des paramètres $_POST que tu utilise dans les conditions SQL WHERE ne correspondent pas aux noms des listes qui normalement correspondent à ses paramètres.
En effet les noms des listes sont récupérées à travers cette méthode présente dans mon code AJAX:

Code : Tout sélectionner

sel = document.getElementById('pays'); idpays = sel.options[sel.selectedIndex].value;
Ensuite, elles sont acheminées via la méthode POST de mon formulaire par cette méthode :

Code : Tout sélectionner

xhr.send("idPays="+idpays);
Ce qui revient à dire que la nouvelle valeur qui doit être maintenant prise en compte est "idPays" d'où la présence de $_POST["idPays"] et non $_POST["pays"]. (d'après ma compréhension d'AJAX).
--- Ayntic ---

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

03 janv. 2008, 04:27

OK, j'ai pas bien vu ton passage de post par ajax mais cette fois je croix bien voir que tu as oublié de passer le paramètre $_POST["idValeur"] par ajax dans le second script region.php qui appelle la page ville.php.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 1885 Messages

03 janv. 2008, 08:05

Tu sembles avoir 2 pages avec sensiblement le même contenu, pourquoi? (ajax.php et region.php)

J'ai récemment écrit un article sur l'utilisation d'AJAX avec PHP5 et YUI:
http://www.generationphp.net/2007/12/30 ... hp-et-yui/

Peut-être peux-tu t'en inspirer? Il y a un exemple fonctionnel proposé en téléchargement. Je crois qu'il serait relativement facile d'y inclure une 3e liste déroulante une fois que le principe d'AJAX est compris.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP