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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    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 averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    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 Expert 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
    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"

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    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 Expert 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
    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

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    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

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