Clé étrangère avec phpmyadmin

[Résolu/Fermé]
Signaler
Messages postés
200
Date d'inscription
dimanche 13 juillet 2008
Statut
Membre
Dernière intervention
18 septembre 2017
-
 suzana -
Bonjour,

Voilà mon problème : J'ai crée une table nommé "post" ( champs: id Pseudo Lyrics) qui enregistre les messages postés par les internautes.

Sur une page php je fais apparaitre tous les messages dans la base de données en faisant une boucle avec la fonction "while". Jusque là tous va bien.

J'ai envie de rajouter un système de commentaire à chacun de ces messages.
J'ai donc créer une nouvelle table nommé "commentpost" (champ : id pseudo message )

Pour l'instant la seule que je suis arrivé a faire se répète pour tous les message (certainement à cause de la boucle)
Je voudrais donc savoir comment faire pour lier uniquement chaque message du commentaire au message poster par l'internaute. J'ai entendu parle de clé étrangère, de fonction "left join" etc... mais je suis débutant en la matière et je ne sait vraiment pas comment faire.

Merci d'avance
A voir également:

8 réponses

Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
333
Bonsoir,
Il faut que tu rajoutes un champ à ta table de commentaire pour spécifier à quel post le commentaire se réfère. C'est ça la notion de foreign key.

Pour la création, avec MySQL tu vas donc avoir un truc semblable à :
CREATE TABLE posts
(id INT NOT NULL,
INDEX(id),
pseudo VARCHAR(32),
lyrics VARCHAR(30000),
PRIMARY KEY(id)
)TYPE=INNODB;

CREATE TABLE comments
(id INT NOT NULL,
pseudo VARCHAR(32),
message VARCHAR(3000)
post_id INT NOT NULL,
INDEX(post_id),
PRIMARY KEY(id),
FOREIGN KEY(post_id) REFERENCES posts(id) ON DELETE CASCADE)
TYPE=INNODB;

Evidemment ce script est à adapter en fonction de tes besoins (ALTER TABLE si tes tables existent déjà...).

En ce qui concerne la requête sql, pour sélectionner tous les commentaires d'un post, tu pourras faire :
select id, pseudo, message from comments where post_id=post

post est donc l'identifiant du post. Pas besoin de jointure ici, c'est pas encore très compliqué.

Cordialement.
8
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
333
Bonsoir PtiteFille,
En fait, tu as à moitié raison. Voici un extrait de la documentation de MySQL :
Another extension is supported by MySQL for optionally specifying the display width of integer data types in parentheses following the base keyword for the type (for example, INT(4)). This optional display width may be used by applications to display integer values having a width less than the width specified for the column by left-padding them with spaces.


Autrement dit, les chiffres entre parenthèses ne sont aucunement une restriction en terme d'emplacement mémoire (si tu déclares un INT, un INT(4) ou un INT(20), tu pourras stocker des entiers entre -2147483648 et 2147483647). Ca ne sert que pour l'affichage : les entiers qui possèderont moins de 4 ou 20 digits seront décallés vers la droite pour être bien alignés :)

Cordialement,
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
333
Bonjour,
Une virgule après message VARCHAR(3000) peut-être.

Cordialement.
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
333
L'erreur que tu as est une erreur de syntaxe SQL. Ce n'est pas comme ça qu'on écrit un alter table : il faut simplement spécifier si tu ajoutes ou supprimes des colonnes, changes le type d'un champ...
Regarde les exemples présents ici si tu le souhaites : http://dev.mysql.com/doc/refman/5.0/fr/alter-table.html

NB : En ce qui concerne la taille des varchar, si tu utilises les dernières versions de MySQL, elles peuvent contenir 65535 caractères elles aussi (comme les types text ou blob), au lieu de 255 dans les anciennes versions. Tout dépend de ta version, tu devras peut-être adapter et changer les types varchar en text si besoin.

