begin process at 2012 05 27 22:05:07
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Formulaires

 > CHARGER LES DONNÉES D'UNE BDD MYSQL DANS UN COMBOBOX EN GÉRANT LES <OPTGROUP>

CHARGER LES DONNÉES D'UNE BDD MYSQL DANS UN COMBOBOX EN GÉRANT LES <OPTGROUP>


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Formulaires Niveau :Débutant Date de création :11/05/2005 Date de mise à jour :11/05/2005 12:38:25 Vu :14 373

Auteur : NewSky

Ecrire un message privé
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • <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>
	  <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.


 Historique

11 mai 2005 12:38:25 :
Nouvelle capture d'écran pour peut être mieu comprendre!! (on sait jamais, j'ai peur de pas être très clair dans mes explications!)

 Sources du même auteur

POUR LES UTILISATEUR DE DARWIN STREAMING SERVER (OU QTSS)
CHOISIR AUTOMATIQUEMENT LA PAGE À AFFICHER EN FONCTION D'UN ...

 Sources de la même categorie

Source avec Zip Source avec une capture VALIDATEUR DE FORMULAIRE par Reldan
Source avec Zip SUIVI SERVICE CLIENT PHP par hige52
Source avec Zip POO - FORMULAIRE NEWSLETTER PHP - PROFESSEUR-PHP.COM par mtrix000
Source avec Zip Source avec une capture SELECTEUR DE NOTE par Reldan
Source avec Zip Source avec une capture ESPACE MEMBRE , AVEC CASE OPTIONNEL , SANS MYSQL par sartoz

Commentaires et avis

Commentaire de malalam le 11/05/2005 10:50:45 administrateur CS

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 :-)

Commentaire de NewSky le 11/05/2005 11:56:56

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!

Commentaire de NewSky le 11/05/2005 12:23:57

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

Commentaire de malalam le 11/05/2005 12:59:48 administrateur CS

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 :-)

Commentaire de NewSky le 11/05/2005 13:10:49

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!

Commentaire de malalam le 11/05/2005 13:32:19 administrateur CS

Bah je pense.
Pour la rapidite, j'ai des doutes, lol...faudrait faire un bench. Mais il y a forcement plus de traitements, alors bon...

Commentaire de Anthomicro le 11/05/2005 20:16:46

Salut ;-)

mysql_fetch_row est plus rapide car elle ne génère qu'un seul tableau (par rapport à fetch_array sans les options facultatives) et que tu ne traites que des indices numériques (plus rapide à traiter qu'une chaîne)

a +

Commentaire de vincseize le 31/08/2005 03:25:37

Et beeeeeh

C'est tout con ( mais fallais s'y coller), et cela me sert trop!!!!

Propre et efficace ... Encore de ces script qui "ne payent pas de mine" au premier abord , mais qui servent trop !

Encore bravo mon cher !

Commentaire de Anthomicro le 31/08/2005 07:59:59

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.

Commentaire de vincseize le 31/08/2005 13:59:36

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 !

Commentaire de NewSky le 31/08/2005 15:45:01

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

Commentaire de Anthomicro le 31/08/2005 15:53:42

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&eacute;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 +

Commentaire de Anthomicro le 31/08/2005 15:58:32

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...
*/

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales