Requête SQL 2 tables

Signaler
-
 omlaly -
Bonjour,

Je cherche à sélectionner les commentaires de l'article correspondant.

Voici les CREATE TABLE des 2 tables :
ARTICLES :
CREATE TABLE IF NOT EXISTS `articles` (
  `id_article` int(11) NOT NULL AUTO_INCREMENT,
  `nom_village` varchar(255) CHARACTER SET latin1 NOT NULL,
  `nom_categorie` varchar(255) CHARACTER SET latin1 NOT NULL,
  `date_depot` datetime NOT NULL,
  `titre_article` varchar(255) NOT NULL,
  `texte_article` text NOT NULL,
  `auteur_article` varchar(255) NOT NULL,
  PRIMARY KEY (`id_article`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=80 ;


COMMENTAIRES :
CREATE TABLE IF NOT EXISTS `commentaires` (
  `id_commentaire` int(11) NOT NULL AUTO_INCREMENT,
  `user_pseudo` varchar(255) NOT NULL,
  `id_village` int(11) NOT NULL,
  `date_depot` datetime NOT NULL,
  `texte_commentaire` text NOT NULL,
  PRIMARY KEY (`id_commentaire`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;


Est-ce qu'il ne faut pas faire une requête SQL imbriquée ?

En attendant vos réponses, je continue mes recherches...
Cordialement

71 réponses

Ce code m'affiche pour tous les articles 83 soit l'identifiant du dernier article. Je pense que la requête SQL est bonne, c'est le code PHP qui ne doit pas être bon.
$query_selection_article_id_correspondant = mysql_query("SELECT articles.id_article FROM articles, commentaires WHERE articles.id_article=commentaires.id_article") or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL


while ($row = mysql_fetch_assoc($query_selection_article_correspondant)) {
   echo $row["user_pseudo"];
   echo dateLongue($row["date_depot"]);
   echo $row["texte_commentaire"];
}
while ($row = mysql_fetch_assoc($query_selection_article_id_correspondant)){
   echo $row["id_article"];
}


En attendant vos réponses, je continue mes recherches...
Cordialement
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Lis et essaies de transcrire mon pseudo-code en PHP.

Je peux pas corriger au point par point ton "code", trop d'erreurs et d'incompréhensions. On va en avoir pour 2 semaines rien que pour un simple affichage.
Jusqu'à l'affichage du titre, de la date et du contenu de l'article, c'est bon tout marche.
Mais pour les commentaires, c'est là que je n'arrive pas.
Pour identifier l'article, tu m'as dit qu'il fallait rajouter un champs caché avec son identifiant. Quand j'essaye de faire ça, ça m'affiche 83 à tous les articles postés (83 c'est l'identifiant du dernier article).

Je continue mes recherches...
Cordialement
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Non, lorsque tu parcours tes articles tu récupères le titre, la date, le contenu ... et son identifiant. Tu te sers alors de cet identifiant pour générer ta requête qui récupère les commentaires associés.
Je comprends le principe mais j'arrive pas à le faire, pourtant je cherche là !

Pour afficher les articles, voici le code PHP :
$premiereEntree=($pageActuelle-1)*$messagesParPage; // Calculer la première entrée à lire

// La requête SQL pour récupérer les messages de la page actuelle
$retour_messages=mysql_query('SELECT * FROM articles WHERE nom_categorie = "nomcategorie" AND nom_village = "village" ORDER BY id_article DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'') or die ('Erreur sur la requête SQL concernant le nombre d\'articles concernant le village et la catégorie "nomcategorie"'.mysql_error()); // Envoie une requête à un serveur MySQL

while($donnees_messages=mysql_fetch_assoc($retour_messages)) { // Lecture des entrées une à une grâce à une boucle

     // Affichage des messages avec le design
     // nl2br : Insère un retour à la ligne HTML à chaque nouvelle ligne - pour prendre en compte les sauts de ligne dans le message.
     echo ''.nl2br($donnees_messages['titre_article']).',

----

'.nl2br($donnees_messages['texte_article']).',

----

<small>Posté par : '.(stripslashes($donnees_messages['auteur_article']).' - '.dateLongue($donnees_messages['date_depot'])).'</small>

';

echo '
Commentaires.


<form method="POST" action="../../commentaire_post.php"><textarea name="texte_commentaire_article"></textarea>
</form>

';
    // Ajout des sauts de ligne pour espacer les messages (
)		
// Requête SQL pour déterminer l'identifiant de l'article correspondant - le faire à l'affichage
$query_selection_article_correspondant = mysql_query("SELECT articles.id_article, commentaires.date_depot, commentaires.texte_commentaire,commentaires.user_pseudo FROM articles, commentaires WHERE articles.id_article=commentaires.id_article") or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL

while ($row = mysql_fetch_assoc($query_selection_article_correspondant)) {
   echo $row["user_pseudo"];
   echo dateLongue($row["date_depot"]);
   echo $row["texte_commentaire"];
}
}


Pour insérer les articles, voici le code PHP :
// On ouvre la session
session_start(); // Démarre une nouvelle session ou reprend une session existante

// strip_tags = Supprime les balises HTML et PHP d'une chaîne
$texte_commentaire_article=$_POST["texte_commentaire_article"];
// Enregistrement du pseudo de l'utilisateur (variable de session) pour pouvoir l'utiliser dans la requête INSERT INTO
$user_pseudo = $_SESSION["user_pseudo"];

//$titre_article = mysql_query("SELECT 'titre_article.articles' FROM articles, commentaires WHERE articles.titre_article=commentaires.titre_article") or die ('Erreur sur la requête SQL concernant l\'insertion des commentaires sur des articles'.mysql_error()); // Envoie une requête à un serveur MySQL

// Juste pour rappel : pour rajouter la clé étrangère, j'ai effectué cette requête SQL dans PHPMyAdmin : ALTER TABLE commentaires ADD FOREIGN KEY (id_article) REFERENCES articles(id_article);
// Insertion du commentaire dans la base de données
$req_insertion_texte_commentaire_article = "INSERT INTO commentaires(user_pseudo, nom_village, date_depot, texte_commentaire, id_article) VALUE ('$user_pseudo', '1', now(), '$texte_commentaire_article, '')";
$query_insertion_texte_commentaire_article = mysql_query($req_insertion_texte_commentaire_article) or die ('Erreur sur la requête SQL concernant l\'insertion des commentaires sur des articles'.mysql_error()); // Envoie une requête à un serveur MySQL
echo "Votre commentaire est posté.

";
}


Peux-tu me dire ce qu'il ne va pas dans ces deux codes STP ? Je sais que je ne suis pas doué mais j'aimerais régler ce problème. Il y a plus grand chose à faire : pour les articles, j'y suis arrivé j'aimerais en faire de même pour les commentaires. Et là je cherche, j'essaye de trouver...

En attendant vos réponses, je continue mes recherches...
Cordialement
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Dans le premier code : tu ne tiens pas compte de l'identifiant de l'article en cours pour filtrer les commentaires, càd ta requête (*)

Dans le deuxième code : tu ne récupères pas l'identifiant de l'article commenté, car tu ne l'as pas référencé sur ton formulaire, du coup tu ne sais pas sur quel article l'associer (**)

(*) Je t'ai dit de le faire dans mon précédent message, si je dois répéter 3x la même chose pour que tu la prennes en compte dis le moi, que je fasse directement 3 copier/coller dans le même post. C'est vraiment désespérant de donner des explications dont tu te fous royalement.

(**) j'en ai aussi parlé, même si moins directement. Si tu réfléchis un peu (je sais, j'en demande trop) tu trouveras la solution.
Merci de tes conseils. Ils m'ont aidé à avancer !

J'ai réussi à afficher les identifiants des articles (que je masquerai plus tard). Dans la requête SQL, j'ai, donc, mis l'identifiant du bon article. Mais quand je teste, une erreur apparait :
Erreur sur la requête SQL concernant l'insertion des commentaires sur des articlesCannot add or update a child row: a foreign key constraint fails (`sgbdd`.`commentaires`, CONSTRAINT `commentaires_ibfk_4` FOREIGN KEY (`id_article`) REFERENCES `articles` (`id_article`))


On voit que c'est la clé étrangère qui fait buggué :

Je te mets les codes PHP actualisés :

Affichage :

     // Affichage des messages avec le design
     // nl2br : Insère un retour à la ligne HTML à chaque nouvelle ligne - pour prendre en compte les sauts de ligne dans le message.
     echo ''.nl2br($donnees_messages['titre_article']).',

----

'.nl2br($donnees_messages['texte_article']).',

----

<small>Posté par : '.(stripslashes($donnees_messages['auteur_article']).' - '.dateLongue($donnees_messages['date_depot'])).'</small>
----, '.($donnees_messages['id_article']).'</td>
</td>

';

echo '
Commentaires.


<form method="POST" action="../../commentaire_post.php"><textarea name="texte_commentaire_article"></textarea>
</form>

';
    // Ajout des sauts de ligne pour espacer les messages (
)		
// Requête SQL pour déterminer l'identifiant de l'article correspondant - le faire à l'affichage
$query_selection_article_correspondant = mysql_query("SELECT articles.id_article, commentaires.date_depot, commentaires.texte_commentaire,commentaires.user_pseudo FROM articles, commentaires WHERE articles.id_article=commentaires.id_article") or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL

