Problème sur jointure et requete SQL affichage résultat

Mammouth du PHP | 635 Messages

20 janv. 2018, 18:59

Salut à tous.
Voila je cherche à faire autrement pour solutionner mon problème.
J'ai donc fait ma requete à la quelle je rajouter un JOIN sur la table comment car les 2 tables on en commum id_loisirs.

Ca marche sauf que ça m'affiche tous les loisirs plusieurs fois avec à chaque fois un commentaire au lieu de m'afficher seulement loisirs par loirsir avec tous les commentaires du même loisirs

Code!
$sql = 'SELECT * FROM `loisirs`  JOIN comment ON comment.id_loisirs = loisirs.id_loisirs WHERE loisirs.date_fin_sortie >= NOW() AND loisirs.valide = 1 AND id_type_loisirs <> 1 ';

// Execution de la requete
		$req = $bdd->query($sql);	
		$nb = $req->rowCount();

while($ligne = $req->fetch(PDO::FETCH_ASSOC)){  


  // Poster un commentaire selon l'annonce
  if(!empty($_POST['contenu'])){
    $req = $bdd->prepare('INSERT INTO comment (pseudo,id_simply_user,id_loisirs,contenu) VALUES(:pseudo, :id_simply_user, :id_loisirs, :contenu)');			
      $req->execute(array(
         'pseudo'=>$_POST['pseudo'],
         'id_simply_user'=>$_POST['id_simply_user'],
         'id_loisirs'=>$_POST['id_loisirs'],
         'contenu'=>$_POST['contenu']
      ));
    }
    
    
 

  
  echo '<article>              
      <div class="control-block-button post-control-button">
          <a class="btn btn-control"><i class="icon_set_1_icon-85"></i></a>
          <a href="#" class="btn btn-control"><i class="icon_set_1_icon-82"></i></a>
          </div> 
          <div class="post__author author vcard inline-items">
          <img src="../img/avatar2.jpg" alt="author">
          <div class="author-date">
          <a class="h6 post__author-name fn" href="../'.simplification($ligne["titre"]).'/'.$ligne["id_loisirs"].'.html" title="'.ucfirst(strtolower($ligne['titre'])).' en '.ucfirst(strtolower($aLoisirs[$ligne["id_type_loisirs"]])).' à '.ucfirst(strtolower($ligne['city'])).'">'.ucfirst($ligne['titre']).'</a> -
          <a href="#">'.ucfirst($ligne['manufacturer']).'</a>
          <div class="post__date">
          <time class="published" datetime="2017-03-24T18:18"> '.$ligne['date_debut_sortie'].' à '.str_replace(':', 'H',$ligne['horaire']).'</time>
          </div>
          </div>
          </div>
                        
         <div class="post-video">
         	<div class="video-thumb"><img class="img-responsive post-img" src="'.$ligne['photo'].'" alt="'.ucfirst(strtolower($ligne['titre'])).'" title="'.strtolower($ligne['titre']).' - '.ucfirst(strtolower($ligne['city'])).'"></div>
       <div class="video-content">
        <p>'. ucfirst(strtolower(stripslashes(cutTexte($ligne['description'], 180, '...')))).'</p>
       </div>
         </div>
     
         <div> 
     	<a href="#" class="MaClasse"><i class="icon_set_1_icon-85"></i> Commentaires</a>
       <div class="commentaires">
         <form method="post">
           <textarea id="contenu" name="contenu"></textarea>
           <input type="hidden" name="pseudo" value="'. $_SESSION['membre']['pseudo'].'">
           <input type="hidden" name="id_simply_user" value="'.$_SESSION['membre']['id_simply_user'].'">
           <input type="hidden" name="id_loisirs" value="'.$ligne["id_loisirs"].'">
           <button class="post-comment" type="submit">OK</button>
         </form>	
           
           '.$ligne["contenu"].'
           
     </article>';
					  
		
		}


Mammouth du PHP | 635 Messages

22 janv. 2018, 08:11

Bon je me réponds à moi même mais je ne suis pas arrivé au résultat souhaité, j'ai de besoin de vous.
Mon code m'affiche autant de fois la meme news qu'il y a de commentaire au lieu de m'afficher une fois la news avec ses commentaires...
$sql = 'SELECT * FROM `loisirs`  LEFT JOIN comment ON comment.id_loisirs = loisirs.id_loisirs WHERE loisirs.date_fin_sortie >= NOW() AND loisirs.valide = 1 AND id_type_loisirs <> 1 ';

$sql .= " ORDER BY `loisirs`.`date_debut_sortie` ASC LIMIT ".intval(($page-1)*$parPage).", ".$parPage;
$req = $bdd->query($sql);


