aiglobulles Posté 5 Avril 2011 Posté 5 Avril 2011 Bonjour, je rencontre un soucis concernant la liaison de deux tables au sein d'une même base de données. A vrai dire, je n'y comprends pas grand chose dans ces liaisons et du coup, je viens vers vous en espérant avoir quelques petits tuyaux Tout d'abord, ma configuration sous WAMP SERVEUR: - apache 2.2.17 - mysql 5.1.36 - php 5.3.5 - PMA 3.3.9 Le sucis: je dois créer une base de données qui est destinée à recueillir et permettra l'affichage de commerçants de secteurs divers et variés. Il me faut pouvoir afficher leurs coordonnées et éventuellement un screenshot de leur site respectif. Du coup, j'ai crée 2 tables. L'une pour le détail des clients, l'autre pour le détail et le descriptif des différentes rubriques (sachant que le descriptif des différentes rubriques sera disponible en trois langues. Ce que j'ai crée: TABLE CLIENTS: - id_client (PRIMAIRE AI) - nom_client - adresse_client - cp_client - ville_client - tel_client - mail_client - site_client - cat_client - img_client - type_client (pour différencier ceux qui payent pour être affichés dans l'annuaire et ceux que l'on ajoute pour tenter d'être exhaustif) TABLE CATEGORIES: - id_cat (PRIMAIRE AI) - nom_cat - desc_fr_cat - desc_al_cat - desc_en_cat Les tables sont en innoDB. Je dois encore créer une table "ville" car les recherches sur le site doivent pouvoir s'effectuer par catégorie ou par ville: ce serait une table du genre: TABLE VILLE - id_ville - nom_ville - cp_ville Je suis complètement paumé concernant la création d'une liaison entre ces différentes tables. Pourriez vous m'indiquer une piste, un cheminement ? D'avance merci pour votre aide et vos conseils Bruno
NwK Posté 5 Avril 2011 Posté 5 Avril 2011 (modifié) Bonjour bruno, est-ce que le terme de clef étrangère te parle ? Dans un premier temps sous phpmyadmin pour pouvoir lier tes tables tu dois utiliser le Moteur de stockage InnoDB. Ensuite il faut que tu prévois un champ dans tes table pour stocker ces clefs étrangère Exemple : table clients tu as un champs ville client c'est dedans que tu vindra mettre l'id de la ville issue de la table ville. Pour ce faire graphiquement rien de plus simple sous pma tu clique sur structure pour voir la structure de ta table clien ensuite tu devrai voir Gestion des relations ensuite tu rempli les cases avec les listes déroulantes A noté que seul les clèf primaires et les index peuvent être des clef étrangères. Est-ce clair comme explication ? Anthony Modifié 5 Avril 2011 par NwK
Message populaire. aiglobulles Posté 6 Avril 2011 Auteur Message populaire. Posté 6 Avril 2011 (modifié) rhaaa la haine, j'ai passé une demi heure à écrire ma réponse, j'ai cliqué sur "envoyer" et tout s'est effacé... Bon, ben je reprends, je vais essayer d'être aussi clair _AT_lors tout d'abord, merci pour ta réponse Anthony, en fait mes tables sont bien en innoDB, mais je les ai finalement recrées car elles ne me semblait pas judicieusement organisées. J'en suis donc à présent à une architecture qui ressemble à ça: -- phpMyAdmin SQL Dump -- version 3.3.9 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Mer 06 Avril 2011 à 08:05 -- Version du serveur: 5.1.36 -- Version de PHP: 5.3.5 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Structure de la table `annonceurs` -- TABLE `annonceurs` `id_annonceur` int(11) NOT NULL AUTO_INCREMENT, `nom` varchar(50) NOT NULL, `adresse` varchar(50) NOT NULL, `cp` varchar(5) NOT NULL, `ville` varchar(50) NOT NULL, `tel` varchar(10) NOT NULL, `mail` varchar(50) NOT NULL, `url` varchar(30) NOT NULL, `rubrique` varchar(30) NOT NULL, `image` varchar(50) NOT NULL, `type` char(1) NOT NULL, PRIMARY KEY (`id_annonceur`) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -- Structure de la table `rubriques` -- TABLE `rubriques` `id_rubrique` varchar(30) NOT NULL, `libelle_fr` varchar(30) NOT NULL, `libelle_al` varchar(30) NOT NULL, `libelle_en` varchar(30) NOT NULL, `desc_fr` varchar(5000) NOT NULL, `desc_al` varchar(5000) NOT NULL, `desc_en` varchar(5000) NOT NULL, PRIMARY KEY (`id_rubrique`) ENGINE=InnoDB DEFAULT CHARSET=utf8; j'ai donc tenter une liaison entre les tables "annonceurs(id_annonceurs)" et "rubriques(id_rubrique)" je n'ai rien spécifié au niveau des listes déroulantes. J'ai alors le message d'erreur suivant: Erreur lors de la création de la clé étrangère sur id_annonceur (vérifiez le type des colonnes) Documentation Erreur ALTER TABLE `annonceurs` DROP FOREIGN KEY `annonceurs_ibfk_1` ; ALTER TABLE `annonceurs` ADD FOREIGN KEY ( `id_annonceur` ) REFERENCES `alsaceinfo`.`rubriques` ( `id_rubrique` ); Je ne comprends pas bien ou se situe le souci, y a certainement une étape que j'ai raté mais je ne vois pas laquelle. J'ai une clef primaire sur chacune de mes tables donc ça devrait être bon non ? D'avance merci pour votre aide Bruno Modifié 6 Avril 2011 par aiglobulles 1
Arlette Posté 6 Avril 2011 Posté 6 Avril 2011 Bonjour, rhaaa la haine, j'ai passé une demi heure à écrire ma réponse, j'ai cliqué sur "envoyer" et tout s'est effacé... C'était pas effacé, c'était en modération ... Quand on a très peu de message et que l'on met des code ou des urls dans les posts, ils passent en modération et il faut attendre qu'un modo le valide ... C'est une mesure : "anti spam".
aiglobulles Posté 6 Avril 2011 Auteur Posté 6 Avril 2011 ahhh ok, merci pour la précision Arlette. J'avais justement fait un testen renvoyant un court message juste avant le premier, et voyant qu'il s'éffichait, j'ai cru avoir perdu mon message initialement posté. _AT_bientôt
aiglobulles Posté 6 Avril 2011 Auteur Posté 6 Avril 2011 Depuis mon dernier enfin avant dernier message, j'ai compris l'origine de mon soucis (les clefs étrangères), j'ai donc une fois encore revu mes tables et j'ai donc au final (et j'espère que ce sera la dernière mouture ) TABLE `annonceurs` `id_annonceur` int(3) NOT NULL AUTO_INCREMENT, `nom_annonceur` varchar(50) CHARACTER SET utf8 NOT NULL, `adresse` varchar(50) CHARACTER SET utf8 NOT NULL, `cp_annonceur` int(5) NOT NULL, `ville_annonceur` varchar(50) CHARACTER SET utf8 NOT NULL, `tel` int(10) NOT NULL, `mail` varchar(50) CHARACTER SET utf8 NOT NULL, `url` varchar(50) CHARACTER SET utf8 NOT NULL, `type` char(1) CHARACTER SET utf8 NOT NULL, `rubrique_annonceur` int(3) NOT NULL, PRIMARY KEY (`id_annonceur`), KEY `ville_annonceur` (`ville_annonceur`,`rubrique_annonceur`) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; TABLE `rubriques` `id_rubrique` int(3) NOT NULL AUTO_INCREMENT, `libelle_fr` varchar(50) CHARACTER SET utf8 NOT NULL, `libelle_al` varchar(50) CHARACTER SET utf8 NOT NULL, `libelle_en` varchar(50) CHARACTER SET utf8 NOT NULL, `desc_fr` varchar(2500) CHARACTER SET utf8 NOT NULL, `desc_al` varchar(2500) CHARACTER SET utf8 NOT NULL, `desc_en` varchar(2500) CHARACTER SET utf8 NOT NULL, PRIMARY KEY (`id_rubrique`), KEY `libelle_fr` (`libelle_fr`) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; TABLE `villes` `id_ville` int(3) NOT NULL AUTO_INCREMENT, `nom_ville` varchar(50) NOT NULL, `cp_ville` int(5) NOT NULL, PRIMARY KEY (`id_ville`), KEY `nom_ville` (`nom_ville`) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; si je lie "annonceurs(ville_annonceur)" à "villes(nom_ville)" et "annonceurs(rubrique_annonceur)" à "rubriques(libelle_fr)" je devrais bien avoir une liaison entre les trois tables et pouvoir faire des selects sur n'importe quel champ non ? les libellé et desc seront les éléments traduits (libelle pour le nom des rubriques et desc pour permettre l'affichage d'un court texte pour chacune d'elle) Merci pour vos explications... en attendant j'ai faim
NwK Posté 6 Avril 2011 Posté 6 Avril 2011 Bonjour, i je lie "annonceurs(ville_annonceur)" à "villes(nom_ville)" et "annonceurs(rubrique_annonceur)" à "rubriques(libelle_fr)" je devrais bien avoir une liaison entre les trois tables et pouvoir faire des selects sur n'importe quel champ non ? Les cléfs étrangères ne sont pas la pour te permettre de faire des sélect sur n'importe quel champ mais plutôt pour t'aider à mieux gérer les liens entre tes tables dans le cas de mise à jour d'un id ou suppression d'un élement. tu as 3 possibilité en cas d'update et de delete CASCADE SET NULL NO ACTION / RESTRICT (action identique sous mysql) Tu peux effectivement faire des select sur les éléments que tu veux. Clé étrangère ou non. Mais grace aux clèf étrangère tu ne pourra pas saisir l'id d'une ville inexistante ni supprimer une ville habité par certain de tes clients sauf si tu l'a autorisé et dans ce cas ça fera l'action que tu as choisi. c'est clair ? =) Anthony
aiglobulles Posté 6 Avril 2011 Auteur Posté 6 Avril 2011 Encore merci pour tes conseils Anthony, j'ai finalement réussi à mettre en place les liaisons que je souhaitais. A présent, si j'entre par exemple un nouvel annonceur, le champs ville présente une liste déroulante me proposant de choisir l'id d'une ville... bon, ce serait sans doute plus parlant si le nom de la ville s'affichait mais je le coderait pour le backoffice. _AT_présent, j'essaye de gérer l'affichage de requêtes dans mes pages, j'utilise le moteur de template TBS que nous avons abordé en cours. Plus d'infos sous quelques jours en fonction de mon avancement... je réinvente la roue histoire de m'habituer à manipuler les requêtes et les fonctions php... mais si vraiment je bloque, j'ai mis en place en parallèle un site joomla/joomfish Bonne journée à toi et encore merci
abdelt Posté 12 Octobre 2011 Posté 12 Octobre 2011 bonsoir pour lier les tables il faut utiliser les jointures entre ces tables,ce que je pense qu'il yen besoin des clées primaires et autres etrangéres pour faire la liaison, par exemple pour 3 table il nous faut 2 jointure et comme ca..
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant