Partage
  • Partager sur Facebook
  • Partager sur Twitter

dédoublement de variables et résultats

Sujet résolu
    16 septembre 2020 à 18:39:10

    bonjour à tous et à toutes , 

     désolé de vous déranger encore une fois , surtout sous cette chaleur !

    j'ai un petit problème d'affichage en php/Mysql : 

    pour faire simple : mon site doit afficher des annonces ( avec des images d'annonce et les auteurs correspondants), le problème maintenant c'est que quand je lui dit ( avec de code , bien sûr ) affiche moi juste les auteurs et images qui correspond à chaque annonce, il y a autant de d'images que d'annonces sur une seule annonce ; exemple : 5 annonces == une annonce avec 5 images dedans 

    pareil pour les auteurs, mais là avec une petite différence : le nom de l'auteur vient autant de fois que le nombre d'annonce qu'il a publier personnellement : exemple  : mark publie une annonce == une annonce avec le nom Mark  //  jean publie 4 annonces == les 4 sur chaque annonce de jean il y a 4 fois le nom jean qui marqué !! ??

    j’espère que j'étais bien compréhensif , sinon n'hésitez pas à m'écrire pour plus d'information , merci  

    voici mon code :

    controller :

                $images=[];
                $authors=[];
                $photoProfils=[];
                $category =htmlentities($_GET["category"]);
                foreach($advertisings as $advertising)
                {
                    $id = $advertising["id"];
                    $authors[] = User::getUserById($advertising["id_user"]);
                    $photoProfils[]= PhotoProfil::getOneById_user($advertising["id_user"]);
    
                    $images[] = Image::getOneByIdAdvertising($id,$category);
    
                }


    code views:

     <!-- /*******image annonces************/ -->
    
                                                            <?php if(!empty($images)) {
                                                                foreach($images as $image){   
                                            if($advertising["id"] == $image["id_advertising"]){ ?>
                                            <img class="service_extended_img" src="image/advertising/<?php echo $image["path"] ?>" alt="<?php echo $image["path"] ?>" v-if="detailNumber === <?php echo $advertising["id"] ?>">
                                                                 <?php }else{ ?> 
                                            <img class="service_extended_img" src="image/advertising/bar_ad_img.jpg" alt="bar_ad_img.jpg" v-if="detailNumber === <?php echo $advertising["id"] ?>">
                                                              <?php  }}}else{ ?> 
                                            <img class="service_extended_img" src="image/advertising/bar_ad_img.jpg" alt="bar_ad_img.jpg" v-if="detailNumber === <?php echo $advertising["id"] ?>">
                                                                    <?php } ?>
    
                                                                 <!-- /******photo profil****/ -->
    
                                                        <?php if(!empty($photoProfils)){
                                                            foreach($photoProfils as $photoProfil){   
                                                            if($advertising["id_user"] == $photoProfil["id_user"]){ ?>
                                            <img class="comment_img" src="image/photoProfil/<?php echo $photoProfil["path"] ?>" alt="<?php echo $photoProfil["path"] ?>" v-if="detailNumber !== <?php echo $advertising["id"] ?>">
                                                                    <?php  }else{     ?>
                                            <img class="comment_img" src="image/male_avatar.jpg" alt="male_avatar.png" v-if="detailNumber !== <?php echo $advertising["id"] ?>">
                                                                         <?php }}}else{     ?>
                                            <img class="comment_img" src="image/male_avatar.jpg" alt="male_avatar.png" v-if="detailNumber !== <?php echo $advertising["id"] ?>">
                                                                            <?php }?>
    
                                                                <!-- /***** authors ***********/ -->
                                            
    
    
                                        <div class=" title_ad" :class="{extended: detailNumber === <?php echo $advertising["id"] ?>}">
                                            <h5><?php echo $advertising["title"] ?></h5>
                                                    <?php    if(!empty($authors)){ 
                                                            foreach($authors as $author) { 
                                                            if($advertising["id_user"] == $author["id"]) { ?>
                                            <p >par <span class="text-primary " ><?php echo $author["firstName"] ?></span>
                                                                        <?php }}} ?>
                                        </div>

    merci pour vous réponses ,

    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2020 à 20:37:35

      Salut

      Dans ton premier code, tu boucles sur les annonces. Ce qui fait que d'une part tu vas récupérer autant de fois l'auteur que tu as d'annonces pour lui, mais une seule image par annonce.

      Je ne sais pas du tout ce que tu as comme code dans tes méthodes statiques pour tes objets, mais je te conseillerais de faire une méthode qui récupère toutes les données que tu souhaites à l'aide de jointures. Note que du coup, la requête ainsi exécutée dans phpMyAdmin va récupérer autant de fois les informations d'une annonce et de l'auteur qu'il y a d'images à récupérer : c'est normal. C'est très similaire à ce sujet où tes annonces sont ses films et tes annonces sont ses acteurs. Les auteurs, eux, c'est un peu à part sauf si tu souhaites trier (et non filtrer) les annonces par auteur, ce qui ne me semble pas avoir d'utilisation pertinente.

      • Partager sur Facebook
      • Partager sur Twitter
        18 septembre 2020 à 16:30:26

        salut Ymox, merci pour la réponse ; 

        méthodes statiques ? tu parles de mon modal, puisque le code de controller c'est le 1er déjà envoyé ,

        voici le code utilisé :

        public static function getAllByCategory($table)
                 {
                       $bdd =new Database();
                        return $bdd->getAllFromDB("SELECT * , DATE_FORMAT(createdAt, '%d/%m/%y à %H:%i') as publishedDate FROM $table ORDER BY id DESC",
                         []);
                 }
        mais sinon voici le code avec les jointures suggérées : ( qui marche plutôt bien mais avec un petit problème)
        public static function getAllByCategory($table)
                {
                        $bdd =new Database();
                        return $bdd->getAllFromDB("SELECT * , DATE_FORMAT($table.createdAt, '%d/%m/%y à %H:%i') as publishedDate FROM $table INNER JOIN `image` ON $table.id = `image`.id_advertising AND $table.category = `image`.ad_category INNER JOIN user ON $table.id_user = user.id ORDER BY $table.id DESC",
                        []);
                }
         

        le problème , c'est qu'il m'affiche que les annonces avec une image , si l'annonce ne contient pas d'image ,il l'ignore ??!!

        alors que c'est tu regarde bien le code , j'ai voulu faire en sorte qu'il prenne une image dans un de mes dossiers si aucun ne correspond dans la base de données.

                             <?php if(!empty($images)) {
                             foreach($images as $image){  
                if($advertising["id"] == $image["id_advertising"]){ ?>
         <img class="service_extended_img" src="image/advertising/<?php echo $image["path"] ?>" alt="<?php echo $image["path"] ?>" v-if="detailNumber === <?php echo $advertising["id"] ?>">
                          <?php }else{ ?>
          <img class="service_extended_img" src="image/advertising/bar_ad_img.jpg" alt="bar_ad_img.jpg" v-if="detailNumber === <?php echo $advertising["id"] ?>">
                            <?php  }}}else{ ?>
          <img class="service_extended_img" src="image/advertising/bar_ad_img.jpg" alt="bar_ad_img.jpg" v-if="detailNumber === <?php echo $advertising["id"] ?>">
                               <?php } ?>


        p.s j'ai bien consulté le code avec les films et les acteurs , mais moi aussi il y'a une condition de vérification , non ? pas pareil ? 

        if($advertising["id"] == $image["id_advertising"]){ ?>
        • Partager sur Facebook
        • Partager sur Twitter
          18 septembre 2020 à 16:47:51

          Pour avoir les annonces sans image, il faut mettre LEFT JOIN `image` plutôt que INNER JOIN `image`

          • Partager sur Facebook
          • Partager sur Twitter
            18 septembre 2020 à 22:51:28

            holla Ymox, 

              merci beaucoup pour ton aide , cela fonctionne très  très bien , le LEFT JOIN me simplifie beaucoup la vie , moi j'utilisais  que le INNER JOIN les autre je les ai un peu délaissé. merci à toi , 

             et apparemment je vois que t'es chaud , permets moi de te soumettre un autre petit problème : 

            explication :

            là avec les images , cela fonctionne très bien , mais faut savoir que j'ai ajouté (difficilement) une image à la main sur myadmin / mysql ; alors que dans l'interface : impossible .

            pourquoi => parce que j'ai une table d'image pour toutes les tables (6) (moi je pensais que cela été mieux) et pour défferencier à quelle  annonce de quelle table ,j'ai 2 colonnes pour ça    image.id_advertisng et image.category .

            exemple : id_advertising : 1 category : table1 

                            id_advertising : 1 category : table 2 

            lors de l'ajout à la main ,  la base à accepté le INSERT que lorsque les 6 tables partage le même id 

            exemple table1 = id = 2 /  table2 = id = 2 /  table3 = id = 2 /  table4 = id = 2 /  table5 = id = 2 /  table6 = id = 2 / 

                 si une n'a pas d'id = 2 , cela ne fonctionnerait pas  => aucune idée pourquoi ??

            la sollution à la quelle j'ai pensé , c'est de créer 6 tableImge pour chaque table => 6 tables advertising  == 6 tables image !!!

            aurais-tu toi une meilleurs idée ? ou sais-tu déjà pourquoi l'ajout ne marche pas ? 

             merci à toi ;

            merci d'avance.

            • Partager sur Facebook
            • Partager sur Twitter
              19 septembre 2020 à 0:54:51

              Une table par "numéro" ou "position" d'image ? C'est vraiment pas bon.

              Pourquoi ne pas avoir une seule table pour toutes les images (avec chacune un ID propre et l'ID de l'annonce à laquelle rattacher ladite image) et une colonne comportant un nombre pour la position ? C'est de loin la solution la plus communément admise comme étant pratique, et en plus tu peux ainsi trier pour avoir les images dans l'ordre.

              • Partager sur Facebook
              • Partager sur Twitter
                19 septembre 2020 à 10:50:52

                salut Ymox ,

                une table par numéro ou position ? tu veux dire quoi ?  si tu parles de "table1", "table2" ,  moi je ne les ai pas appelé comme ça ; c'était juste pour bien décrire la situation. 

                mais sinon j'ai bien fait comme tu le proposes : une seule table image pour les 6 tables d'annonces. 

                et pour differencier les annonces , j'ai deux colonnes pour ça dans la table image : "id_de_l'annonce"  et la "category"/ table à la quelle elle appartient.

                mais le problème c'est que je n'arrive pas à ajouter d'image, aucune idée pourquoi ? en fin , cela me signale " foreign key constraint". 

                sur la base /sur phpmyadmin / à la main    j'ai remarqué qu'il accepté un INSERT d'image que si toutes les tables d'annonces ont le même id:

                exemple :  table1 = id = 2 /  table2 = id = 2 /  table3 = id = 2 /  table4 = id = 2 /  table5 = id = 2 /  table6 = id = 2

                et là je pouvais ajouter une image avec "l'id_annonce" => 2  de la "category" => une / deux /trois  (comme je veux)

                mas si par exemple : table1 contient  5 annonce => donc l'id 5  et les autres que 4 ou 3 annonces maximal , impossible d'ajouter une image avec "l'id_annonce" => 5 ; parce que il y'a q'une seule table qui est arrivé à 5 annonce => donc l'id 5  .

                je ne sais pas si je suis assez compréhensible avec tout ce charabia ? tu comprends un peu ? 

                merci à toi 

                • Partager sur Facebook
                • Partager sur Twitter
                  19 septembre 2020 à 11:26:08

                  Même principe que ce que j'avais expliqué pour les images : pourquoi ne pas avoir fait une seule et unique table pour les annonces avec une colonne contenant la catégorie ? Ce sont bien toutes des annonces, non ? Si certaines catégories ont des informations à enregistrer que d'autres n'ont pas, on gérerait ça autrement (probablement deux tables, une pour le "titre" des informations et une pour enregistrer la valeur d'une information pour une annonce).

                  -
                  Edité par Ymox 19 septembre 2020 à 11:26:39

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 septembre 2020 à 23:04:46

                    salut , 

                    oui tu as peut-être raison , j'aurais dû mieux faire comme ça ; cela serait maintenant mois galère ! 

                    mais j'essaie quand même à trouver une sollution sans devoir tout refaire , apparemment les relations many- to-one  y'a pas ??!!

                    j'ai aussi essayé une table intermédiaire entre les 6 tables annonces et la table image ( tabintermediaire => id , id_advertising, category,  id_image)

                    mais cela ne marche pas non plus. !! 

                    à ton avis , cela n'existe vraiment pas , le fait d'avoir  6 clés primaires sur une seule clé étrangère ? 

                    mais sinon à part ça merci pour la solution de 1er sujet !

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 septembre 2020 à 2:16:41

                      Les relations ManyToOne, "y'a". Tu en as même deux versions : les "courantes" et les unidirectionnelles avec table de jointure, ce qui revient à mettre une contrainte sur une ManyToMany. Je te propose d'aller regarder la documentation officielle qui les explique toutes.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      dédoublement de variables et résultats

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown