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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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