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

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

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.