while ($row = mysql_fetch_assoc($query_selection_article_correspondant)) {
   echo $row["user_pseudo"];
   echo dateLongue($row["date_depot"]);
   echo $row["texte_commentaire"];
}
}


Insertion des articles :
// strip_tags = Supprime les balises HTML et PHP d'une chaîne
$texte_commentaire_article=$_POST["texte_commentaire_article"];
$id_article=$_POST["id_article"];

// Enregistrement du pseudo de l'utilisateur (variable de session) pour pouvoir l'utiliser dans la requête INSERT INTO
$user_pseudo = $_SESSION["user_pseudo"];

//$titre_article = mysql_query("SELECT 'titre_article.articles' FROM articles, commentaires WHERE articles.titre_article=commentaires.titre_article") or die ('Erreur sur la requête SQL concernant l\'insertion des commentaires sur des articles'.mysql_error()); // Envoie une requête à un serveur MySQL

// Juste pour rappel : pour rajouter la clé étrangère, j'ai effectué cette requête SQL dans PHPMyAdmin : ALTER TABLE commentaires ADD FOREIGN KEY (id_article) REFERENCES articles(id_article);
// Insertion du commentaire dans la base de données
$req_insertion_texte_commentaire_article = "INSERT INTO commentaires(user_pseudo, nom_village, date_depot, texte_commentaire, id_article) VALUE ('$user_pseudo', '1', now(), '$texte_commentaire_article', '$id_article')";
$query_insertion_texte_commentaire_article = mysql_query($req_insertion_texte_commentaire_article) or die ('Erreur sur la requête SQL concernant l\'insertion des commentaires sur des articles'.mysql_error()); // Envoie une requête à un serveur MySQL
echo "Votre commentaire est posté.

