[RESOLU] Probléme MYSQL sur la création d'un forum

Eléphanteau du PHP | 12 Messages

23 août 2015, 21:20

Bonsoir,

Je débute activement dans la création d'un site dynamique.

Je séche sur deux parties de mon site... Celle concernant le tchat (actualisation non automatique) et le script concernant le forum.

En effet, pour ce qui est du forum, je suis dépassé sur l'utilisation de mysql...

Je rencontre trois problémes...
Le premier est que lors de ma requéte sql pour l'affichage du sommaire et donc la liste des postes je me trouve avec deux entrées mysql similaire ("post_id" dans la table forum_post et la table forum_rep) du coup d'après moi il faut que j'ai recours aux alias mais après plusieurs tentatives rien n'y fait.
Le second est que je voudrais afficher sur chaque ligne les infos concernant le post mais aussi celles concernant la dernière réponse associée.
Enfin, je voudrais trier l'affichage des posts (ici uniquement ceux qualifiés de topic) en fonction de la date de leurs dernières réponses ou si il n'y en a pas eu de prendre par défaut la date de publication du post lui méme...

Le code :

Code : Tout sélectionner

$query=$db->prepare('SELECT * FROM forum_post LEFT JOIN membres ON forum_post.post_createur = membres.membre_id LEFT JOIN forum_rep ON forum_rep.post_id = forum_post.post_id WHERE cat_id = :cat AND post_topic = :post_topic'); $query->bindValue(':cat',$cat, PDO::PARAM_STR); $query->bindValue(':post_topic',1, PDO::PARAM_STR); $query->execute(); /* $query=$db->prepare('SELECT * FROM forum_rep LEFT JOIN membres ON forum_rep.rep_createur = membres.membre_id WHERE post_id = :post_id ORDER BY rep_id DESC LIMIT 0, 1'); $query->bindValue(':post_id',$data['post_id'], PDO::PARAM_STR); $query->execute(); $data2 = $query->fetch(); */ echo '<center><a href="index.php?page=forum&action=post_form&cat='.$cat.'"><button class="actualiser">Nouveau</button></a></center><br />'; if ($query->rowCount()<1) { echo''; } else { while ($data = $query->fetch()) { echo'<table class="fo_liste"> <tr> <td width="33%"> <a href="index.php?page=forum&cat='.$cat.'&post='.$data['post_id'].'">'.$data['post_titre'].'</a><br /> Par '.$data['membre_pseudo'].' le '.date('d/m/Y à H:i',$data['post_time']).' </td> <td width="33%"> '.count($data['rep_id']).' message(s) </td>'; /* echo'<td width="33%"> <p align="left">Dernier message par '.$data2['membre_pseudo'].'<br /> le '.date('d/m/Y à H:i',$data2['rep_time']).'</p> </td> */ echo'</table>'; } }
Je sais que ça fait beaucoup mais là je galère sévère ! :cry:

Merci.

ViPHP
ViPHP | 928 Messages

24 août 2015, 12:35

Il faudrait que tu affiches la structure des tables concernées, et ce que tu souhaites récupérer exactement.

Eléphanteau du PHP | 12 Messages

24 août 2015, 16:44

OK. alors voici les tables concernées :
- forum_cat : cat_id, cat_nom, cat_access
- forum_post : post_id, cat_id, post_titre, post_text, post_createur, post_time, post_topic, post_block
- forum_rep : rep_id, post_id, rep_createur, rep_text, rep_time.

J'ai déjà mi en place la partie "admin" du forum. Le systéme pour poster et répondre fonctionne ainsi que la partie pour visualiser le post ainsi que les réponses qui le concernent. Maintenant tout les problémes que je rencontre sont en lien avec l'affichage du sommaire (liste des postes) par catégorie.

En effet, le post_id est inclue dans la table forum_rep et forum_post ce qui fait qu'à l'affichage les posts sont listés mais les réponses le sont aussi...
J'ai toujours pas trouvé de solution pour pouvoir visualiser (toujours sur la liste des postes) les infos concernant la dernière réponse liées au post.
Enfin, je ne vois pas comment faire pour trier les posts du plus au moins récents (en prenant aussi en compte la date de la réponse).

