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 :

2 boucles "while" [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Par défaut 2 boucles "while"
    Bonjour,

    Dans un soucis de rapidité et de lisibilité, j'essaie de réaliser un script qui parait simple, mais en une seule requête, je n'y arrive pas.
    J'ai deux tables : catégories et produits.
    J'aimerai lister toutes les catégories, et dans chaque catégories, les produits qui sont associés.

    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
     
    ?php
     
    $sql = mysql_query("SELECT cat_titre FROM categories"); // 1er requête
    while($req = mysql_fetch_assoc($sql))
    {
        echo $req['cat_titre'] .' <br />'; // Les catégories
     
        $sql2 = mysql_query("SELECT pdt_titre FROM produits WHERE `cat` = '". $req['titre'] ."'"); // 2eme requête
        while($req2 = mysql_fetch_assoc($sql2))
        {
              echo $req2['pdt_titre'] .' | '; // Les produits
        }
     
    }
     
    ?>
    Je trouve ce code trop lourd. J'ai donc cherché, et je suis tombé sur cela :

    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
     
    <?php
    $array = array( 'fruits' => array( 'pommes', 'tomates', 'abricots' ),
                    'animaux' => array( 'chats', 'chiens' ),
                    'pays' => array( 'Suisse', 'France', 'Angleterre' ) );
     
    foreach( $array as $key => $value )
    {
      echo $key . ': <br />';
     
      foreach( $value as $valeur )
        echo '  ' . $valeur . '<br />';
     
      echo '<br />';
    }
    ?>
     
    Affiche:
    fruits:
      pommes
      tomates
      abricots
     
    animaux:
      chats
      chiens
     
    pays:
      Suisse
      France
      Angleterre
    Mais je ne vois pas comment je place mes données de ma table MySQL dans le premier array() ?

    Merci,
    Flo.

  2. #2
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    Il faut faire une jointure, quelque chose dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT produits.pdt_titre, categories.cat_titre FROM produits, categories WHERE produits.id_categorie = categories.id_categorie ORDER BY cat_titre ASC
    C'est à retravailler je connais pas le nom de tes clés primaires, mais ça donne l'idée

    Et ensuite y'a plus qu'à parcourir le résultat de cette requête qui aura cette forme dans un tableau :
    categorie1 produit1
    categorie1 produit2
    categorie1 produit3
    categorie2 produit4
    categorie3 produit5
    ...

    Plus qu'à mettre en forme avec ce que tu veux en tirer et en avant Guingamp.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Par défaut
    Bonsoir Amara,

    Merci pour le début de réponse.

    Alors quand j'effectue la jointure, j'ai bien le même tableau que toi. C'est déjà un début

    Voici comment j'ai procédé :

    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
     
    <?php
    $sql_cat = mysql_query("SELECT a.titre AS cat_titre, a.id AS cat_id, b.titre AS pdt_titre, b.id AS pdt_id
    FROM b_categories a, b_produits b
    WHERE a.id = b.categories
    ORDER BY cat_titre ASC");
     
    	$titre = 0;
    	$i = 0;
    	$b = 0;
    	while ($ligne = mysql_fetch_array($sql_cat))
    	{
     
     
    		if($titre != $ligne['cat_titre'] || $i == 0)
    		{
    			$i = 1;
    			$titre = $ligne['cat_titre'];
     
     
    			echo '<br /> ('. $b .') '. $ligne['cat_titre'] .' :';
    			echo ' ('. $b .') '. $ligne['pdt_titre'] .' |';
     
    		}
    		else 
    		{
    			echo ' ('. $b .') '. $ligne['pdt_titre'] .' |';	
     
    		}
     
    	$b++;
    	}
     
    // Affiche
    // (0) Alcool : (0) Vin rouge | (1) Rhum | (2) Vin à la myrthe |
    // (3) Charcuteries : (3) boudin | (4) Saucisson à l'ail | (5) Figatellu |
     
    ?>
    j'utilise les conditions ($titre et $i) pour savoir si c'était une première boucle ou pas.

    Car contre, dans la jointure, toutes les catégories n'ayant pas de produits (ici "Fromages") n'apparaissent pas.

    Si tu aurais une petite astuce, je suis preneur.

    Merci,
    Flo.

  4. #4
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Bonjour,

    Une jointure celà se fait en SQL par un INNER JOIN par ex pour ton cas un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT a.titre, a.id , b.titre, b.id
    FROM b_categories a INNER JOIN b_produits b
    ON a.id = b.categories;
    le tout dans mysql_querry ....

    ET pour avoir toutes les catégories (même celles qui n'o,t pas de produits) alors tu utilises LEFT OUTER JOIN à la place du INNER JOIN

    Pour être sûr de mon code, regardes qd même à SQL et les jointures

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Par défaut
    Citation Envoyé par Fench Voir le message
    alors tu utilises LEFT OUTER JOIN à la place du INNER JOIN
    En effet, après une lecture de l'article "le SQL de A à Z" suite à ta réponse, j'ai découvert le LEFT OUTER JOIN qui pouvait afficher des lignes où certains champs sont vides.

    Donc merci à vous deux pour l'ensemble, mon script fonctionne !

    Florent

    PS : par contre, j'ai utilisé 2 conditions ($titre et $i) pour afficher mes catégories, et mes produits (voir mon précédent post). Tu ferais la même chose ?

  6. #6
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    Si j'ai bien compris le truc ça doit être possible de simplifier, tu peux te passer de $i :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $titre_prec = -1;   // mettre une valeur impossible pour un titre de categorie
            $b = 0;
    	while ($ligne = mysql_fetch_array($sql_cat))
    	{
    		if($titre_prec != $ligne['cat_titre'])
    		{
    			echo '<br /> ('. $b .') '. $ligne['cat_titre'] .' :';
                            $titre_prec = $ligne['cat_titre'];
                    }
    		echo ' ('. $b .') '. $ligne['pdt_titre'] .' |';	
                    $b++;
    	}
    Pas testé mais perso je suis cet algo pour ce genre de choses

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

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