Récupérer les bonnes données d'une jointure de table

Messages postés
17
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
6 juin 2019
-
Bonjour,
Je travaille sur un projet sur lequel je génère une page en fonction d'un titre de formation.
J'ai réussi à afficher mon titre de formations et ses détails mais à la suite j'ai deux autres tables "items" et "sous_items" dans lesquelles il y a des jointures entre formation et items, et entre items et sous_items (j'espère que c'est à peu près clair).
Je voudrais donc que les données que je récupère à la suite soit les données de la table qui correspondent à la formation choisie. Mon code me récupère des items et sous items de la table mais seulement les premiers de la liste au lieu de chercher l'item qui correspond à la formation.
Je vous affiche mon code qui me permet d'afficher ce que j'ai à l'heure actuelle:

<?php
     // On récupère tout le contenu de la table formation
  $reponse = $bdd->query('SELECT * FROM formation');
  // On affiche chaque entrée une à une
  while ($donnees = $reponse->fetch()){
  ?>
   <h1><?php echo $donnees['form_titre']; ?></h1>
   <p>Référence: <?php echo $donnees['form_reference']; ?></p>
   <p>Prix: <?php echo $donnees['form_prix']; ?></p>
   <p>Durée de la formation: <?php echo $donnees['form_nb_jour']; ?></p>
   <p>Objectifs: <?php echo $donnees['form_objectifs']; ?></p>
   <p>Participants: <?php echo $donnees['form_participants']; ?></p>
   <p>Prérequis: <?php echo $donnees['form_prerequis']; ?></p>

  <?php
   $reponse->closeCursor(); // Termine le traitement de la requête
  }
   
   //On récupère le contenu de mes 3 tables avec les liaisons
   $item_id = $_GET['item_id'];
   $resultat = $bdd->query('SELECT *
         FROM formation f
         INNER JOIN items i ON i.form_id = f.form_id');

   $si_item = $bdd->query('SELECT *
         FROM items i
         LEFT OUTER JOIN sous_items si ON si.item_id = i.item_id');
   
   while ($donnees = $resultat->fetch()){
  ?>
    <ul>
     <li> <?php echo $donnees['item_titre']; ?>
      <ul>
       <?php
       while ($donnees = $si_item->fetch()){
       ?>
        <li><?php echo $donnees['sous_items_titre']; ?></li>
       <?php
       $si_item->closeCursor();
       }
       ?>
      </ul>
     </li>
    </ul>

  <?php
   $resultat->closeCursor();
   }
  ?> 


La partie du haut fonctionne bien c'est à partir de la ligne 29 que j'ai mon problème ou peut être dans les requêtes au dessus.
Voila donc mon problème est que je n'arrive pas à gérer ma sélection de récupération d'items en fonction de la formation. De plus j'ai une erreur qui s'affiche à ma première ligne (celle avvec le $_GET), si certains auraient des conseils je suis preneur.
Merci d'avance!
Afficher la suite 

1 réponse

Meilleure réponse
Messages postés
26504
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 octobre 2019
1826
1
Merci
Bonjour,



La partie du haut fonctionne bien c'est à partir de la ligne 29 que j'ai mon problème ou peut être dans les requêtes au dessus.



while ($donnees = $si_item->fetch()){
       ?>
        <li><?php echo $donnees['sous_items_titre']; ?></li>
       <?php
       $si_item->closeCursor();
       }

normal de ne pas récupérer les autres....Si tu fermes le curseur avant la fin du while....



De plus j'ai une erreur qui s'affiche à ma première ligne (celle avvec le $_GET),

Et quelle est l'erreur ??
Ne serait-ce pas un truc genre "undefined index" ?
Car si la variable n'existe pas.. en effet... il t'affiche cette erreur...
Pour éviter cela, il faut récupérer PROPREMENT les variables AVANT de les utiliser
http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code

.

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 62951 internautes nous ont dit merci ce mois-ci

RichieZz
Messages postés
17
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
6 juin 2019
-
Merci pour ta réponse,
effectivement ce closeCursor m'arrêtait à un seul sous_items
et grâce à ton lien je n'ai plus d'erreur sur mon $_GET
RichieZz
Messages postés
17
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
6 juin 2019
-
J'ai pu réparer mes erreurs cependant je n'arrive toujours pas à récupérer mes items qui correspondent à la formation choisie.
jordane45
Messages postés
26504
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 octobre 2019
1826 > RichieZz
Messages postés
17
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
6 juin 2019
-
en même temps... tu ne fais jamais appel à ta variable GET ....
Il n'y a pas de WHERE dans tes requêtes...

Regarde ce que donne un truc du genre
<?php

//Activation de l'affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

$item_id = !empty($_GET['item_id']) ? $_GET['item_id'] : NULL;
if($item_id){
  //préparation de la requête préparée
  $sql = 'SELECT *
           FROM sous_items si 
           WHERE si.item_id = :item_id';
  $datas = array(':item_id'=>$item_id);

  //Execution de la requete
  try{
    $requete = $bdd -> prepare($sql) ;
    $requete->execute($datas) ;
  }catch(Exception $e){
    // en cas d'erreur :
     echo " Erreur ! ".$e->getMessage();
     echo " Les datas : " ;
    print_r($datas);
  }
  //on stocke le résultat de la requête dans un array
  $result =  $requete->fetchAll();
  
  //on boucle sur l'array
  if(!empty($result)){
     foreach($result as $k=>$v){
        //affichage.... a adapter à tes besoins
        print_r($v);
     }       
    
  }
 
}else{
  echo "<br> Aucun item_id spécifié !"; 
}


Et au passage, vu que tu bosses en PDO, je t'invite à lire et à appliquer ceci :
https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
Commenter la réponse de jordane45