Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/04/2011, 17h06   #1
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 11
Points : 1
Points : 1
Par défaut Sous-catégorie dans formulaire liste avec BDD

Bonjour,

je souhaite réaliser un formulaire liste qui affiche les données d'une tables (jusqu'ici pas de problème !) mais qui les classe au sein de cette même liste en sous catégorie en fonction d'un autre champ de la table.

Ca sera plus clair avec mon exemple:

J ai 2 tables :

CLASSE:
-id_classe (INT)
-classe (TEXT)

OBJET:
-id_objet (INT)
-objet (TEXT)
-id_classe (INT)

Et je voudrais que mon formulaire liste affiche :

classe1
objet (dont id_classe=1)
objet (dont id_classe=1)
...
classe2
objet (dont id_classe=2)
objet (dont id_classe=2)
...
...

c'est à dire que la liste va afficher tous les objets (de la table objet), mais classés dans des sous-catégories (issue de la table classe) correspondant à leur id_classe.
Je sais qu'il faut utiliser <optgroup>, pour afficher des sous-catégories dans une liste, avec la syntaxe suivante :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
<select>
  <optgroup label="">
    <option value=""</option>
    <option value=""</option>
  </optgroup>
  <optgroup label="">
    <option value=""</option>
    <option value=""i</option>
  </optgroup>
</select>
Mais je ne vois pas comment procéder pour utiliser ce <optgroup> de façon dynamique !

