Selects en cascade avec bdd Mysql [Résolu]

Signaler
Messages postés
25
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
3 janvier 2012
-
Messages postés
25
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
3 janvier 2012
-
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

Messages postés
3426
Date d'inscription
lundi 26 décembre 2005
Statut
Membre
Dernière intervention
14 janvier 2011
14
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)
Messages postés
3426
Date d'inscription
lundi 26 décembre 2005
Statut
Membre
Dernière intervention
14 janvier 2011
14
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)
Messages postés
25
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
3 janvier 2012

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
Messages postés
25
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
3 janvier 2012

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
Messages postés
3426
Date d'inscription
lundi 26 décembre 2005
Statut
Membre
Dernière intervention
14 janvier 2011
14
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)
Messages postés
25
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
3 janvier 2012

Bone idée ;)
Mais j'utilise cette fonction dans d'autres pages, et sous d'autres conditions...

++
:)