Rechercher : dans
Par :

Clé étrangère avec phpmyadmin

Dernière réponse le 24 avr 2009 à 14:43:20 tybmhi, le 5 aoû 2008 à 19:12:55 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Clé étrangère avec phpmyadmin » dans :
Avast familial : renouveler / enregistrer sa clé de licence Voir1) Obtenir une nouvelle licence 2) Enregistrer sa nouvelle licence 1) Obtenir une nouvelle licence 1.1) Pour renouveler la clé de licence, se rendre sur le site d'Avast et remplir le formulaire d'inscription qui se trouve ICI. 1.2)...
Formater une clé USB VoirLes clés USB doivent nécessairement être formatées avec le système de fichiers FAT (FAT16 ou FAT32) pour pouvoir être utilisées par les principaux systèmes d'exploitation. Sous Windows Or, pour une clé USB de capacité supérieure à 32Mo, Windows...
Antivirus gratuit sur clé USB VoirParfois il peut être utile d'emporter des antivirus sur clé USB: pour tester une machine qui n'a pas de connexion internet pour tester une machine qui ne vous appartient pas (famille, amis, cybercafé...) ou qui ne possède pas d'antivirus pour...
SQL - Contraintes d'intégrité VoirExpression de contraintes d'intégrité Une contrainte d'intégrité est une clause permettant de contraindre la modification de tables, faite par l'intermédiaire de requêtes d'utilisateurs, afin que les données saisies dans la base soient...
Le modèle relationnel VoirQu'est-ce que le modèle relationnel? Le modèle relationnel est basé sur une organisation des données sous forme de tables. La manipulation des données se fait selon le concept mathématique de relation de la théorie des ensembles, c'est-à-dire...
Clé USB VoirIntroduction à la notion de clé USB Une clé USB (en anglais USB key) est un périphérique de stockage amovible de petit format pouvant être branché sur le port USB d'un ordinateur. Une clé USB embarque dans une coque plastifiée un...

1

Marco la baraque, le 5 aoû 2008 à 23:13:00
  • +2

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.

Répondre à Marco la baraque

2

tybmhi, le 6 aoû 2008 à 00:08:07

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.

Répondre à tybmhi

3

Marco la baraque, le 6 aoû 2008 à 00:23:14

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.

Répondre à Marco la baraque

4

tybmhi, le 6 aoû 2008 à 01:11:57

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

Répondre à tybmhi

5

Marco la baraque, le 6 aoû 2008 à 10:41:19
  • +1

Bonjour,
Une virgule après message VARCHAR(3000) peut-être.

Cordialement.

Répondre à Marco la baraque

6

ptiteFille, le 20 mar 2009 à 00:05:34

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.

Répondre à ptiteFille

7

Marco la baraque, le 20 mar 2009 à 00:21:26
  • +1

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, rtfm and jfgi
Simple "merci" makes helping people happy :)

Répondre à Marco la baraque

8

 Sissiman, le 24 avr 2009 à 14:43:20

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.

Répondre à Sissiman
Collection CommentÇaMarche.net