La seul solution que j ai trouvé est d'écrire une requête pour chaque cas et pour chaque <optgroup> !
Mais cette solution ne me convient pas car elle a un ENORME inconvénient, c'est que si je rajoute une classe dans ma table "classes", je serais obligé de rajouter du code sur ma page !!!
voici ce que j ai fait pour 2 sous-catégorie (j'ai pas coller le début du code sur la connexion à la BDD):
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
mysql_select_db($database_Local_PHP2, $Local_PHP2);
$query_objet = "SELECT * FROM objet WHERE id_classe=2 ORDER BY id_classe ASC";
$objet = mysql_query($query_objet, $Local_PHP2) or die(mysql_error());
$row_objet = mysql_fetch_assoc($objet);
$totalRows_objet = mysql_num_rows($objet);
 
mysql_select_db($database_Local_PHP2, $Local_PHP2);
$query_classe = "SELECT * FROM classe WHERE id_classe =2 ORDER BY classe ASC";
$classe = mysql_query($query_classe, $Local_PHP2) or die(mysql_error());
$row_classe = mysql_fetch_assoc($classe);
$totalRows_classe = mysql_num_rows($classe);
mysql_select_db($database_Local_PHP2, $Local_PHP2);
$query_objet2 = "SELECT * FROM objet WHERE id_classe=3 ORDER BY id_classe ASC";
$objet2 = mysql_query($query_objet2, $Local_PHP2) or die(mysql_error());
$row_objet2 = mysql_fetch_assoc($objet2);
$totalRows_objet2 = mysql_num_rows($objet2);
 
mysql_select_db($database_Local_PHP2, $Local_PHP2);
$query_classe2 = "SELECT * FROM classe WHERE id_classe =3 ORDER BY classe ASC";
$classe2 = mysql_query($query_classe2, $Local_PHP2) or die(mysql_error());
$row_classe2 = mysql_fetch_assoc($classe2);
$totalRows_classe2 = mysql_num_rows($classe2);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>
 
<body>
<select name="objet">
  <?php
do {  
?>
 
   <optgroup label="<?php echo $row_classe['classe']?>">
  <?php
} while ($row_classe = mysql_fetch_assoc($classe));
  $rows = mysql_num_rows($classe);
  if($rows > 0) {
      mysql_data_seek($classe, 0);
	  $row_classe = mysql_fetch_assoc($classe);
  }
 
?>
 
  <?php
do {  
?>
 
  <option value="<?php echo $row_objet['id_objet']?>"><?php echo $row_objet['objet']?></option>
  <?php
} while ($row_objet = mysql_fetch_assoc($objet));
  $rows = mysql_num_rows($objet);
  if($rows > 0) {
      mysql_data_seek($objet, 0);
	  $row_objet = mysql_fetch_assoc($objet);
  }
 
?>
</optgroup>
  <?php
do {  
?>
 
   <optgroup label="<?php echo $row_classe2['classe']?>">
  <?php
} while ($row_classe2 = mysql_fetch_assoc($classe2));
  $rows = mysql_num_rows($classe2);
  if($rows > 0) {
      mysql_data_seek($classe2, 0);
	  $row_classe2 = mysql_fetch_assoc($classe2);
  }
 
?>
 
  <?php
do {  
?>
 
  <option value="<?php echo $row_objet2['id_objet']?>"><?php echo $row_objet2['objet']?></option>
  <?php
} while ($row_objet2 = mysql_fetch_assoc($objet2));
  $rows = mysql_num_rows($objet2);
  if($rows > 0) {
      mysql_data_seek($objet2, 0);
	  $row_objet2 = mysql_fetch_assoc($objet2);
  }
 
?>
</optgroup>
 
 
</select>
</body>
</html>
<?php
mysql_free_result($objet);
 
mysql_free_result($classe);
?>
Je souhaiterais trouver une solution pour ne pas avoir cet inconvénient !
Si quelqu'un à une idée ?
Merci d'avance pour votre aide !
sebb17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 14h40   #2
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
voila, après à toi d'adapter le nom exacte des champs si je me suis trompé, je l'ai pris de ton post :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>
 
<body>
<select name="objet">
  <?php
	mysql_select_db($database_Local_PHP2, $Local_PHP2);
	$query_classe = "SELECT * FROM classe ORDER BY id_classe ASC";
	$classe = mysql_query($query_classe, $Local_PHP2) or die(mysql_error());
	while($row_classe = mysql_fetch_assoc($classe)){
		$query_objet = "SELECT * FROM objet WHERE id_classe=".$row_classe['id_classe']." ORDER BY id_objet ASC";
		$objet = mysql_query($query_objet, $Local_PHP2) or die(mysql_error());
		//echo '<optgroup label="'.$row_classe['classe'].'">';
		if(mysql_num_rows($objet) > 0){
		echo '<optgroup label="'.$row_classe['classe'].'">';// à sortir du if si tu veux que la classe apparaisse meme si elle est vide , supprime cette ligne et de-commente celle du haut 
		while($row_objet = mysql_fetch_assoc($objet)){
			echo "<option value=".$row_objet['id_objet'].">".$row_objet['objet']."</option>";
		}
		echo "</optgroup>";// à sortir du if si tu veux que la classe apparaisse meme si elle est vide, supprime cette ligne et de-commente celle du bas 
		}
		//echo "</optgroup>";
	}
mysql_free_result($objet);
 
mysql_free_result($classe);
?>
</select> 
</body>
</html>
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/04/2011, 14h55   #3
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
Sinon on peux tout faire en une seule requete :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
<?php
$resultSql = mysql_query("select c.classe, o.objet from objet o inner join classe c where c.id_classe = o.id_classe order by c.id_classe");
$classeNom = '';
while($row = mysql_fetch_assoc($resultSql)){
	if ($row['classe'] != $classeNom){
        $classeNom = $row['classe']; 
	//on ferme le dernier opto group
		echo "</optgroup>";
	// on ouvre le nouveau
		echo '<optgroup label="'.$row_classe['classe'].'">';
	}
	echo "<option value=".$row['id_objet'].">".$row['objet']."</option>";
}
?>
__________________
Stay in Bed .. Save Energy
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/04/2011, 16h05   #4
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 11
Points : 1
Points : 1
Merci à vous deux car je galérais j vais tester tout ca et j vous tiens au courant!!
sebb17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 18h36   #5
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 11
Points : 1
Points : 1
Bon j ai testé vos deux solution:

- La première (de VORACE) marche très bien, et j obtiens exactement ce que je souhaite ! PARFAIT !

- la seconde (de BOO64) qui tient tout sur 1 seule requête, ne marche pas !
la variable $row_classe (ligne11) n'existe pas (je pense que BOO64 à peut etre oublié de la changé en $row??) et même en la remplaçant cela ne marche toujours pas car j'ai le message suivant : "Undefined index: id_objet " car il y à aucun appel au champ id_objet dans la requête !!


Voila, même si la 1er solution marche très bien et me convient parfaitement, je suis preneur si vous avez des solutions concernant la solution 2 (qui tiens avec 1 seul requête), histoire d'apprendre un peu plus chose sur le sujet !

Encore un grand merci pour votre aide précieuse!
A+
sebb17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 13h54   #6
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
Citation:
la variable $row_classe (ligne11) n'existe pas (je pense que BOO64 à peut etre oublié de la changé en $row??)
effectivement j'ai codé à la volée sans vérifier
Citation:
et même en la remplaçant cela ne marche toujours pas car j'ai le message suivant : "Undefined index: id_objet " car il y à aucun appel au champ id_objet dans la requête !!
il suffit de rajouter le champ o.id_objet ds le select de la requête
__________________
Stay in Bed .. Save Energy
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 14h18   #7
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
Citation:
il suffit de rajouter le champ o.id_objet ds le select de la requête
et un 'on' à la place du 'where' dans la requête, quitte à faire une jointure autant la faire bien.
et la par contre :
Code :
if ($row['classe'] != $classeNom)
ça sera vrai pour la première ligne à tout les coups, donc tu fermes une balises que tu n'as jamais ouvert...
j'ai rien contre les adeptes de la jointure mais de la à en mettre partout...
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 14h33   #8
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
Citation:
un 'on' à la place du 'where' dans la requête, quitte à faire une jointure autant la faire bien.
oula oui en effet j'ai codé ça à la truelle

Citation:
et la par contre :
if ($row['classe'] != $classeNom)
ça sera vrai pour la première ligne à tout les coups, donc tu fermes une balises que tu n'as jamais ouvert...
c'est mieux comme ça :
Code :
1
2
3
4
5
6
7
8
9
	if ($row['classe'] != $classeNom){
         if($classeNom != ''){
	//on ferme le dernier opto group
		echo "</optgroup>";
		}
		$classeNom = $row['classe'];
	// on ouvre le nouveau
		echo '<optgroup label="'.$row['classe'].'">';
	}
Citation:
j'ai rien contre les adeptes de la jointure mais de la à en mettre partout..
.

euuu c'est pas être adepte ou pas c'est surtout pour un soucis de performance ...

avec ta méthode tu vas requêter ta bdd autant de fois qu'il y a d'entrée dans la table classe. Donc imaginons que tu as 100 entrées dans la table classe pour chaque affichage du formulaire tu vas faire 101 requètes.. à multiplier par le nombre de visiteurs sur le site !!

donc oui je préfère faire une jointure ici
__________________
Stay in Bed .. Save Energy
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 14h47   #9
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
je ne vais pas polémiquer la dessus mais en terme d'optimisation y a pas que les jointures surtout si elles sont mal faites ou gourmande en ressource :
http://www.apprendre-php.com/tutorie...imisation.html
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 14h56   #10
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
Citation:
Envoyé par vorace Voir le message
je ne vais pas polémiquer la dessus mais en terme d'optimisation y a pas que les jointures surtout si elles sont mal faites ou gourmande en ressource :
http://www.apprendre-php.com/tutorie...imisation.html
loin de moi l'idée de polémiquer je voulais juste mettre en évidence que ici une seule requête avec jointure et pour moi le plus approprié.

Bien entendu si la base est mal conçue (pas d'index sur les conditions de jointures etc..) les jointures peuvent devenir plus pénalisantes que bénéfiques mais bon dans ce cas précis c'est une simple jointure entre deux tables.

Cordialement
__________________
Stay in Bed .. Save Energy
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 15h16   #11
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
désolé, je m'emporte un peu mais bon faut me comprendre, je suis sur pentaho et depuis 1 mois et demi je fais que des transformations et des requêtes (pleines de jointure) d’où mon dégout passager pour les requêtes sur plus d'une table...
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 12h27   #12
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 11
Points : 1
Points : 1
Effectivement la solution de BOO64 marche très bien après ces quelques modifications ! Merci !

Ca serait génial (si c'est pas trop demander bien sur!), si vous pouviez me détailler/expliquer la requête (de la solution 2 de boo64) qui me semble bien compacté et complexe.
j'ai vu qu'il y avait une jointure, mais je ne comprend pas tout notamment les lettres ("c" ou "o") qui se balade dans la requête ou encore les lettres placer devant le nom des champs et tables. Je suis plutot un debutant en PHP et je ne comprend pas tout !

Si vous pouvez m éclaircir la dessus, je vous en remercie d'avance.
sebb17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 14h23   #13
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
les lettres sont des alias :
http://sql.1keydata.com/fr/sql-alias.php
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 00h18   #14
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 11
Points : 1
Points : 1
Merci beaucoup !
A+
sebb17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h35.


 
 
 
 
Partenaires

Hébergement Web