Page 1 sur 2
php/mysql commentaires
Posté : 22 mai 2005, 11:52
par Nonoteam
Bonjour,
J'essaye de faire un petit script d'ajout de commentaires.
Sur la page index.php il y a mon formulaire pour poster un commentaire + les commentaires deja ecrit au dessus, je me sert d'un table mysql qui enregistre les champs nom, email, site, message.Ces commentaires au dessus du formulaire sont ressorti de la bdd.
Mais si je met le script sur plusieurs pages du site et que j'ajoute un commentaire sur page1.php (par exemple) et ba ca me ressort aussi ce commentaire sur page2.php.
Comment ajouter juste le commentaire sur la page ou le formulaire est rempli ? Merci d'avance.
nonoteam
Posté : 22 mai 2005, 12:02
par Cyrano

Je comprends pas grand chose: Avant d'aller plus loin, je vais essayer de reformuler et tu me diras si c'est ce que tu cherches à faire:
Tu as une page où les gens ajoutent un commentaire à la suite d'un article quelconque. Chaque commentaire est ajouté dans la base et tu les affiches tous en répartissant sur plusieurs pages au besoin, mais tu voudrais voir les derniers commentaires en premiers, donc sur la première page. Est-ce que c'est bien ça ?
Posté : 22 mai 2005, 12:24
par Nonoteam
Oui dsl c'est pas très comprehensible,
Ce n'est pas vraiment ca en fait.
J'ai une page où les gens ajoutent un commentaire à la suite d'un article quelconque. Chaque commentaire est ajouté dans la base et je n'arrive pas à les afficher en répartissant sur plusieurs pages. Il s'affiche tous au même endroit.
Par exemple:
J'ai un article sur les pc, quelqu'un ajoute "je vais l'avoir bientot ce processeur" ca affichera aussi ce com sur un autre article sur les voitures.
Je n'arrive pas à les repartir
Posté : 22 mai 2005, 12:35
par Cyrano
Il doit y avoir un problème soit avec ta requête, soit avec la structure de ta base de dnooées:
As-tu une table pour les articles et une table pour les commentaires avec en clé étrangère dans la table commentaires la clé primaire de la table article ? Sinon, c'est ce qu'il faudrait faire et tu aurais alors une requête du genre:
$sql = "SELECT * FROM `commentaires` WHERE `id_article` = '". $id_article ."' ORDER BY `id_commentaire` DESC;";
Tu obtiendrais alors la liste des commentaires exclusivement en rapport direct avec un article précis du dernier au premier. En chageant d'article, tu auras un nouvel identifiant d'article, donc la requête ira chercher les commentaires appropriés et tu n'auras plus les précédents.
Posté : 22 mai 2005, 12:45
par nonoteam
Je n'ai qu'une seule table sous cette forme:
CREATE TABLE com_tbl (
id int NOT NULL auto_increment,
date_verif varchar (20) NOT NULL,
date varchar (20) NOT NULL,
heure varchar (20) NOT NULL,
pseudo varchar (50) NOT NULL,
email varchar(55) NULL,
site varchar (90) NULL,
message text NOT NULL,
PRIMARY KEY (id))
Posté : 22 mai 2005, 12:50
par nonoteam
Mais je n'ai qu'un table, j'ai pas d'article en faite, j'ai jsute les commentaires pour le moment:
http://stock.ntp.free.fr/test2/
Posté : 22 mai 2005, 12:54
par Cyrano
Ok, alors effectivement tu as un problème de structure.
Deux solutions possibles à ceci:
- Tu crées une autre table pour mettre les commentaires à part;
- Tu ajoutes un champ msg_parent_id INT NULL;
La seconde solution serait simple. Ce champ correspondra au message auquel se rapporte le commentaire. Tu devras donc modifier quelques requêtes :
- l'insertion d'un article verra ce champ rester vide (NULL)
- l'insertion d'un commentaire devra voir dans ce champ la clé primaire de l'article;
Pour récupérer les commentaires pour un article, tu vas faire une auto-jointure. Exemple simplifié:
$sql = "SELECT message FROM `com_tbl` AS t1, `com_tbl` AS t2 WHERE t1.msg_parent_id = t2.". $id .";";
Posté : 22 mai 2005, 13:06
par nonoteam
Je n'ai aps tres bien tout compris etant tres debutant.
Je ne comprend pas vraiment msg_parent_Id INT NOT NULL,
et
- l'insertion d'un article verra ce champ rester vide (NULL)
- l'insertion d'un commentaire devra voir dans ce champ la clé primaire de l'article;
Pour récupérer les commentaires pour un article, tu vas faire une auto-jointure
Posté : 22 mai 2005, 13:28
par Cyrano
Ok, je vais essayer d'être plus clair, je vais employer à dessein les termes de "article" et "commentaires" pour distinguer les textes qui seront de toutes façons dans le champ "message";
L'idée, c'est qu'on enregistre aussi bien les articles que les commentaires dans la même table. Chaque message ajouté a un identifiant qui est sa clé primaire. Mais certains sont des articles, d'autres sont des commentaires.
Pour qu'on puisse déterminer à quel article un commentaire se rapporte, il faut qu'on ait un lien vers l'identifiant de l'article. On doit donc avoir dans la table outre la clé primaire un champ id_msg_parent qui est une "fausse" clé étrangère, comme si on utilisait une seconde table. Ce champ va recevoir comme donnée l'identifiant de l'article. Par exemple, tu as l'article dont la clé primaire esr "12" et tu ajoutes un commentaire. Ce commentaire aura par exemple en clé primaire "24" et dans le champ id_msg_parent il faudra mettre "12". Ce dernier point est important parce que c'est ce qui identifie le commentaire par rapport à un article précis.
Si tu ajoutes un article, il ne se rapporte pas à un autre article, donc le champ id_msg_parent n'aura pas de valeur et restera à NULL.
Est-ce que c'est moins obscur ?
Posté : 22 mai 2005, 13:42
par Nonoteam
Oui, je commence a saisir.
Mais pour que le commentaire se rapporte à l'article, je dois ajouter les articles comme les commentaires ? il faut qu'ils est un id.
Car si j'ai un simple texte html et en dessou le sricpt de commentaire, l'article n'aura aucun id. Je ne sais pas comment m'exprimer désolé.
Mais en gros je dois créer aussi une table pour mes textes (articles) ?

