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 :

Liaison entre plusieurs tables


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut Liaison entre plusieurs tables
    Bonjour

    j'ai 4 tables dans ma base que je souhaite lier

    une table livre qui peut être lier soit à une table auteur, artiste ou auteur_pref

    la table livre contient
    id_livre
    art_id (pour faire le lien avec la table artistes)
    preface_id (pour faire le lien avec la table auteur_pref)
    aut_id (pour faire le lien avec la table auteurs

    l'identifiant de la table auteurs est id_aut
    l'identifiant de la table artistes est id_art
    l'identifiant de la table auteur_pref est id_pref

    Pour chaque livre de ma table "livre" je souhaite afficher soit l'auteur, soit l"auteur de la préface, soit l'artiste, soit seulement 2 de ces données, soit les 3.

    Ma requête est la suivante :
    SELECT * FROM livre, artistes, auteurs, auteur_pref WHERE art_id=id_art XOR preface_id=.id_pref XOR aut_id=id_aut

    Dans Mysql cette requête affiche bien les lignes que je souhaite afficher.

    pour les afficher dans mon fichier php je fait :
    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
     
    $query_auteur = "SELECT * FROM livre,  artistes, auteurs, auteur_pref WHERE  livre.art_id=artistes.id_art XOR livre.preface_id=auteur_pref.id_pref XOR livre.aut_id=auteurs.id_aut";
    $auteur = mysql_query($query_auteur, $dbprotect) or die(mysql_error());
    $row_auteur = mysql_fetch_assoc($auteur); 
     
    do { 
    <i>Auteur</i> :<a href="fiche_auteur.php?fiche_aut=<?php echo  $row_auteur['id_aut']; ?>"> <?php echo  $row_auteur['nom']; ?>  </a> <br/>
    	        <i>Préface</i> : <?php echo  $row_auteur['nom_pref']; ?>  <br/>
    	        <i>artiste</i> : <?php echo  $row_auteur['nom_art']; ?>  <br/>
     
    } while ($row_auteur = mysql_fetch_assoc($auteur));
     		$rows = mysql_num_rows($auteur);
      		if($rows > 0) {
          		mysql_data_seek($auteur, 0);
    	  		$row_auteur = mysql_fetch_assoc($auteur);
    		}

    Mais ne fonctionne pas vraiment... par exemple si le premier livre de ma table ne comporte qu'un auteur et pas d'artiste ni d'auteur de préface, j'ai tout de même les trois ligne afficher avec les donnés des autres livres.

    Quelqu'un voit il d'où peut venir le problème?

    Merci pour votre aide

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    oulala, je viens de me relire et même moi je ne comprend rien.
    J'ai écris ça un peu tard après m'être pris longuement la tête et le résultat n'est pas joli...

    je n'ai toujours pas de solution à mon problème, mais à tête reposé, je pense que le problème vient de la structure de mes table et de la modélisation de ma BDD.

    Enfaite voici le topo.

    J'ai des livres. Un livre peux avoir un ou plusieurs auteurs. un auteur peut avoir différents statuts (artiste, auteur, auteur de préface).

    Je pense donc (contrairement à ce que j'ai mis plus haut) qu'il ne me faut qu'une table auteur avec un champ statut permettant de définir le statu.

    Est-ce que cela vous semble correct?

    Par contre en php, lorsque je rempli ma base comment cela se passe-t'il?

    avez vous des exmples à me fournir?
    je vous en serait très reconnaissant.

    Cdt,
    Mathieu

  3. #3
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    je pense qu'il faudrait plutôt 3 tables

    Code x : 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
    table Livre
    id_livre      titre_livre
    1             Le grand chaperon vert
    2             La royaume de la nuit
    
    
    table Personne
    id_personne   nom_personne
    1             Herve Green
    2             Wicky Apfelstrudel
    3             Tom Hun
    4             Ignace Magace
    
    
    table Relation
    id_personne   id_livre   id_relation
    4             1          1               # Ignace Magace est l'auteur de "Le grand chaperon vert"
    1             2          1               # Herve Green est le co-auteur de "La royaume de la nuit"
    2             2          1               # Wicky Apfelstrudel est la co-auteur de "La royaume de la nuit"
    3             2          2               # Tom Hun a écrit la préface de "La royaume de la nuit"
    3             2          3               # Tom Hun a dessiné les illustrations de de "La royaume de la nuit"
    GNAP !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Merci nosferapti

    Ca me semble plutôt pas mal ce que tu proposes.
    La table relation est effectivement très utile.
    Surtout ça pallie à toutes les difficultés que j'ai rencontré et c'est très propre.

    Je vais partir sur cette structure.

    Merci encore
    Cdt,
    Mathieu

  5. #5
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    ah je n'avais pas vu que tu étais aussi un "Mathieu" avec un seul "t" comme moi

    au sujet de ta question de comment ça se passe en base, il s'agit d'insertion normales comme si c'était des tables seules. il faut juste faire attention à l'ordre des insertion, d'abord les tables Livre et Personne et ensuite tu utilises les identifiants de ces tables pour remplir la table Relation
    GNAP !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Tout d'abord, merci pour tes réponses.

    Jai fais comme tu me l'as conseillé.

    J'ai donc trois tables

    livre
    --------
    auteur
    ----------
    relation
    ---------

    j'arrive bien a faire les ajouts d'auteur et de livre ainsi que faire la relation dans ma partie admin.

    Tout est très logique dans la BDD

    Par contre pour afficher dans ma page je sèche un peu.

    je souhaite ajouter l'ensemble des ouvrage de ma base. je fais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php  mysql_select_db($database_dbprotect, $dbprotect);
    mysql_query("SET NAMES UTF8"); 
    $query_livre = "SELECT * FROM livre ORDER BY livre.id_livre DESC";
    $livre = mysql_query($query_livre, $dbprotect) or die(mysql_error());
    $row_livre = mysql_fetch_assoc($livre);
    ?>
    ici je sélectionne donc tout ce qui se trouve dans ma table livre
    Ensuite pour afficher le résultat je fais :

    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
     <?php
    do {  
    ?>
     
    <a href="fiche_ouvrage.php?id_livre=<?php echo  $row_livre['id_livre']; ?>"><img src="images/<?php echo  $row_livre['couverture']; ?>" border="0"></a></div>
     
    <h2> <?php echo  $row_livre['titre_livre']; ?> </h2>
     
    Artiste :nom de l'artiste <br/>
    Préface :nom du préfacier <br/>
    Auteur : nom de l'auteur
     
                  <?php
    	} while ($row_livre = mysql_fetch_assoc($livre));
     		$rows = mysql_num_rows($livre);
      		if($rows > 0) {
          		mysql_data_seek($livre, 0);
    	  		$row_livre = mysql_fetch_assoc($livre);
    		}
    ?>
    Cela fonctionne et affiche les ouvrages se trouvant dans la table livre.

    ce que je souhaite faire, c'est afficher le nom de l'artiste (s'il y en a un), le nom du préfacier (s'il y en a un), le nom de l'auteur (s'il y en a un).
    Ces informations sont présentes dans ma table relation.
    Mais pour afficher cela, j'ai besoin des infos de la table relation et de la table auteur (pour récupérer les nom et prénom).

    mais je ne vois pas comment faire. J'ai essayer de faire dans ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $query_livre = "SELECT * FROM livre, auteur, relation ORDER BY livre.id_livre DESC";
    $livre = mysql_query($query_livre, $dbprotect) or die(mysql_error());
    $row_livre = mysql_fetch_assoc($livre);
    Mais la, tu t'en doute, j'ai des doublon dans l'affichage puisque ma boucle while a beaucoup plus d'enregistrement.

    Est-ce que tu aurais un conseille à me donner?

    Merci d'avance,
    Cdt,
    Mathieu

  7. #7
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    pour faire le lien entre les tables, utilise une jointure interne comme expliqué là :
    http://sqlpro.developpez.com/cours/s...ntures/#LIII-B
    GNAP !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Merci pour le lien.
    J'ai regardé, mais je ne suis pas sur de comprendre.
    Dans les exemples, il me semble qu'il s'agit d'une relation entre 2 tables.
    Mais le problème est que j'ai une relation entre trois table.
    Je souhaite afficher (par exemple)
    le titre de de l'ouvrage -> table livre
    le ou les nom(s) des auteur(s) ayant participer -> table auteur
    la relation, si l'auteur est artiste, auteur de préface ou auteur -> table relation

    dans la table relation j'ai

    id_livre | id_auteur | nom_relation
    1 1 auteur
    1 2 artiste
    2 2 artiste
    2 3 auteur de préface


    Je ne vois donc pas comment faire la jointure avec les jointure interne.

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $query_livre = "SELECT * FROM livre, auteur INNER JOIN relation ON livre.id_livre = relation.id_livre ";
    Mais encore un fois ca me sort trop d'enregistrement et je ne suis vraiment pas sûr de ce que j'ai écris...

    Est-ce que tu aurais une piste ou une explication?

    Merci encore pour ton aide.
    Cdt,
    Mathieu

  9. #9
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    essaye cette requête
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM livre
    INNER JOIN relation 
        ON relation.id_livre = livre.id_livre
    INNER JOIN auteur 
        ON auteur.id_auteur = relation.id_auteur
    GNAP !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Merci,
    ca fonctionne plutôt pas mal.

    Mais le problème est que si pour un livre j'ai deux auteurs (un auteur et un auteur de préface par exemple) alors j'ai deux ligne pour ce livre dans ma table relation et donc j'ai un doublon à l'affichage.

    il y a t'il un moyen de pallier à cela?

  11. #11
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    Citation Envoyé par matt7575 Voir le message
    Mais le problème est que si pour un livre j'ai deux auteurs (un auteur et un auteur de préface par exemple) alors j'ai deux ligne pour ce livre dans ma table relation et donc j'ai un doublon à l'affichage.
    ce n'est pas un doublon puisque il y a deux personnes différentes mais c'est juste une autre façon d'afficher les données
    donc ce n'est pas au niveau de la base de données qu'il faut faire les modifications mais au niveau du code PHP qui affiche les données

    je suppose que tu veux un affichage de ce genre ?
    • livre 1
      • auteur : aaa
      • préface : bbb
    • livre 2
      • auteur : ccc


    donc c'est quelque chose dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $idLivreEnCours = 0;
     
    while ($ligne = ...) { // récupération des résultats de la requête
     
        if ($ligne['id_livre'] != $idLivreEnCours) { // nouveau livre
            $idLivreEnCours = $ligne['id_livre'];
     
            echo '<hr/>';
            echo "Titre : {$ligne['titre_livre']}<br/><br/>";
        }
     
        echo "{$ligne['nom_relation']} : {$ligne['nom_auteur']}<br/>";
    }
    GNAP !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Yes, merci pour ton aide.

    J'ai à peu près compris le raisonnement. En tout cas ça fonctionne tout à fait comme je le souhaite.

    Merci encore d'avoir pris le temps de m'aider !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Bonsoir,

    J'ai encore un petit souci.
    Avec la boucle php je suis complétement perdu dans mes div. Peut-être quelqu'un peut il m'aider.

    Le problème est que si j'ai un nombre pair d'enregistrement, tout s'affiche bien, mais si j'ai un nombre impaire, là il y a un problème dans le balise div.

    Mon code se présente comme ceci :

    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
    <?php  require_once('./admin/connexion.php'); ?>
    <?php  mysql_select_db($database_dbprotect, $dbprotect);
    mysql_query("SET NAMES UTF8"); 
    $query_livre = "SELECT * FROM livre INNER JOIN relation ON relation.id_livre = livre.id_livre INNER JOIN auteur ON auteur.id_auteur = relation.id_auteur ORDER BY relation.id_livre ASC";
    $livre = mysql_query($query_livre, $dbprotect) or die(mysql_error());
     
     
    session_start(); // début de session 
     
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
     
     
    	<link href="style.css" rel="stylesheet" type="text/css" media="screen" />
     
    </head>
     
    <body>
     
     
    	<div id="conteneur">
     
         	<?php 
         include ("menu_gauche.php");
        ?>
     
    		<div id="centre">
    		    <div id="top"></div>
    			  <div id="cadre">
    				    <div class="scr">
    				        <div class="contenu">
    				      <h1>  Le catalogue </h1>
     
     
    <?php $idLivreEnCours = 0;
     
    while ($ligne =  mysql_fetch_assoc($livre)) { // récupération des résultats de la requête
     
        if ($ligne['id_livre'] != $idLivreEnCours) { // nouveau livre
            $idLivreEnCours = $ligne['id_livre'];
     
            echo "<div class='sepa'></div>";
            echo '<br/>';
            echo "<div class='liste'>
    				          <div class='gauche'>
                          <a href='fiche_ouvrage.php?id_livre= {$ligne['id_livre']}'><img src='images/{$ligne['couverture']}' border='0'/></a>
                      </div>";
     
            echo "<div class='droite'><h2> {$ligne['titre_livre']}</h2>";
        }
     
        echo "{$ligne['nom_relation']} : <a href='fiche_auteur.php?id_auteur={$ligne['id_auteur']}'>{$ligne['prenom']} {$ligne['nom']}</a> <br/></div>";
     
    }
     
    ?>
     
                  </div> 
             </div> 
    				</div>
    			</div>
    			<div id="footer"></div>
    		</div>
     
    	     	<?php 
         include ("menu_droite.php");
        ?>
     
    	</div>
    </body>
    </html>

    Merci d'avance pour votre aide et bonne année à tous

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Personne ne voit où est le problème ?

    Je pense qu'il y a un souci avec la boucle et les div...
    Si quelqu'un pouvait m'aider ce serait formidable car la je patauge !

    Merci,
    Mathieu

Discussions similaires

  1. liaison entre les tables
    Par celticval dans le forum Access
    Réponses: 19
    Dernier message: 05/04/2006, 16h49
  2. [MySQL] requete avec liaisons avec plusieurs tables
    Par pod1978 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/03/2006, 22h21
  3. Relations entre plusieurs tables bloquent un état
    Par aujero dans le forum Access
    Réponses: 5
    Dernier message: 07/02/2006, 12h07
  4. [Débutant] requete entre plusieurs tables
    Par xufux dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/08/2005, 14h00
  5. liaison entre plusieurs base de donnee
    Par GMI dans le forum Bases de données
    Réponses: 1
    Dernier message: 15/12/2004, 18h42

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