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 :

Imbrication de boucles


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 110
    Par défaut Imbrication de boucles
    Bonjour à tous,

    Je bloque depuis des semaines sur un bout de code concernant une imbrication de boucles.

    Avec deux tables composées ainsi :
    Collection
    id_collection / titre_collection
    1 / Collection n°1
    2 / Collection n°2
    3 / Collection n°3

    Photos
    id_photo / photo / id_collection_photo
    1 / image1.jpg / 1
    2 / image2.jpg / 1
    3 / image3.jpg / 2
    4 / image4.jpg / 2
    5 / image5.jpg / 3
    Je souhaiterai obtenir un affichage comme ceci:
    Collection n°1
    image1.jpg / image2.jpg

    Collection n°2
    image3.jpg / image4.jpg

    Collection n°3
    image5.jpg
    Avec mon code PHP:
    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
    <? $collection_en_cours = '';
    while ($results = mysql_fetch_array($aff_collections,MYSQL_ASSOC)) {
     
        if ($collection_en_cours != $aff_collections) {
            $tpl->assign_block_vars('collections', array(
    	'TITRE_COLLEC' => $results['titre_collec'],
    	));
    $collection_en_cours = $aff_collections;
    }
     
            $tpl->assign_block_vars('collections.photos', array(
    		'PHOTO' => $results['photo'],
    		));
    }
    ?>
    Les photos correspondants à ma 1ère entrée "Collection n°1" se mettent bien sous le titre mais par contre, Collections n°2, Collections n°3 et leurs photos ne s'affichent pas.

    Est-ce que je pourrais avoir quelques petites tuyaux pour résoudre le problème?

    Merci d'avance!

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Alors pour commencer évite d'ouvrir des blocs PHP avec <?, ça prête à confusion avec le langage coldfusions.

    Ensuite, ton problème est très simple en réalité, il suffit de faire un tableau à 2 dimentions:
    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
    <?php
    $collections = array();
    while ($row = mysql_fetch_assoc($collection_results)) {
    	$collections[$row['id_collection']] = array(
    		'id' => $row['id_collection'],
    		'titre' => $row['titre_collec'],
    	);
    }
    while ($row = mysql_fetch_assoc($image_results)) {
    	// ignorer les images dont les collections ne sont pas connues
    	if (!isset($collections[$row['id_collection_photo']]))
    		continue;
     
    	// Si la liste de photos n'existe pas encore, créons la !
    	if (!isset($collections[$row['id_collection_photo']]['photos']))
    		$collections[$row['id_collection_photo']]['photos'] = array();
     
    	// ajouter l'image à la collection
    	$collections[$row['id_collection_photo']]['photos'][] = array(
    		'id' => $row['id_photo'],
    		'photo' => $row['photo'],
    	);
    }
     
    var_dump($collections);
    A toi de jouer pour l'affichage

    Note: on peut y arriver avec une seule boucle de traitement si on utilise une jointure mais bon, on va gagner quoi ? 15ms à tout casser

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 110
    Par défaut
    Merci pour ton message.
    Ayant eu du mal à la réécriture, je suis parti sur quelque chose d'autre tout en m'étant inspiré avec les 2 while.

    Voici ma requête complète:

    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
    <?php
    $collec= $_GET['id'];
     
    /* Affichage des collections */
    $sql->DatabaseConnexion();
    $aff_collections_titre = $sql->query("SELECT * FROM "._TCOLLECTIONS_." WHERE id_univers_collec='$collec'")or die (mysql_error());
    $sql->DatabaseClose();
     
    while ($titre_results = mysql_fetch_array($aff_collections_titre,MYSQL_ASSOC)) {
     
    $tpl->assign_block_vars('collections', array(
    		'TITRE_COLLEC' => $titre_results['titre_collec'],
    		'TEXTE_COLLEC' => $titre_results['texte_collec'],
    		));
    	}
     
    /* Affichage des photos correspondantes aux collections */
    $sql->DatabaseConnexion();
    $aff_collections_photo = $sql->query("SELECT * FROM "._TCOLLECTIONS_PHOTOS_." LEFT JOIN "._TCOLLECTIONS_." ON "._TCOLLECTIONS_PHOTOS_.".id_collection_photo = "._TCOLLECTIONS_.".id_collection") or die (mysql_error());
    $sql->DatabaseClose();
    while ($photo_results = mysql_fetch_array($aff_collections_photo,MYSQL_ASSOC)) {
     
    	$tpl->assign_block_vars('collections.photos', array(
    		'PHOTO_NORMAL' => $photo_results['photo_normal'],
    		));
    }
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Fichier TPL:
    <table>
               <!-- BEGIN collections -->
    		    <tr>
    		      <td>{collections.TITRE_COLLEC}
             {collections.TEXTE_COLLEC}
             		<!-- BEGIN photos -->
                  {collections.photos.PHOTO_NORMAL}
    			  <!-- END photos --></td>
    		      </tr>
    			<!-- END collections -->
              </table>
    Au niveau de l'affichage, je vous ai fait une petite image de ce que ça donne:


    Je n'arrive donc pas à faire afficher sous les bons titres les photos correspondantes, ces dernières se mettant sur les dernières entrées de chaque univers... Sur la requête, j'avais au préalable mis un WHERE disant que l'id_collection devait être égale à l'id_collection_photo mais là, je n'avais plus de photo du tout qui s'affichait.

    Est-ce que vous voyez d'où peut venir le souci?

    Merci!

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Pour que je puisse de guider correctement, tu peux me donner les desc des deux tables ?

  5. #5
    Membre extrêmement actif Avatar de ledisciple
    Homme Profil pro
    observateur de nuage niveau 2.3
    Inscrit en
    Août 2008
    Messages
    860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : observateur de nuage niveau 2.3

    Informations forums :
    Inscription : Août 2008
    Messages : 860
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Note: on peut y arriver avec une seule boucle de traitement si on utilise une jointure mais bon, on va gagner quoi ? 15ms à tout casser
    Le temps, c'est de l'argent Non, visuellement, ça sera vraiment plus clair, de faire une boucle que plusieurs non?

  6. #6
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    ça va dépendre de ses structures. S'il faut commencer à faire des requêtes complexes juste pour pouvoir ne faire qu'une boucle coté PHP, c'est pas forcément le plus pratique. Parfois, le plus simple n'est pas le plus propre.

Discussions similaires

  1. Imbrication de boucles For
    Par dominos dans le forum Débuter
    Réponses: 4
    Dernier message: 03/04/2010, 17h53
  2. Imbrication de boucles
    Par vega95 dans le forum Général Python
    Réponses: 10
    Dernier message: 14/12/2009, 07h35
  3. [MySQL] Imbrication de boucle if /else et while
    Par jmtrivia dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/04/2009, 12h11
  4. imbrication de boucle (exemple :d'upload)
    Par new-dmx dans le forum Langage
    Réponses: 2
    Dernier message: 01/09/2008, 15h18
  5. Encore problème d'imbrication de boucles
    Par flora806 dans le forum Langage
    Réponses: 4
    Dernier message: 21/02/2008, 15h25

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