Posté : 22 mai 2005, 13:52
par Cyrano
C'est une des deux solutions possibles: soit une table comme actuellement, mais tu dois alors rajouter un champ, soit deux tables distinctes.
Ce que je viens d'expliquer concerne l'option à une seule table.
Dans un système à deux tables, tu vas retrouver les mêmes champs à peu de choses près, mais la seconde table ne contiendra que les commentaires et tu auras, outre une clé primaire pour chaque commentaire, un champ qui correspondra à la clé primaire de la table article et qui sera donc une clé étrangère.
Dans les deux cas, tu auras donc une requête pour l'article lors de laquelle tu récupèreras entre autre la clé primaire et une requête pour les commentaires par rapport à la clé récupérée dans la première requête.
Posté : 22 mai 2005, 15:40
par Nonoteam
si je choisi une seul table, c'est la forme suivante ?
CREATE TABLE com_tbl (
id int NOT NULL auto_increment,
msg_parent_id INT NULL;
date_verif varchar (20) NOT NULL,
date varchar (20) NOT NULL,
heure varchar (20) NOT NULL,
pseudo varchar (50) NOT NULL,
email varchar(55) NULL,
site varchar (90) NULL,
message text NOT NULL,
PRIMARY KEY (id))
et pour deux tables c'est le même principe que sur
http://phpdebutant.org/article67.php
au paragraphe "Alimenter deux tables et créer une liaison" vers la fin ?
désolé mais pour l'histoire de l'Article je ne comprend pas vraiment,
regarde sur ce post
http://www.phpfrance.com/forums/voir_sujet-3378.php
c'est le code que j'ai pour
http://stock.ntp.free.fr/test2/
Posté : 22 mai 2005, 15:57
par Cyrano
Ouais, c'est ok pour la strcture, tu pourrais même améliorer comme ceci :
Code : Tout sélectionner
CREATE TABLE `com_tbl` (
`id` int(11) NOT NULL auto_increment,
`msg_parent_id` int(11) default NULL,
`date_verif` varchar(20) NOT NULL default '',
`date` varchar(20) NOT NULL default '',
`heure` varchar(20) NOT NULL default '',
`pseudo` varchar(50) NOT NULL default '',
`email` varchar(55) default NULL,
`site` varchar(90) default NULL,
`message` text NOT NULL,
PRIMARY KEY (`id`),
KEY `msg_parent_id` (`msg_parent_id`)
);
On ajoute un index sur msg_parent_id, ça va accélérer notablement les requêtes lors de recherches de commentaires.
Je vais voir pour l'autre post.
Posté : 22 mai 2005, 16:02
par Cyrano
Pour les deux tables, oui, c'est exactement le principe montré sur phpdebutant: ce qu'on fait ici, c'est la même chose avec une seule table. C'est pour ça qu'on crée un champ supplémentaire qui sert de repère. Relis ce que je t'ai mis plus haut : tu devras faire une auto-jointure, ce qui veut dire en termes plus clairs : tu vas faire un lien entre la table com_tbl qu'on nommera pour les besoin du moment "articles" et la table com_tbl (la même) qu'on nommera pour les besoin de ce même moment "commentaires" et on va chercher la correspondance de clés entre ces deux tables, virtuelles en quelque sorte.
Posté : 22 mai 2005, 16:08
par Nonoteam
Oki, merci beaucoup,
Je ne sais pas si tu as vu sur mon autre post: j'ai un code comme celui-ci:
$req = mysql_query("SELECT date,heure,pseudo,email,message from com_tbl Order by date_verif Desc ") or die ("Erreur requête");
et dans ce post tu me dis de faire une auto-jointure comme ceci:
$sql = "SELECT message FROM `com_tbl` AS t1, `com_tbl` AS t2 WHERE t1.msg_parent_id = t2.". $id .";";
Je ne vois pas comment utiliser les deux en même temps.
Merci deja pour tes nombreuses explications
