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 :

Plusieurs résultats de requête au même endroit


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Juin 2020
    Messages : 25
    Par défaut Plusieurs résultats de requête au même endroit
    Bonjour tout le monde,

    Je (re)débute en php, et je bloque sur une requête.

    Je cherche à avoir une liste de livre, comprenant titre, auteur, éditeur et mots clés. Il y a bien sûr plusieurs mots clés par livre. Avec mon code, mon tableau sort une ligne par mots clé, je voudrais les réunir sur la même ligne.

    Mon code, oui je travaille sur une base SQLite :
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    <p>
     
    			<h3>Liste de livres</h3>
     
    			<!-- Connexion à la base de données -->
     
    			<table>
     
    				<thead>
    			        <tr>
    						<th>Titre</th>
    						<th>Auteur</th>
    						<th>Éditeur</th>
    						<th>Langue</th>
    						<th>Mots clés</th>
    				</thead>
     
    			<?php
     
    				try
     
    				{
     
    					$bdd = new PDO('sqlite:metadata.db');
    				}
     
    				catch (Exception $e)
     
    				{
     
    					die('Erreur : ' . $e->getMessage());
     
    				}
     
    			?>
     
    			<?php
     
    				// Lecture de la table  
     
    				$reponse = $bdd->query('
    					SELECT books.title, authors.name AS author, publishers.name AS publisher, languages.lang_code, tags.name AS tag
    					FROM books
    					
    					JOIN books_authors_link
    					ON books.id = books_authors_link.book
    					JOIN authors
    					ON authors.id = books_authors_link.author
    
    					JOIN books_publishers_link
    					ON books.id = books_publishers_link.book
    					JOIN publishers
    					ON publishers.id = books_publishers_link.publisher
    					
    					JOIN books_languages_link
    					ON books.id = books_languages_link.book
    					JOIN languages
    					ON languages.id = books_languages_link.lang_code
    					
    					JOIN books_tags_link
    					ON books.id = books_tags_link.book
    					JOIN tags
    					ON tags.id = books_tags_link.tag
    					
    					');
     
    				while ($donnees = $reponse->fetch())
     
    				{
     
    					echo '
    					
    					<tr>
    					
    						<td>
    						' . htmlspecialchars($donnees['title']) . '
    						</td>
    						<td>
    						' . htmlspecialchars($donnees['author']) . '
    						</td>
    						<td>
    						' . htmlspecialchars($donnees['publisher']) . '
    						</td>
    						<td>
    						' . htmlspecialchars($donnees['lang_code']) . '
    						</td>
    						<td>
    						' . htmlspecialchars($donnees['tag']) . '
    						</td>
    						
    					</tr>
    					
    					';
     
    				}
     
    			?>
     
    			</table>
     
    		</p>
    Le résultat :

    Pièce jointe 607368

    Quelqu'un pour m'aider à comprendre le principe de ce que je cherche à faire ? Et si je dois améliorer mon code de manière générale, je suis aussi preneur.
    Images attachées Images attachées  

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Juin 2020
    Messages : 25
    Par défaut
    J'ai tenté de trouver une solution par moi-même. Je me suis diriger avec le PDO.
    J'ai donc fait la connexion à ma base sur un autre php, puis include. Jusque là ok.
    Un php avec les variables :
    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
    48
    49
    50
    51
    52
    53
     
    <?php
     
    $booksStatement = $calibredb->prepare('
    	SELECT books.title
    	FROM books
    ');
    $booksStatement->execute();
    $books = $booksStatement->fetch();
     
    $authorsStatement = $calibredb->prepare('
    	SELECT authors.name
    	FROM books
    	JOIN books_authors_link
    	ON books.id = books_authors_link.book
    	JOIN authors
    	ON authors.id = books_authors_link.author
    ');
    $authorsStatement->execute();
    $authors = $authorsStatement->fetch();
     
    $publishersStatement = $calibredb->prepare('
    	SELECT publishers.name
    	FROM books
    	JOIN books_publishers_link
    	ON books.id = books_publishers_link.book
    	JOIN publishers
    	ON publishers.id = books_publishers_link.publisher
    ');
    $publishersStatement->execute();
    $publishers = $publishersStatement->fetch();
     
    $languagesStatement = $calibredb->prepare('
    	SELECT languages.lang_code
    	FROM books
    	JOIN books_languages_link
    	ON books.id = books_languages_link.book
    	JOIN languages
    	ON languages.id = books_languages_link.lang_code
    ');
    $languagesStatement->execute();
    $languages = $languagesStatement->fetch();
     
    $tagsStatement = $calibredb->prepare('
    	SELECT tags.name
    	FROM books
    	JOIN books_tags_link
    	ON books.id = books_tags_link.book
    	JOIN tags
    	ON tags.id = books_tags_link.tag
    ');
    $tagsStatement->execute();
    $tags = $tagsStatement->fetch();
    Et dans mon php "liste" :
    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
     
    		<h3>Liste de livres</h3>
     
    			<table>
     
    				<thead>
    			        <tr>
    						<th>Titre</th>
    						<th>Auteur</th>
    						<th>Éditeur</th>
    						<th>Langue</th>
    						<th>Mots clés</th>
    				</thead>
    					<tr>
    						<td>
    							<?php echo htmlspecialchars($books['title']);?>
    						</td>
    						<td>
    							<?php echo htmlspecialchars($authors['name']);?>
    						</td>
    						<td>
    							<?php echo htmlspecialchars($publishers['name']);?>
    						</td>
    						<td>
    							<?php echo htmlspecialchars($languages['lang_code']);?>
    						</td>
    						<td>
    							<?php echo htmlspecialchars($tags['name']);?>, <?php echo htmlspecialchars($tags['name']);?>
    						</td>
    					</tr>
    			</table>
    Bon, le code est plus propre (et sécurisé j'imagine?)
    Néanmoins je n'ai plus comme résultat toutes les lignes du tableau, je pense qu'il faut utiliser while mais je ne sais pas comment. De plus les résultats n'ont aucun lien entre eux, étant donc inutilisables. Et je n'ai pas plus résolu mon soucis de tags...
    Nom : Capture.PNG
Affichages : 102
Taille : 10,8 Ko

  3. #3
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 672
    Par défaut
    la première chose à faire dans votre code est de bien séparer le code entre une 1re partie "traitement" et une 2e partie "affichage".
    cela ne concerne pas juste le besoin de cette discussion mais ça pourra vous faire gagner beaucoup de temps dans vos futurs développements.

    actuellement le code de votre 1er message est découpé comme cela :
    • affichage du début du code html (affichage - 2)
    • connexion à la base de données (traitement - 1)
    • requête SQL (traitement - 1)
    • boucle de construction du tableau html (affichage - 2)
    • fin du code html (affichage - 2)


    une fois réorganisé votre code ressemblera à ça :
    1. traitement des données
      1.1 : connexion à la base de données
      1.2 : requête sql
      1.3 : stockage des données dans un tableau php
    2. construction de l'affichage
      2.1 : affichage du début du code html
      2.2 : construction du tableau html à partir du tableau php
      2.3 : affichage de la fin du code html



    ensuite en ce qui concerne votre besoin d'afficher les mots clés ensemble, il faudra que vous construisiez le tableau des données pour obtenir quelque chose comme cela dans la partie "1.3 : stockage des données dans un tableau php" :

    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
    [
    	[
    		"id_livre" => 85,
    		"titre" => "Toute la lumière",
    		"auteur" => "A....",
    		"mots_cles" =>
    		[
    			"Paris",
    			"20e siecle",
    		],
    	],
    	[
    		"id_livre" => 4012,
    		"titre" => "Notre dame",
    		"auteur" => "A....",
    		"mots_cles" =>
    		[
    			"un autre mot clé",
    		],
    	],
     
    ]
    je vous conseille d'utiliser l'identifiant du livre pour construire le tableau sous cette forme.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Juin 2020
    Messages : 25
    Par défaut
    Bonjour,
    Un grand merci pour votre réponse. J'ai néanmoins besoin de plus d'explications, malgré mes tentatives je ne comprends pas tout.
    1. Mon code variable.php est-il bon ? Doit-il être simplifié ? J'appelle cette page avec include.
    2. Comment construire la partie 1.3 ? J'ai ceci mais je ne vois pas à quoi cela correspond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ($donnees = $books->fetchAll())
    {
        $tableau = array( array("id" => $donnees['id'],
                                )
                        );
        print_r($tableau);
    }
    Je précise que la base de données n'est pas de moi et qu'il s'agit ici de simplement la lire (pour l'instant).

  5. #5
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 672
    Par défaut
    pour créer le tableau, je pensais à quelque chose comme cela.
    je n'ai pas testé le code donc ça reste à adapter.

    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
    $livres = [];
     
     
    while ($donnees = $books->fetchAll()) {
     
    	$id_livre = $donnees["id_livre"];
     
    	// si le livre n'existe pas dans la liste
    	if (!isset($livres[$id_livre])) {
     
    		// crée les données du livre avec le résultat de la ligne en cours
    		$livres[$id_livre] = $donnees;
     
    		// ajout du tableau vide des mots clés
    		$livres[$id_livre]["mots_cles"] = [];
     
    	}
     
    	// ajout du mot clé de la ligne en cours
    	$livres[$id_livre]["mots_cles"][] = $donnees["tag"];
     
    }

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Juin 2020
    Messages : 25
    Par défaut
    Aie, pas le résultat escompté effectivement. Je ne sais pas ce qui cloche.

    Nom : Capture.PNG
Affichages : 88
Taille : 14,3 Ko

Discussions similaires

  1. Requête, plusieurs résultat dans un même champ
    Par MikeLi dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 08/05/2020, 23h11
  2. [2008] Plusieurs résultats de requête dans un seul champ
    Par Bakkach dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 22/04/2013, 10h00
  3. [MySQL] Plusieurs résultats aléatoires uniques en même temps?
    Par anemone-clown dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/10/2010, 13h24
  4. Plusieurs résultats de requètes dans le datagridview
    Par abbd dans le forum Windows Forms
    Réponses: 15
    Dernier message: 20/05/2008, 18h19
  5. Réponses: 7
    Dernier message: 26/09/2005, 17h50

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