Voilà, j’espère avoir été plus clair. Pour le code il est dispo dans mon post.

Mammouth du PHP | 2703 Messages

24 août 2015, 17:12

si j'ai bien compris ta structure, avec un 1er message d'une discussion qui n'est pas dans la même table que les suivants, la structure est mauvaise.
la bonne structure, c'est une table sujet et une table message.

Eléphanteau du PHP | 12 Messages

24 août 2015, 21:17

Je comprends pas ce que tu veux dire...

Eléphanteau du PHP | 12 Messages

25 août 2015, 18:54

J'ai bien avancé !

Code : Tout sélectionner

$query=$db->prepare('SELECT forum_post.post_id, cat_id, post_titre, post_createur, post_time, last_rep, post_topic, post_block, forum_rep.rep_id, rep_createur, rep_time, Mb.membre_pseudo AS membre_pseudo_post_createur, Ma.membre_pseudo AS membre_pseudo_rep_createur FROM forum_post LEFT JOIN membres Mb ON Mb.membre_id = forum_post.post_createur LEFT JOIN forum_rep ON forum_rep.rep_id = forum_post.last_rep LEFT JOIN membres Ma ON Ma.membre_id = forum_rep.rep_createur WHERE forum_post.cat_id = :cat AND forum_post.post_topic = :post_topic'); $query->bindValue(':cat',$cat, PDO::PARAM_STR); $query->bindValue(':post_topic',1, PDO::PARAM_STR); $query->execute(); echo '<center><a href="index.php?page=forum&action=post_form&cat='.$cat.'"><button class="actualiser">Nouveau</button></a></center><br />'; if ($query->rowCount()<1) { echo'PROUT'; } else { while ($data = $query->fetch()) { echo'<table class="fo_liste"> <tr> <td width="33%"> <a href="index.php?page=forum&cat='.$cat.'&post='.$data['post_id'].'">'.$data['post_titre'].'</a><br /> Par '.$data['membre_pseudo_post_createur'].' le '.date('d/m/Y à H:i',$data['post_time']).' </td> <td width="33%"> '.count($data['rep_id']).' message(s) </td>'; echo'<td width="33%"> <p align="left">Dernier message par '.$data['membre_pseudo_rep_createur'].'<br /> le '.date('d/m/Y à H:i',$data['rep_time']).'</p> </td> </table>'; } }
Il me reste deux problèmes... :oops:

Le premier : mon "count" pour savoir combien de réponses ont été postées ne fonctionne pas. Lors de ma requête je fais un JOIN sur rep_id pour avoir les infos concernant la dernière réponse... Du coup quand je compte le nombre de rep_id il me renvoie le mauvais compte de rep_id...

Le deuxième : Je comptais trier l'ordre des posts grâce à la colonne de la table "last_rep" mais comment je peux prendre en compte les posts sans réponses ?

Merci pour votre soutien ! :priere:

Mammouth du PHP | 737 Messages

27 août 2015, 00:37

salut,

le count va afficher le résultat des lignes concernées et non le count total des messages, on est d'accord ? pourquoi ne pas intégrer le count dans un alias dans ta requête ?

pour les posts sans réponses, tu devrais utiliser à vue de nez une jointure externe :)

Mega
;)
Dyslexics are teople poo

Eléphanteau du PHP | 12 Messages

27 août 2015, 22:23

Merci pour ton aide Megadeth sauf que je suis de nouveau dans une impasse... Tu peux me dire ce qui ne va pas avec ce code :

Code : Tout sélectionner

