Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ma requête ne récupère pas tous les enregistrement

Sujet résolu
    23 octobre 2021 à 8:38:52

    Bonjour à tous,

    Mon projet :

    Je dispose d'une base de données stockant tous les titres de livres que je lis. Cette base contient en autres les auteurs, l'image de la couverture du livre, la photo de l'auteur, sa biographie et un résumé.

    L'objectif de l'exercice : En sélectionnant un auteur dans une liste déroulante, récupérer l'ensemble des titres lus.

    j'ai créé un formulaire qui récupère dans un liste déroulante tous les noms des auteurs qui sont dans la base de données (Concaténation des nom et prénom.)

    Je choisis un auteur et la requête me renvoie la liste des livres comme attendu mais là ou ça coince, la requête me renvoie n-1 titres

    En conséquence, si je n'ai lu qu'un titre d'un auteur, la requête ne me retourne rien

    Je vous mets ci dessous le code de mes deux pages :

    1) le Formulaire :

    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title>Synopsis à la demande</title>
    </head>
    <body>
    <h1>Retrouver un titre</h1>
    
    <form method='post' action='SynopsisAlaDemande.php'/>
    	<!-- encadre les champs du formulaire -->
    	<fieldset>
    		<legend>Liste des auteurs disponibles</legend>
    <?php
    	//Préparation de la requete et Connexion
    	$sql = 'SELECT concat(t_prenomauteur.LibelPrenom, \' \', t_auteurs.LibelNom) as idAuteur 
    		FROM t_identiteauteurs 
    		INNER JOIN t_prenomauteur ON t_prenomauteur.CodePrenom = t_identiteauteurs.CodePrenom   
    		INNER JOIN t_auteurs ON t_auteurs.CodeAuteur = t_identiteauteurs.CodeAuteur';
    
    	try
    	{
    		$bdd = new PDO('mysql:host=localhost;dbname=bibliotheque;charset=utf8','root','root');
    		$bdd->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    	}
    	catch(PDOexception $e)
    	{
    		die('Erreur : ' .$e->getMessage());
    	}
    	
    	$req = $bdd->query($sql);
    	$donnees =$req->fetchALL();
    ?>
    	<select name="idAuteur">
    <?php
    		foreach($donnees as $NomAuteur)
    		{
    		echo '<option value = "' .$NomAuteur['idAuteur']. '">' .$NomAuteur['idAuteur']. '</option>';
    		}
    ?>
    	</select>
    <?php
    	$req->closeCursor();
    ?>
    	</fieldset>
    	<input type="submit" name="Envoyer">
    </form>
    
    </body>
    </html>

    La page de traitement des données :

    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title>Liste des Titres des livres</title>
    </head>
    <body>
    <h1>Affichage des résultats de la requête</h1>
    <?php
    	// Connexion à la base de données
    	try
    	{
    		$bdd=new PDO ('mysql:host=localhost;dbname=bibliotheque;charset=utf8','root','root');
    		$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    	}
    	catch(PDOexception $e)
    	{
    		die('Erreur : ' .$e->getMessage());
    	}
    
    	// La requete de sélection
    	$req = $bdd->prepare('SELECT t_livres.Titre, concat(t_prenomauteur.LibelPrenom, \' \', t_auteurs.LibelNom) as idAuteur 
    	FROM t_auteurs 
    	INNER JOIN t_identiteauteurs ON t_identiteauteurs.CodeAuteur = t_auteurs.CodeAuteur 
    	INNER JOIN t_prenomauteur ON t_identiteauteurs.CodePrenom = t_prenomauteur.CodePrenom 
    	INNER JOIN t_auteurslivres ON t_identiteauteurs.CodeIdentite = t_auteurslivres.CodeIdentite 
    	INNER JOIN t_livres ON t_auteursLivres.CodeLivre = t_livres.CodeLivre
    	WHERE concat(t_prenomauteur.LibelPrenom, \' \', t_auteurs.LibelNom) = ?');
    
    	$req->execute(array($_POST['idAuteur']));
    
    	// Récupération de l'auteur 
    	$reponse = $req->fetch();
    	// Lecture de la requete
    ?>
    	<h3>Livres écrits par : <strong><?php echo $reponse['idAuteur']; ?></strong></h3>
    <?php	
    	while ($reponse = $req->fetch())
    	{
    	echo $reponse['Titre'];
    ?>
    	<br />
    <?php 
    	}
    	$req->closeCursor();
    ?>
    	<p>
    		<a href="SynopsisForm.php">Retour au formulaire </a>
    	</p>
    	</body>
    </html>

    Je vous remercie pour votre coup de pouce

    EDIT : 

    En continuant mes recherches, je me suis rendu compte que j'interrogeai la requête une première fois avant la boucle 

    // Récupération de l'auteur
        $reponse = $req->fetch();
        // Lecture de la requete
    ?>
        <h3>Livres écrits par : <strong><?php echo $reponse['idAuteur']; ?></strong></h3>

    Ainsi je commençais la lecture du résultat de la requete et ainsi je perdais le premier enregistrement.

    J'ai modifié comme suit la récupération du nom de l'auteur et tout va bien

    	// Récupération de l'auteur 
    	$ecrivain = $_POST['idAuteur'];
    	// Lecture de la requete
    ?>
    	<h3>Livres écrits par : <strong><?php echo $ecrivain; ?></strong></h3>

    Merci beaucoup à tous ceux qui auraient pu se pencher déjà sur ma problématique

    -
    Edité par JeanBallat 23 octobre 2021 à 8:50:41

    • Partager sur Facebook
    • Partager sur Twitter
    Jean
      25 octobre 2021 à 23:43:13

      Salut

      Il y a une alternative un peu plus propre et pratique, mais pas très commune, qui est la suivante.

      // …
          if ($reponse = $req->fetch()) {
          // Lecture de la requete
      ?>
          <h3>Livres écrits par : <strong><?php echo $reponse['idAuteur']; ?></strong></h3>
      <?php   
              do {
                  echo $reponse['Titre'];
      ?>
          <br />
      <?php
              } while ($reponse = $req->fetch());
              $req->closeCursor();
          } /*else {
              ici quelque chose s'il n'y a aucun livre pour l'auteur, "des fois que"…
          } */
      ?>
          <p>
              <a href="SynopsisForm.php">Retour au formulaire </a>
          </p>
          </body>
      </html>
      • Partager sur Facebook
      • Partager sur Twitter
        26 octobre 2021 à 7:37:49

        Merci Ymox pour ce code.

        Un autre regard est toujours intéressant.

        D'un autre coté, il ne peut pas y avoir d'auteur sans titre. Il s'agit d'une appli personnelle dans laquelle je reprends les livres que je lis.

        Actuellement réalisée sur Access, elle me permet d'avoir sur mon téléphone la liste de tous les livres que j'ai lus afin de ne pas redemander les mêmes à la bibliothèque.

        Je souhaiterai pouvoir en plus, lorsque je discute d'un livre avec quelqu'un, avoir le synopsis du livre et la bio de l'auteur (sur mon téléphone ou ma tablette).

        Merci encore. 

        • Partager sur Facebook
        • Partager sur Twitter
        Jean
          26 octobre 2021 à 17:14:41

          JeanBallat a écrit:

          […] il ne peut pas y avoir d'auteur sans titre. Il s'agit d'une appli personnelle dans laquelle je reprends les livres que je lis.

          D'où le fait que mon code comporte la partie qui gère cela en commentaire  ;)

          JeanBallat a écrit:

          Je souhaiterai pouvoir en plus, lorsque je discute d'un livre avec quelqu'un, avoir le synopsis du livre et la bio de l'auteur (sur mon téléphone ou ma tablette).

          Tu fais déjà les jointures semble-t'il, si la table contenant les synopsis en fait partie, à toi d'ajouter les champs dans l'affichage et dans la requête, ce n'est pas un souci normalement.

          • Partager sur Facebook
          • Partager sur Twitter
            28 octobre 2021 à 7:42:14

            Bonjour Ymox,

            Pour l'instant, j'arrive à récupérer le synopsis d'un titre sélectionné par rapport à un auteur. Par contre, comme la page se remet à jour, le résultat ne me convient pas. 

            Par des recherches sur le net, je me suis rendu compte qu'il fallait en passer par "ajax".

            Je vais donc m'y coller. :'(

            Bonne journée

            • Partager sur Facebook
            • Partager sur Twitter
            Jean

            Ma requête ne récupère pas tous les enregistrement

            × 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