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 549 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

malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
hello,

c'est joli en tous cas :-)
Allez, un detail :
mysql_fetch_row () => renvoie un tableau indexe numeriquement
mysql_fetch_assoc () => renvoie un tableau associatif
mysql_fetch_array () => renvoie un tableau qui laisse le choix entre des clefs numeriques et des clefs associatives

Conclusion : mysql_fetch_array () est totalement inutile...
Dans ton cas, puisque tu utilises un tableau associatif, utilise plutot mysql_fetch_assoc ().

Sinon ma foi, bien :-)
NewSky
Messages postés
86
Date d'inscription
dimanche 27 janvier 2002
Statut
Membre
Dernière intervention
20 février 2009
-
Merci pour ton commentaire malalam.
Pour ce qui est des tableaux, c'est parce que je suis débutant en php et que je n'utilise que fetch_array!! Mais je vais de ce pas scruter le manuel de PHP pour comprendre la différence entre tout ces tableaux!
NewSky
Messages postés
86
Date d'inscription
dimanche 27 janvier 2002
Statut
Membre
Dernière intervention
20 février 2009
-
Bon, je suis aller regarder le manuel de PHP et, pour ce que ça interresse et qui ont la flème d'aller regarder, je pense avoir compris ça :

mysql_fetch_array est, par défaut, équivalent au 2 autres types de tableaux c'est à dire que l'on peut écrire soit :
$theme=$data_theme['theme'];
soit:
$theme=$data_theme[0];
le résultat étant le même.

En fait, mysql_fetch_array peut recevoir 2 arguments :
array mysql_fetch_array ( resource result , int result_type )
avec result_type une constante qui peut être MYSQL_ASSOC , MYSQL_NUM et MYSQL_BOTH .

Par défaut, c'est MYSQL_BOTH qui est choisit.
Si on lui met MYSQL_ASSOC, on a un tableau associatif équivalent à mysql_fetch_assoc
et si on lui met MYSQL_NUM, on a un tableau indexé numériquement équivalent à mysql_fetch_row.

Ce qui est important de souligner, c'est que, je cite : "mysql_fetch_array N'est PAS plus lente que mysql_fetch_row , tandis qu'elle ajoute un confort d'utilisation notable".

Donc, peut-être pour être plus clair dans le code, il vaut mieux utiliser mysql_fetch_array, mais apparament, l'utilisation de mysql_fetch_array ne poserait aucun problème!
Dites-moi si j'ai mal compris!

Pour plus d'information sur
- mysql_fetch_array :
http://www.manuelphp.com/php/function.mysql-fetch-array.php
- mysql_fetch_assoc :
http://www.manuelphp.com/php/function.mysql-fetch-assoc.php
- mysql_fecth_row :
http://www.manuelphp.com/php/function.mysql-fetch-row.php

J'espère avoir éclairci un peu cet histoire de tableaux pour les débutants comme moi!

Bonne prog @ tous...
malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Non, tu as bien compris :-)
Mais pourquoi utiliser cette constante et rallonger l'ecriture alors que mysql_fetch_assoc et mysql_fetch_row existent ?
Soit on a besoin de l'un, soit de l'autre, de toutes facons (en general, assoc est le plus pratique).
A moins d'indication contraire dans la doc php, evidemment :-)
NewSky
Messages postés
86
Date d'inscription
dimanche 27 janvier 2002
Statut
Membre
Dernière intervention
20 février 2009
-
Je comprend tout à fait l'histoire de la constante, mais commme par défaut, cette constante est MYSQL_BOTH, on a pas besoin de la rajouter et on peut utiliser le tableaux retourné soit en associatif, soit en indexé à son choix.

Pour la rapidité, danc le manuel, ils disent juste que assoc n'est pas plus lent que row et que array n'est pas plus lent que row. Mais il ne compare pas array et assoc. Donc, mystère...

Je pense cependant que tu as raison, et ne serait-ce que pour des raisons de compréhension du code, mieu vaut utiliser assoc ou row selon l'utilisation!

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.