IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Sous-catégorie dans formulaire liste avec BDD


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 11
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Membre émérite Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    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 : 573
    Par défaut
    voila, après à toi d'adapter le nom exacte des champs si je me suis trompé, je l'ai pris de ton post :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    Sinon on peux tout faire en une seule requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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>";
    }
    ?>

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 11
    Par défaut
    Merci à vous deux car je galérais j vais tester tout ca et j vous tiens au courant!!

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 11
    Par défaut
    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+

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    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
    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

  7. #7
    Membre émérite Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    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 : 573
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    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

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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'].'">';
    	}
    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

  9. #9
    Membre émérite Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    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 : 573
    Par défaut
    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.

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    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

  11. #11
    Membre émérite Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    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 : 573
    Par défaut
    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...

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 11
    Par défaut
    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.

  13. #13
    Membre émérite Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    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 : 573
    Par défaut
    les lettres sont des alias :
    http://sql.1keydata.com/fr/sql-alias.php

  14. #14
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 11
    Par défaut
    Merci beaucoup !
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] créer des sous catégories dans un sous formulaire
    Par damlimoges dans le forum IHM
    Réponses: 2
    Dernier message: 12/06/2009, 08h31
  2. [PHP-JS] Remplir dynamiquement liste avec BDD
    Par xclam dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2007, 17h39
  3. Réponses: 12
    Dernier message: 12/03/2007, 16h58
  4. [MySQL] Comment créer une sous catégorie dans mon site ?
    Par plex dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 18/08/2006, 09h59
  5. Ajout dans une liste avec un bouton
    Par Invité dans le forum Access
    Réponses: 6
    Dernier message: 07/12/2005, 08h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo