Problème jointure sql

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous, Je reviens vers vous car j'ai un soucis avec une jointure (à moins que se que j'essaye de faire soit impossible).

J'ai 2 tables (avec les différentes colonnes): - forum_sujets [id | id_forum | titre | auteur] - forum_messages [id | id_forum | id_sujet | auteur | titre | message | date_publish]

Je veux lister les sujets selon l'ordre des messages postés. Ainsi un sujet avec le message le plus récent sera sur le haut de la liste (en gros comme fonctionne tous les forums).

1
2
3
4
5
6
7
8
9
<?php
$requete = $pdo->query("SELECT * FROM forum_messages INNER JOIN forum_sujets ON forum_sujets.id = forum_messages.id_sujet WHERE forum_sujets.id_forum = $id_forum GROUP BY id_sujet ORDER BY forum_messages.id DESC");

while($donnees = $requete->fetch()){
    echo '<tr>';
    echo '<td><a href="sujet.php?ids='.$donnees['id_sujet'].'&idf='.$donnees['id_forum'].'">'.$donnees['titre'].'</a></td>';
    echo '</tr>';
}
?>

Cela me liste en fonction de l'ordre des sujets et non pas de l'ordre des messages.

Merci d'avance pour votre aide.

Florian

+0 -0

Salut !

Déjà, je te conseille de ne pas mettre SELECT * mais plutôt de lister les champs que tu veux sélectionner. Ensuite, ce qu'il faut que tu fasses c'est utiliser la fonction max sur la colonne forum_messages.id et que tu tries suivant cette colonne. ça devrait marcher avec ce code SQL :

1
2
3
4
5
SELECT forum_messages.id_sujet, forum_messages.id_forum, forum_sujets.titre, MAX(forum_messages.id) AS max_id_msg 
FROM forum_messages INNER JOIN forum_sujets ON forum_sujets.id = forum_messages.id_sujet 
WHERE forum_sujets.id_forum = $id_forum 
GROUP BY id_sujet 
ORDER BY max_id_msg DESC

Je me permets d'ajouter que quitte à utiliser pdo, autant utiliser des requêtes préparées plutôt que d'insérer des variables directement dans ta requête. Ici tu as un risque d'injection SQL !

Le simple fait de faire un $id_forum = (int)$id_forum évitera une injection dans ce cas précis, du texte impossible à parser renvoie 0, exemple : (int)';DELETE FROM...' renvoie 0.
Mais attention, c'est pas une vraie solution (déjà ça marche que quand tu attends un entier), avant de mettre en production tu devrais effectivement utiliser les requêtes préparées.

Salut Guigz12,

Je te remercie pour le temps passer à me répondre et encore plus pour tes conseils. Tu as bien raison de te permettre ;-) je vais prendre en compte tes remarques afin d'améliorer mon code.

Je viens de tester avec les modifications de la requête que tu as faite et cela fonctionne parfaitement. Je te remercie.

Au -> merci pour l'astuce.

Florian

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte