Charger les données d'une bdd mysql dans un combobox en gérant les <optgroup>

Soyez le premier à donner votre avis sur cette source.

Snippet vu 17 362 fois - Téléchargée 29 fois

Contenu du snippet

En fait, ce code peut être utile lorsque l'on désire gérer des thèmes/sous-thèmes (pour organiser les sujets d'un forum par exemple).
Un thème possède souvent plusieurs sous-thème (logique, non ?! :-P). On a donc, par exemple, une table (appellée "themes" dans le code de l'exemple) dans la bdd contenant 2 champs :
le 1er = theme, le 2ème = ss_theme.

Le but est de récupérer les thèmes et sous-thèmes pour permettre une selection de la part de l'utilisateur. Je trouve assez intéressant d'utiliser un combobox dans lequel on mettra les thèmes en tant que groupe d'option et les sous-thèmes en tant que liste. (Voir la capture pour mieu comprendre!)

Source / Exemple :


<select name="theme">

	  	<option></option> <!-- Le 1er choix de la liste sera vide ( pour permetre de tester si l'utilisateur à fait un choix par ex) -->

<?php
//On considère la connexion à la bdd effectuée

//La requête pour récupérer les thèmes
$req_theme=mysql_query("SELECT DISTINCT theme FROM themes"); /*On utilise DISTINCT pour n'avoir qu'une seule fois le thème (souvenez-vous, il y'a plusieurs sous-thèmes par thèmes, donc dans la table, il va y avoir plusieur fois la même donnée dans le champ "theme")*/

//On commence une boucle pour récupérer les thèmes
while ($data_theme=mysql_fetch_array($req_theme)){
	$theme=$data_theme['theme'];
	
	echo "<optgroup label=\"$theme\">";      //On crée le groupe d'option
	
//La requête pour récupérer les sous-thèmes
$req_ss_theme=mysql_query("SELECT ss_theme FROM themes WHERE theme='$theme'"); /*WHERE theme='ss_theme' => pour récupérer les sous-thème du thème de la boucle while en cours*/

//Dans cette même boucle, on en fait une autre pour récupérer la liste des sous_thèmes
while ($data_ss_theme=mysql_fetch_array($req_ss_theme)){
	$ss_theme=$data_ss_theme['ss_theme'];
	
	echo "<option value=\"$theme@$ss_theme\">$ss_theme</option>"; /*On écrit la liste d'option. NB:on remarquera que dans 'value' on a le thème + le sous-thème. l'@ est pour séparer les deux pour le traitement*/
}
	echo "</optgroup>"; //On finit le groupe d'option
}
?>
</select>

Conclusion :


On peut aussi rajouter dans le requête sql ORDER BY theme et ORDER BY ss_theme afin de classer la liste par ordre alphabétique.

J'ai essayé de commenté le plus possible la source et j'ai essayé d'être le plus clair possible. J'espère l'avoir été.

Bonne prog à tous.

A voir également

Ajouter un commentaire

Commentaires

cs_Anthomicro
Messages postés
9440
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8 -
Salut,

c'est faisable en une requête plutôt que de faire une requête + n requêtes correspondant au nombre de sous thèmes ;-)

Mais sinon c'est vrai que c'est très utile.
vincseize
Messages postés
114
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
28 mars 2010
-
D'accord avec toi, d ailleurs je sers à optimiser 2 3 trucs, generer une apparition d'info sur layers, histoire d'avoir un ptit script tout complet tout propre ...
Mais repetons le , trop pratique, comme base !
NewSky
Messages postés
86
Date d'inscription
dimanche 27 janvier 2002
Statut
Membre
Dernière intervention
20 février 2009
-
Merci pour vos commentaires.

Anthomicro, tu dis que c'est faisable en une seule requête, tu peux la mettre en commentaire stp, je suis débutant en php/MySQL et je serai ravi de voir comment tu fais (d'autant plus que je n'est pas ecrit une ligne de code depuis 2 mois, saison oblige" !!, alors ça me remettrait dans le bain ;-) )

Merci à vous et n'hésitez pas ajouter vos sugestions...
cs_Anthomicro
Messages postés
9440
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8 -
Bah je vais te donner l'exemple que j'utilise pour l'admin de mon forum mais bon y'a plein de foreach, c'est pas top... Tout dépend de la structure de ta base en fait...

voici un exemple que je fais (là y'a deux requêtes car j'ai besoin d'autres infos, mais c'est faisable avec une jointure si on s'intéresse uniquement au select) :

$mysql->requete('SELECT fn.id_rubrique,fn.nom FROM table1 fn',0,1,0);
$mysql->requete('SELECT id_rubrique,id_sous_cat,nom FROM table2',1,0,1);

//============================================
//ON BOUCLE POUR REMPLIR LE TABLEAU DES RUBRIQUES //============================================

$rubrique=array();

while($r=$mysql->fetch_row(0))
{
$rubrique[$r[0]][-1]=enlever_slashes($r[1]);
$rubrique[$r[0]][0]='Catégorie principale';
}

//=============================================
//ON AJOUTE MAINTENANT LES SOUS CAT AU TABLEAU //=============================================

while($r=$mysql->fetch_row(1))
{
$rubrique[$r[0]][$r[1]]=enlever_slashes($r[2]);
}



echo '<select name="categorie" id="c">';


//============================================
//ON PARSE LE TABLEAU POUR AFFICHER LE SELECT //foreach($rubrique AS $cle> $valeur)
{
echo '<optgroup label="';

foreach($rubrique[$cle] AS $cle2 => $valeur2)
{
if($cle2===-1)
{
echo $valeur2,'">';
}
else
{
echo '<option value="',$cle,'-',$cle2,'">',$valeur2,'</option>';
}
}
echo '</optgroup>';
}

echo '</select>';


bon c'est mal indenté (cs power). Je ne pense pas que ça te sera utile mais bon je posterai un exemple si j'ai le temps un jour sur phpcs :-)

a +
cs_Anthomicro
Messages postés
9440
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8 -
j'ai oublié de poster la structure du tableau que je génère avec php

/* Structure du tableau :
$rubrique[0][-1] //nom de la rubrique
$rubrique[0][0] //catégorie principale (pour cliquer)
$rubrique[0][1] //numéro et nom de la sous cat
$rubrique[0][2] //numéro et nom de la sous cat...
*/
Commenter la réponse de malalam

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.