Selects en cascade avec bdd Mysql

Résolu
cs_mdc888 Messages postés 24 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 3 janvier 2012 - 29 nov. 2010 à 18:10
cs_mdc888 Messages postés 24 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 3 janvier 2012 - 30 nov. 2010 à 13:35
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.


// 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) { // Mozilla, Safari,...
            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, pour certaines versions de navigateurs Mozilla
            }
        } else if (window.ActiveXObject) { // IE
            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
var affich_list=http_request.responseText;
obj = document.getElementById(id_ecrire); 
                obj.innerHTML = affich_list;




} 
else {
                alert('Un probleme est survenu avec la requete.');
        }
    }
}




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


$query = sprintf("SELECT id, cp, ville FROM villes WHERE cp='%d' ORDER BY ville ASC",

mysql_real_escape_string($_POST[val_sel]));

$result_recherche=mysql_query($query) or die (mysql_error());
$num_rows = mysql_num_rows($result_recherche);

// construction de la liste deroulante
$aff=="";
$aff .= "   Ville : 
<select name='id_ville' id='id_ville' onChange="makeRequest2('RepVilles.php','id_ville','id_ville_multi')" class="required" >";
if ($num_rows == 0)
$aff .= "<option value="">-- Code postal introuvable, veuillez modifier --</option>";
else
$aff .= "<option value="">-- Choisissez --</option>";


while ($row=mysql_fetch_assoc($result_recherche)){
$aff.='<option value="'.$row["id"].'">'.$row["ville"].'</option>'; 
}
$aff .= "</select>

";
// envoi reponse Php a Ajax	
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 !

6 réponses

PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
30 nov. 2010 à 11:41
Bonjour,
lu dans la source générée par la PHP
   Ville : 
  <select name="id_ville" id="id_ville" onchange="makeRequest('RepVilles.php','id_ville','id_ville_multi')">
    <option value="">-- Choisissez --</option>
  </select>

on note 2 fois id="id_ville", ce qui fait que lorsque dans ta fonction tu récupères
obj=document.getElementById(id_niveau);
data="val_sel="+obj.value;
avec id_niveau égal à id_ville, c'est le premier qui est récupérés, donc la DIV et elle n'a pas de value.

Une ID doit être UNIQUE!


;O)
3
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
29 nov. 2010 à 18:47
Bonjour,
il semblerait que ton SELECT #2, utilise, sur son onchange, la fonction makeRequest2, je ne la vois pas définie mais je pense que c'est un oubli

mais que représente, obj=document.getElementById(id_niveau);, c'est le même que pour la 1st fonction.

je te conseilles de travailler sur le code généré pas le PHP pour y voir peut être plus clair.
;O)
0
cs_mdc888 Messages postés 24 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 3 janvier 2012
30 nov. 2010 à 10:28
Hello

Merci pour ta réponse;
makeRequest2 est juste un test de ma part, et donc une erreur dans le code ci-dessus.
Normalement j'appelle bien makeRquest
Pour le code PHP, je n'ai mis que la génération du 2 select, et pas du 3e.

Voici donc le PHP pour le 3e select :



if (!empty($_POST[val_sel]))

{

$srch = sprintf("SELECT `id`, `lng`, `lat` FROM `villes` WHERE `id`='%d' LIMIT 1",

mysql_real_escape_string($_POST[val_sel]));

//print $srch;

$result_srch = mysql_query($srch, $connexion);

while ($row=mysql_fetch_assoc($result_srch)){

$lat = $row['lat'];
$lng = $row['lng'];

}

//print '
'.$lat.'
'.$lng;

$distance = 5;


$qry = "SELECT `id`, `ville`, (((acos(sin((".$lat."*pi()/180)) * sin((`lat`*pi()/180))+cos((".$lat."*pi()/180)) * cos((`lat`*pi()/180)) * cos(((".$lng."- `lng`)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance FROM `villes` HAVING distance <= ".$distance." ORDER BY ville LIMIT 30";


//print $qry;


$result_recherche=mysql_query($qry) or die (mysql_error());
$num_rows = mysql_num_rows($result_recherche);

print $num_rows;

if ($num_rows != 0)
{	
$nbcol=2;
$i = 0;
$aff = "   Ville :";
$aff .= '<table>';

while($row = mysql_fetch_assoc($result_recherche))
  {
  
if($i%$nbcol==0)
$aff .= "<tr>";

$aff .= "<td width='50' valign='top' align='center'>";
$aff .= "
  ";

$aff.=''.$row['ville']; 
  	
$aff .= "</td>";

  if($i%$nbcol==($nbcol-1))
 			$aff .= '</tr>';

$i++;

  }// fin while
  
  $aff .= '<table>';
  
}


// envoi reponse Php a Ajax	
echo $aff;


}


Néanmoins je ne pense pas que ca vienne de la, car ce script PHP ne recoit aucune valeur du POST

Voici le lien pour tester :
http://www.naviguimmo.com/annonces_liste.php?GO=GO®ion=Rhone-alpeshttp://www.naviguimmo.com/annonces_liste.php?GO=GO®ion=Rhone-alpes
Rentre un code postal, selectionne une ville, et la tu verras que dans le 3e champs, il y a une erreur due au fait qu'il n'y a pas eu de POST envoyé par le 2e formulaire
0
cs_mdc888 Messages postés 24 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 3 janvier 2012
30 nov. 2010 à 12:58
Alors la merci !

Pinaise, je le sais aussi que les id sont unique... Mais un petit copié collé et voila :(
C'est une bonne leçon pour moi

Merci beaucoup en tous cas
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
30 nov. 2010 à 13:17
tu pourrais d'ailleurs te passer d'ID en passant directement à la fonction this.value, ce qui te feras modifier ta fonction comme suit
function makeRequest( url, param_, id_ecrire){ 
....
data = "val_sel=" +param_;
...
}
et donc un appel
onchange = "makeRequest('RepVilles_multi.php', this.value,'div_id_ville_multi')"

;O)
0
cs_mdc888 Messages postés 24 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 3 janvier 2012
30 nov. 2010 à 13:35
Bone idée ;)
Mais j'utilise cette fonction dans d'autres pages, et sous d'autres conditions...

++
:)
0
Rejoignez-nous