Cordialement.
Lorsquèon crée des champs de type int dans une bd, ne faut-il pas toujours incrire int(x), x étant le nombre de chiffres désirés. Pour un champs Id si on met 100 par exemple, il aura un possibilitée de 999 entrées.

Je ne suis pas certaine qu'il soint nécessaire quèon inscrive la taille des int dans myphpadmin mais je sais que parfois c'est requis selon la version.
Messages postés
200
Date d'inscription
dimanche 13 juillet 2008
Statut
Membre
Dernière intervention
18 septembre 2017
12
tout d'abord merci pour ton aide précieuse. Ça fait plusieurs jours que je cherche une solution.

voilà la requête que j'ai rentré :

ALTER TABLE post
(id INT NOT NULL,
INDEX(id),
Pseudo VARCHAR(32),
Sujet VARCHAR(200),
Lyrics VARCHAR(30000),
PRIMARY KEY(id)
)TYPE=INNODB;

ALTER TABLE commentpost
(id INT NOT NULL,
pseudo VARCHAR(32),
message VARCHAR(3000)
post_id INT NOT NULL,
INDEX(post_id),
PRIMARY KEY(id),
FOREIGN KEY(post_id) REFERENCES posts(id) ON DELETE CASCADE)
TYPE=INNODB;


MySQL a répondu:Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(id INT NOT NULL,
INDEX(id),
Pseudo VARCHAR(32),
Sujet VARCHAR(150),
Lyrics ' at line 2


Alors peut-être ai-je fais une erreur en adaptant la requête ?
J'ai même essayer de changer VARCHAR en TEXT pour les champs à plus de 250 mais le résultat est le même.
Messages postés
200
Date d'inscription
dimanche 13 juillet 2008
Statut
Membre
Dernière intervention
18 septembre 2017
12
j'ai effacé mes tables comme elles était presque vide.

J'ai donc remis le CREATE a la place de ALTER et ca à tres bien marché pour la table post mais pas pour la table commentpost : J'ai toujours une erreur de syntax . Y aurait-il une erreur ?


CREATE TABLE commentpost
(id INT NOT NULL,
pseudo VARCHAR(32),
message VARCHAR(3000)
post_id INT NOT NULL,
INDEX(post_id),
PRIMARY KEY(id),
FOREIGN KEY(post_id) REFERENCES post(id) ON DELETE CASCADE)
TYPE=INNODB;

Merci de ton aide
Messages postés
8
Date d'inscription
mardi 9 janvier 2007
Statut
Membre
Dernière intervention
24 avril 2009
77
Bonjour tout le monde moi j'ai un problème qui est le suivant j'ai crée une base de donnée sur laquelle je veux poster des données entrées à partir d'un formulaire le problème c'est que quand je fais valider le formulaire une fois c'est ok tous fonctionne IMPEC!
Et lorsqu'une nouvelle personne s'inscrit sa me dis inscription validée jusque la rien d'anormal mais lorsque je consulte ma base de données je constates que cette personne n'est pas enregistrées dans la base, j'ai remarqué que pour que le formulaire soit bien posté je dois effacés mes traces "COOKIES" puis à ce moment la sa poste donc après chaque nouvelle entrées de formulaire je dois effacer effacer effacer je cherche une solution depuis 1 semaine rien n'a faire :(
Merci d'avance pour l'aide que vous m'apporterai.
requête SQL:

CREATE TABLE 'lcat'.'grade' (
'id_graphe' INT( 20 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
'id_mem' INT( 20 ) NOT NULL COMMENT 'FOREIGN KEY(id_mem) REFERENCES membre(id_mem) ON DELETE CASCADE) '
) ENGINE = InnoDB;

MySQL a répondu: Documentation
#1005 - Can't create table 'lcat.grade' (errno: 150)
j'ai pas compris c'est quoi le problème ????????
réponse s'il vous plait ^_^