";
}
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
$_POST["id_article"] doit contenir une valeur non valide (ne correspondant pas à un id_article existant en base).
Quand je fais un
echo $_POST["id_article"];
, ça m'affiche rien.


En attendant vos réponses, je continue mes recherches...
Cordialement
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Ben voilà, tu sais d'où vient ton problème.
Ce que tu peux faire, c'est dans chacun des formulaires créés tu inscris un contrôle de type input hidden avec pour valeur l'id_article. Ainsi t'y auras accès via $_POST["nom_du_input_hidden"].
Toujours pareil, quand je fais un
echo $_POST["id_article"];
, ça ne m'affiche rien.

Je te mets les deux codes PHP :

Affichage :
     echo ''.nl2br($donnees_messages['titre_article']).',

----

'.nl2br($donnees_messages['texte_article']).',

----

<small>Posté par : '.(stripslashes($donnees_messages['auteur_article']).' - '.dateLongue($donnees_messages['date_depot'])).'</small>
----,
'.nl2br($donnees_messages['id_article']).'</td>
</td>
----

,
</td>

';
echo '
Commentaires.


<form method="POST" action="../../commentaire_post.php"><textarea name="texte_commentaire_article"></textarea>
</form>

';


Code de traitement :
$texte_commentaire_article=$_POST["texte_commentaire_article"];
$id_article=$_POST["id_article"];