while($ligne = $req->fetch(PDO::FETCH_ASSOC)){  


  echo '<article>              
      <div class="control-block-button post-control-button">
          <a href="voir.php?id='.$ligne["id_loisirs"].'" class="btn btn-control"><i class="icon_set_1_icon-85"></i></a>
          <a href="#" class="btn btn-control"><i class="icon_set_1_icon-88"></i></a>
          </div> 
          <div class="post__author author vcard inline-items">
          <img src="../img/avatar2.jpg" alt="author">
          <div class="author-date">
          <a class="h6 post__author-name fn" href="../'.simplification($ligne["titre"]).'/'.$ligne["id_loisirs"].'.html" title="'.ucfirst(strtolower($ligne['titre'])).' en '.ucfirst(strtolower($aLoisirs[$ligne["id_type_loisirs"]])).' à '.ucfirst(strtolower($ligne['city'])).'">'.ucfirst($ligne['titre']).'</a> -
          <a href="#">'.ucfirst($ligne['manufacturer']).'</a>
          <div class="post__date">
          <time class="published" datetime="2017-03-24T18:18"> '.$ligne['date_debut_sortie'].' à '.str_replace(':', 'H',$ligne['horaire']).'</time>
          </div>
          </div>
          </div>
                        
         <div class="post-video">
         	<div class="video-thumb"><img class="img-responsive post-img" src="'.$ligne['photo'].'" alt="'.ucfirst(strtolower($ligne['titre'])).'" title="'.strtolower($ligne['titre']).' - '.ucfirst(strtolower($ligne['city'])).'"></div>
       <div class="video-content">
        <p>'. ucfirst(strtolower(stripslashes(cutTexte($ligne['description'], 180, '...')))).'</p>
       </div>
         </div>
     
         <div> 
     	<a href="#" class="MaClasse"><i class="icon_set_1_icon-85"></i> Commentaires</a>
       <div class="commentaires">
         <form method="post">
           <textarea name="contenu"></textarea>
           <input type="hidden" name="pseudo" value="'. $_SESSION['membre']['pseudo'].'">
           <input type="hidden" name="id_simply_user" value="'.$_SESSION['membre']['id_simply_user'].'">
           <input type="hidden" name="id_loisirs" value="'.$ligne["id_loisirs"].'">
           <button class="post-comment" type="submit">OK</button>
         </form>	
           '.$ligne["contenu"].'
     </article>';         
		}




Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8304 Messages

22 janv. 2018, 12:28

Bonjour,

C'est un pure problème de requête SQL donc il faut que tu la testes dans phpmyadmin et que tu trouves la bonne jointure à effectuer pour obtenir le résultat voulu.
Pas la peine de mettre tout ton code PHP/HTML ça complexifie ta question pour rien.
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 635 Messages

22 janv. 2018, 17:24

Bonjour,
Je n'affiche pas tout mon code mais seulement ma requete avec la boucle en question ou j'affiche mes résultats je le post car je me dis que peut etre le problème vient de la:

Apres pour ma requete je l'expose tel quel si quelque chose saute aux yeux: ( je tente des chose sur PHPMYADMIN ) afin de récuprér uniquement une seule fois chaque loisirs mais tous ses commentaites
SELECT * FROM `loisirs`
LEFT JOIN comment ON comment.id_loisirs = loisirs.id_loisirs
WHERE loisirs.date_fin_sortie >= NOW() AND loisirs.valide = 1
AND id_type_loisirs <> 1 AND loisirs.city = 'GRENOBLE'
ORDER BY `loisirs`.`date_debut_sortie` ASC LIMIT 0, 12 

ViPHP
ViPHP | 4039 Messages

23 janv. 2018, 10:15

Salut !
SQL génère des tables, des colonnes (pense feuille Excel). Ta requête ne peut être interprétée que comme suit:
- Affiche toutes les colonnes pour (machin valide, machin grenoble) => on imagine une seule rangée par "loisir"
- Ajoutes-y toutes les colonnes de chaque commentaire pour chacun des loisirs => une seule rangée par "commentaire" (et donc plusieurs par loisir)
Ah mais, monsieur, comment que j'affiche chacune de mes rangées de commentaires pour chaque rangée de loisir ? Afficher plusieurs commentaires dans la même rangée ? Il est fou lui... JE SAIS ! Je vais juste afficher autant de rangées du loisir X pour pouvoir afficher chacun de ses commentaires !

Il conviendrait donc de ne pas torturer SQL plus qu'il n'en faut, et de simplement faire une requête pour récupérer les loisirs, suivi de, par loisir, une requête pour en récupérer les commentaires. Ce n'est qu'après, et si le besoin s'en fait ressentir, qu'on va commencer à optimiser l'histoire et quitter la saine voie de la simplicité pour celle de chemin obscurantiste des voies cachées du SQL..
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.