Selects en cascade avec bdd Mysql

Selects en cascade avec bdd Mysql - HTML/CSS - Programmation

Marsh Posté le 29-11-2010 à 17:26:48    

Hello,
 
Je sais, je vais avoir des remarques du genre : sujet ultra traité, mais je viens de passer une demi journée à chercher sur le web et faire des tests, et j'en arrive à demander un peu d'aide.
 
Voila, j'utilise le principe décrit ici (http://siddh.developpez.com/articles/ajax/#LIV-A) pour créer un select via un autre, en passant par un fichier php pour la partie bdd, et XMLHttpRequest pour la partie javascript.  
 
 

Code :
  1. // Requette AJAX
  2. function makeRequest(url,id_niveau,id_ecrire){
  3. var http_request = false;
  4.  //créer une instance (un objet) de la classe désirée fonctionnant sur plusieurs navigateurs
  5.         if (window.XMLHttpRequest) { // Mozilla, Safari,...
  6.             http_request = new XMLHttpRequest();
  7.             if (http_request.overrideMimeType) {
  8.                 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, pour certaines versions de navigateurs Mozilla
  9.             }
  10.         } else if (window.ActiveXObject) { // IE
  11.             try {
  12.                 http_request = new ActiveXObject("Msxml2.XMLHTTP" );
  13.             } catch (e) {
  14.                 try {
  15.                     http_request = new ActiveXObject("Microsoft.XMLHTTP" );
  16.                 } catch (e) {}
  17.             }
  18.         }
  19.         if (!http_request) {
  20.             alert('Abandon :( Impossible de créer une instance XMLHTTP');
  21.             return false;
  22.         }
  23.         http_request.onreadystatechange = function() { traitementReponse(http_request,id_ecrire); } //affectation fonction appelée qd on recevra la reponse
  24.  // lancement de la requete
  25.  http_request.open('POST', url, true);
  26.  //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'....
  27.  http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  28.  obj=document.getElementById(id_niveau);
  29.  data="val_sel="+obj.value;
  30.         http_request.send(data);
  31. }
  32. function traitementReponse(http_request,id_ecrire) {
  33. var affich="";
  34. if (http_request.readyState == 4) {
  35.  if (http_request.status == 200) {
  36.     // cas avec reponse de PHP en mode texte:
  37.   //chargement des elements reçus dans la liste
  38.   var affich_list=http_request.responseText;
  39.    obj = document.getElementById(id_ecrire);
  40.                 obj.innerHTML = affich_list;
  41.  }
  42.  else {
  43.                 alert('Un probleme est survenu avec la requete.');
  44.         }
  45.     }
  46. }


 
Code PHP qui génére la liste N°2:
 

Code :
  1. $query = sprintf("SELECT id, cp, ville FROM villes WHERE cp='%d' ORDER BY ville ASC",
  2. mysql_real_escape_string($_POST[val_sel]));
  3. $result_recherche=mysql_query($query) or die (mysql_error());
  4. $num_rows = mysql_num_rows($result_recherche);
  5. // construction de la liste deroulante
  6. $aff=="";
  7. $aff .= "   Ville :
  8.  <select name='id_ville' id='id_ville' onChange=\"makeRequest2('RepVilles.php','id_ville','id_ville_multi')\" class=\"required\" >";
  9.  if ($num_rows == 0)
  10.   $aff .= "<option value=\"\">-- Code postal introuvable, veuillez modifier --</option>";
  11.  else
  12.   $aff .= "<option value=\"\">-- Choisissez --</option>";
  13.  while ($row=mysql_fetch_assoc($result_recherche)){
  14.   $aff.='<option value="'.$row["id"].'">'.$row["ville"].'</option>';
  15.  }
  16. $aff .= "</select><br><br>";
  17. // envoi reponse Php a Ajax  
  18. echo $aff;


 
 
Ca fonctionne très bien lorsqu'on a un 1er niveau, mais moi je voudrai en créer un 2e, à partir du select généré juste avant :
 
-> Select 1 fixe -> select 2 généré en js -> select 3 généré en js
 
Le problème, c'est que pour le select 3, la valeur du post est vide.  "obj=document.getElementById(id_niveau);" ne semble renvoyer aucune valeur à partir du select N°2
 
Merci pour votre aide, j'en ai vraiment besoin !

Reply

Marsh Posté le 29-11-2010 à 17:26:48   

Reply

Marsh Posté le 03-12-2010 à 10:18:44    

Hello,
 
Tu devrais te pencher sur la librairie jQuery afin de ne pas t'embêter à réécrire des fonctionnalités compliquées. Une requête ajax, c'est aussi simple à écrire que ca :
http://api.jquery.com/jQuery.post/
 
Et ensuite, tu as des plugins de jQuery qui répondent facilement à ton problème :
http://plugins.jquery.com/project/cascade


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed