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 :

Afficher le nombre d'oeuvres dans la liste des clients (2 class et 1 foreach smarty) [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut Afficher le nombre d'oeuvres dans la liste des clients (2 class et 1 foreach smarty)
    Salut à vous toutes et tous!

    Ce que je tente de faire, c'est d'afficher le nombre d'oeuvres dans la liste des clients.

    Je ne vois pas comment afficher une requête d'une autre class dans un foreach d'une class.

    client 1, il y a 2 tableaux
    client 2, il y a 5 tableaux
    etc.

    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
     
    <?php
    class Oeuvres
    {
        public function toutlister()
        {
          global $bdd;
          $q = $bdd->query('
              SELECT
                c.id cid,
                c.name cname,
                o.id oid,
                o.title otitle,
                o.clients_id oclientsid
              FROM
                clients AS c
              INNER JOIN oeuvres AS o ON c.id = o.clients_id
          ')->fetchAll(PDO::FETCH_ASSOC);
     
          $rowcount = $bdd->count();
     
          return ($q);
        }
    }
     
    class Clients
    {
        public function toutlister()
        {
          global $bdd;
          $q = $bdd->query('
                        SELECT
                            c.id AS cid,
                            c.name AS cname
                        FROM
                            clients AS c
          ')->fetchAll(PDO::FETCH_ASSOC);
          return ($q);
        }
    }
     
    $oeuvrestoutlister = Oeuvres::toutlister($rowcount);
    $smarty->assign('lesoeuvres', $oeuvrestoutlister);
     
    $clientstoutlister = Clients::toutlister();
    $smarty->assign('lesclients', $clientstoutlister);
    ?>
    C'est la liste des Clients mais je ne sais pas comment afficher le nombre d'oeuvre par client.
    La liste des clients est une class et le nombre dans une autre class.
    Comment ajouter dans Foreach au template Smarty pour le compte de ROW?

    J'ai mis comme argument à Oeuvres::toutlister($rowcount)
    et ajouter à la class Oeuvre $rowcount = $bdd->count()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PTL:
    {foreach from=$lesclients item=lesclientsloop}
        {$lesclientsloop.cid}
        {$lesclientsloop.cname}
    {/foreach}
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Personnellement, j'utiliserais une requête à part qui compte les œuvres par client à utiliser dans ta classe Clients
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
    	c.id cid,
    	c.name cname,
    	count(o.id) nbOeuvres
    FROM clients AS c
    INNER JOIN oeuvres AS o ON c.id = o.clients_id
    GROUP BY o.clients_id
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Bonjour Celira, merci pour votre aide!

    Votre solution marche en partie du fait que je dois créer un autre foeach que je dois imbriquer dans l'autre.

    Le foeach tout seul affiche bien 3 oeuvres pour le premier client, et 1 oeuvre pour le 2e client.

    Mais comme je dois créer un foeach mis dans celui de client, ça m'affiche comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    3 1 client1
    3 1 client2
    Mon foeach clients:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    {foreach from=$lesclients item=lesclientsloop}
     
       {foreach from=$comptertpl item=comptertplloop}
         {$comptertplloop.nbOeuvres}
        {/foreach}
     
        {$lesclientsloop.cid} {$lesclientsloop.cname}
     
    {/foreach}
    Les 2 "Assign" pour smarty:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $clientstoutlister = Clients::toutlister();
    $smarty->assign('lesclients', $clientstoutlister);
     
    $compter = Clients::compter();
    $smarty->assign('comptertpl', $compter);
    C'est comme un LOOP dans un Loop.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  4. #4
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Tiens, je viens de tenter quelque chose qui marche mais, regardez la ligne array_merge:

    Assign de pour le foeach de smarty:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $compter = Clients::compter();
    $clientstoutlister = Clients::toutlister();
    $result = array_merge($compter);
    $smarty->assign('r', $result);
    Au template de Smarty:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {foreach from=$r item=res}
       {$res.cid} {$res.cname} {$res.nbOeuvres}
    {/foreach}
    Ce qui est curieux, c'est que dans Array_merge, j'ai enlevé $clientstoutlister par ce qu'il apparaissait en double.
    En le supprimant, j'obtiens bien le résultat souhaité. Mais, ça manque de logique. Je me demande comment
    la fusion peut avoir lieu si je ne l'indique pas?

    Quelqu'un peut m'expliquer?

    Au lieu de faire ça avec PHP, y a peut-être quelque chose en Smarty?

    Si je mets $compter tout seul, ça marche.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  5. #5
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Au final, ça marche parfaitement bien.

    Citation Envoyé par Celira Voir le message
    Personnellement, j'utiliserais une requête à part qui compte les œuvres par client à utiliser dans ta classe Clients
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
        c.id cid,
        c.name cname,
        count(o.id) nbOeuvres
    FROM clients AS c
    INNER JOIN oeuvres AS o ON c.id = o.clients_id
    GROUP BY o.clients_id
    J'avais ajouter une fonction alors, que je devais juste remplacer la requête par la vôtre.
    Le problème est résolu.
    C'est la requête qui a fusionné mon compteur avec les clients.
    Merci.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/05/2007, 23h43
  2. Connaitre le nombre de selections dans une liste deroulante multiple
    Par ikeaboy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/08/2006, 08h50
  3. Réponses: 7
    Dernier message: 24/04/2006, 15h48
  4. Afficher le nombre de caractères dans mon textarea
    Par Taz_8626 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/04/2006, 09h43
  5. Réponses: 2
    Dernier message: 07/02/2006, 20h42

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