Lier des SELECT en PHP

Résolu/Fermé
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022 - 14 févr. 2022 à 19:22
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022 - 15 févr. 2022 à 01:31
Bonjour, je sollicite votre aide car je souhaite lier deux listes déroulantes. C'est à dire en choisissant un quartier (par exemple) dans la liste déroulante principale (ayant pour id_parent=0), que son sous-quartier apparait dans la sous-liste déroulante suivante.
Les quartiers principaux s'affichent bien, tandis que seulement les derniers sous-quartiers de la liste apparaissent sans même avoir choisi le quartier principale dont l'id_parent =0

Voici ma table quartiers:

id   id_parent   quartier_fr    quartier_en
1         0            quartier1          quartier1
2         0            quartier2          quartier2
3         0            quartier3          quartier3
4         0            quartier4          quartier4
.
.
.
101      1          sous-quartier1      sous-quartier1
102      1          sous-quartier2      sous-quartier2
103      1          sous-quartier3      sous-quartier3
  
201      2          sous-quartier4      sous-quartier4
202      2          sous-quartier5      sous-quartier5
203      2          sous-quartier6      sous-quartier6
...


Voici le code de ma fonction dans la page des commandes:

function getQuartier( $id_parent=0 )
{
   global $bdd;
  
  
   $sql = "SELECT id, id_parent, quartier_".$sql_lang." AS qua
    FROM quartiers
    WHERE id_parent = :id_parent
    ORDER BY id
    ";
  
   try{
      $req = $bdd->prepare($sql);
      $req->execute( array(':id_parent'=>$id_parent) );
      $res =  $req->fetchAll(PDO::FETCH_ASSOC);
    }catch(Exception $e){
      echo "Erreur dans la requête " . $sql;
      $res = false;
    }
  
   return $res;
}

La page du formulaire:
<span><label for="quartier"><?php echo $lang['quartier'];?></label></span> <br>
                <select name="quartier">
                <option value="" disabled selected><?php echo $lang['quartier'];?></option>
              <?php
              
           // 1- on récupère les quartiers principaux
$quartiers = getQuartier( 0 );	// 0 : catégories principales (niveau 0)   
$sousquartiers = getQuartier( $quartiers['id'] );  

if($quartiers){
              foreach($quartiers as $quart){


 
 echo "<option value='".$quart['id']."'>".$quart['qua']."</option>";

   
 }
 ?>

</select>
<br> <br>


<span><label for="quartier"><?php echo $lang['quartier'];?>2</label></span> <br>
                <select name="sousquartier">
                <option value="" disabled selected><?php echo $lang['quartier'];?></option>
              <?php
              
           

  

             
              foreach($sousquartiers as $sq){


 
 echo "<option value='".$sq['id']."'>".$sq['qua']."</option>";

}


}//fin accolade if $quartiers
      
 ?>

</select>




Configuration: Windows / Chrome 98.0.4758.82
A voir également:

4 réponses

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
14 févr. 2022 à 20:48
Bonjour,

Déjà .. veux tu que cette liste s'actualise dès le changement de quartier dans ton premier select ... ou as après avoir cliqué sur un bouton submit ( ce qui provoquera le réaffichage de la page) ?

Ensuite.. plusieurs erreurs dans ton code..
La fonction getQuartier() retourne un array.
Tu ne peux donc pas l'utiliser tel quel pour appeller ta fonction pour les sous-quartiers ..
A la limite, tu peux afficher ceux liés au premier résultat de ta première requête..
$sousquartiers = getQuartier( $quartiers[0]['id'] ); 


Pour en revenir au fait de lier tes listes sans refresh de la page et dès le changement de valeur dans le premier.. il va falloir que tu utilises du javascript et de l'ajax...
Le php seul ne te le permettra pas.


1
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
14 févr. 2022 à 21:12
Bonjour Jordane, merci pour ta réponse. Le but c'est que les données de la 2ème liste (sous-quartier) s'affichent dès que le quartier dans le premier SELECT est choisi. Comme tu as dit il faut du JS, et je pense utiliser onchange.

Après avoir fait ainsi:
$sousquartiers = getQuartier( $quartiers[0]['id'] ); 

=> dans le 2ème SELECT (sous-quartier), c'est les données du 1er quartier(id=1 ) qui apparaissent:

 <span><label for="quartier"><?php echo $lang['quartier'];?></label></span> <br>
                <select name="quartier">
                <option value="" disabled selected><?php echo $lang['quartier'];?></option>
              <?php
              
           // 1- on récupère les quartiers principaux
$quartiers = getQuartier( 0 );	// 0 : catégories principales (niveau 0)   
$sousquartiers = getQuartier( $quartiers[0]['id'] );   

if($quartiers){
              foreach($quartiers as $quart){


 
 echo "<option value='".$quart['id']."'>".$quart['qua']."</option>";

   
 }
 ?>

</select>
<br> <br>


<span><label for="quartier"><?php echo $lang['quartier'];?>2</label></span> <br>
                <select name="sousquartier">
                <option value="" disabled selected><?php echo $lang['quartier'];?></option>
              <?php
              
           

  

             
              foreach($sousquartiers as $sq){


 
 echo "<option value='".$sq['id']."'>".$sq['qua']."</option>";

}


}//fin accolade if $quartiers
      
 ?>

</select>

0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
14 févr. 2022 à 21:39

Bonjour Jordane, merci pour ta réponse. Le but c'est que les données de la 2ème liste (sous-quartier) s'affichent dès que le quartier dans le premier SELECT est choisi. Comme tu as dit il faut du JS, et je pense utiliser onchange.

Ben oui.. c'est bien ça .. du Javascript .. AVEC de l'AJAX ...
1
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 14 févr. 2022 à 23:10
Je suis arrivé à faire apparaitre la div (d) des sous-quartiers avec du javascript
<script>

function choisirsous()
{
  var sous= document.getElementById("quartier");



  if(sous.value >= 1 )
  {
    console.log('yes');
    document.getElementById("d").style.display="block"; 

}
else{
  console.log('no');
  document.getElementById("d").style.display="none"; 

}


}

  </script>

Mais après l'Ajax ... ! Jamais fait. Je vais donc poster un nouveau sujet dans le forum de JS de CCM.

Merci à toi :)
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
15 févr. 2022 à 00:00
Avant d'ouvrir une nouvelle question sur le forum .. commence déjà par faire des recherches sur le sujet
https://www.google.com/search?q=tutoriel+ajax
1
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
15 févr. 2022 à 01:31
Ok, ça sera fait.
0