// Enregistrement du pseudo de l'utilisateur (variable de session) pour pouvoir l'utiliser dans la requête INSERT INTO
$user_pseudo = $_SESSION["user_pseudo"];

// Juste pour rappel : pour rajouter la clé étrangère, j'ai effectué cette requête SQL dans PHPMyAdmin : ALTER TABLE commentaires ADD FOREIGN KEY (id_article) REFERENCES articles(id_article);
// Insertion du commentaire dans la base de données

$req_insertion_texte_commentaire_article = "INSERT INTO commentaires(user_pseudo, nom_village, date_depot, texte_commentaire, id_article) VALUE ('$user_pseudo', '1', now(), '$texte_commentaire_article', '$id_article')";
$query_insertion_texte_commentaire_article = mysql_query($req_insertion_texte_commentaire_article) or die ('Erreur sur la requête SQL concernant l\'insertion des commentaires sur des articles'.mysql_error()); // Envoie une requête à un serveur MySQL
echo "Votre commentaire est posté.

";
}


En attendant vos réponses, je continue mes recherches...
Cordialement
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Ton input hidden doit être dans le formulaire (entre les balises form) ...
Merci, ça marche !
J'ai uploadé après avoir modifié les requêtes SQL les fichiers des différentes catégories. Mais maintenant, pour les articles, c'est bon c'est bien géré. Par contre pour les commentaires, ça les gère pas du tout... Quand j'insère un commentaire sur un article particulier, il s'affiche sur tous les articles...
Pour savoir, j'ai enlevé le hidden sur le input qui récupère l'identifiant de chaque article, il m'affiche bien l'id donc c'est pas ça...

En attendant vos réponses, je continue mes recherches...
Cordialement
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Je peux pas deviner l'erreur comme ça.

On peut déjà dire qu'il s'agit juste d'un pb d'affichage, vu que la FOREIGN KEY ne permet pas d'insérer un commentaire sans l'associer à un et un seul article (où alors tu aurais inséré le commentaire autant de fois que tu as d'articles).

Regarde déjà en base si ton commentaire a été associé à l'article que tu souhaitais.
Ensuite relis le code que tu as uploadé (et pas celui que tu as en local). Je sais que sur ce 2ème point je t'en demande beaucoup, mais relis bien. Avec un peu de logique tu devrais pouvoir trouver l'erreur (tu as peut-être uploadé une vieille source).

Et à l'occasion file moi un lien vers ton site que je regarde la trogne du truc.
Quand je regarde sur PHPMyAdmin la table des commentaires, il y a toujours le champs id_article en bleu. Quand je clique dessus, il me renvoie au bon article (dans la table articles).

En attendant vos réponses, je continue mes recherches...
Cordialement
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
La couleur n'est pas trop intéressante, je connais pas PHPMyAdmin, il faut regarder la valeur, qui doit correspondre à l'id_article que tu retrouves dans la table article.

Quoi qu'il en soit c'est bien un problème d'affichage, relis donc le code que t'as uploadé.
Pour information, quand je teste la requête SQL
SELECT articles.id_article, commentaires.date_depot, commentaires.texte_commentaire,commentaires.user_pseudo FROM articles, commentaires WHERE articles.id_article=commentaires.id_article
, il me renvoie
Affichage des lignes 0 - 1 ( 2 total, Traitement en 0.0013 sec)


En attendant vos réponses, je continue mes recherches...
Cordialement
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Tu n'as pas la contrainte sur l'identifiant de ton article ...
C'est aberrant que je sois obligé de te le dire.
Beh si
WHERE articles.id_article=commentaires.id_article
, non ?