$query=$db->prepare('SELECT forum_post.post_id, cat_id, post_titre, post_createur, post_time, last_rep, post_topic, post_block, forum_rep.rep_id, rep_createur, rep_time, (SELECT COUNT(forum_rep.rep_id) WHERE forum_rep.post_id = forum_post.post_id) AS nbr_rep, Mb.membre_pseudo AS membre_pseudo_post_createur, Ma.membre_pseudo AS membre_pseudo_rep_createur FROM forum_post LEFT JOIN membres Mb ON Mb.membre_id = forum_post.post_createur LEFT JOIN forum_rep ON forum_rep.rep_id = forum_post.last_rep LEFT JOIN membres Ma ON Ma.membre_id = forum_rep.rep_createur WHERE forum_post.cat_id = :cat AND forum_post.post_topic = :post_topic'); $query->bindValue(':cat',$cat, PDO::PARAM_STR); $query->bindValue(':post_topic',1, PDO::PARAM_STR); $query->execute();
Merci.

Eléphanteau du PHP | 12 Messages

28 août 2015, 18:45

J'avais juste oublié le FROM... :oops:

Je m'attaque à la jointure externe ! :evil:

Eléphant du PHP | 51 Messages

03 sept. 2015, 02:22

Ma réponse est hors sujet, mais... Pourquoi ne pas utiliser un script fiable tout prêt comme PHPBB ?

Eléphanteau du PHP | 12 Messages

13 sept. 2015, 18:13

D'abord pour le plaisir de le faire moi même ( :oops: ) et aussi pour une meilleur intégration au reste du site...

Eléphanteau du PHP | 12 Messages

13 sept. 2015, 18:20

D’ailleurs après avoir résolu tout les problèmes que je vous ai décrit j'en suis rendu à un nouvel obstacle...

Je dois afficher, pour la liste des postes, toutes les entrées de forum_post sauf que j'ai une distinction : topic ou pas.

Du coup je voulais savoir comment faire une pagination intégrant les topics et les non topics.

Est ce que je peux afficher par une même requête SQL d'abord les topics puis les non topics ?
Ou est ce que je dois plutôt jouer avec le "LIMIT" ?

Note : les topics et non topics sont distingués par post_topic (1 = topic et 0 = non topic).

Code : Tout sélectionner

$query=$db->prepare('SELECT forum_post.*, forum_rep.rep_time, (SELECT COUNT(forum_rep.rep_id) FROM forum_rep WHERE forum_rep.post_id = forum_post.post_id) AS nbr_rep, Mb.membre_pseudo AS membre_pseudo_post_createur, Ma.membre_pseudo AS membre_pseudo_rep_createur FROM forum_post LEFT JOIN membres Mb ON Mb.membre_id = forum_post.post_createur LEFT JOIN forum_rep ON forum_rep.rep_id = forum_post.last_rep LEFT JOIN membres Ma ON Ma.membre_id = forum_rep.rep_createur WHERE forum_post.cat_id = :cat AND forum_post.post_topic = :post_topic ORDER BY forum_post.last_time DESC'); $query->bindValue(':cat',$cat, PDO::PARAM_STR); $query->bindValue(':post_topic',1, PDO::PARAM_STR); $query->execute(); if ($query->rowCount()<1) { echo''; } else { while ($data = $query->fetch()) { echo'<table class="fo_liste"> <tr> <td width="33%"> '.$data['post_id'].' <a href="index.php?page=forum&cat='.$cat.'&post='.$data['post_id'].'">'.$data['post_titre'].'</a><br /> Par '.$data['membre_pseudo_post_createur'].' le '.date('d/m/Y à H:i',$data['post_time']).' </td> <td width="33%"> <center>'.$data['nbr_rep'].' message(s)</center> </td>'; echo'<td width="33%">'; if(empty($data['rep_time'])) { echo ''; } else { echo'<p align="left">Dernier message par '.$data['membre_pseudo_rep_createur'].'<br /> le '.date('d/m/Y à H:i',$data['rep_time']).'</p>'; } echo'</td> </table>'; } }

Eléphanteau du PHP | 12 Messages

13 sept. 2015, 18:24

Et j'ai oublié de montrer la requête qui suit pour les "non topics".

C'est la même à la suite sauf que je choisis :post_topic étant à 0.

Merci.

Eléphanteau du PHP | 12 Messages

16 sept. 2015, 14:47

Un "ORDER BY forum_post.post_topic DESC, forum_post.last_time DESC" a résolu le problème.

=D>