compté le nombre de réponses dans un forum

Mammouth du PHP | 620 Messages

02 juin 2010, 13:21

Bonjour,
au meme titre que sur ce forum je voudrai que l'orsque l'on est sur la page avec tout les sujets postés sur le forum affiché le nombre de réponses.

j'ai donc fait un petit bou de code avec jointure de la table reponse et sujet afin de calculer les réponses postés. Le soucis et que au lieu de compter et d'afficher les réponses par sujet le total qui ressort est le total de toutes les réponse du forum.
	// on affiche le nombre de réponse de ce sujet
	// on prépare notre requête
	$sqlrep = 'SELECT * FROM forum_sujets INNER JOIN forum_reponses WHERE forum_reponses.correspondance_sujet = forum_sujets.id';

	// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
	$reqrep = mysql_query($sqlrep);
	
	//on conte le nombre de messages :
	$nb_rep = mysql_num_rows ($reqrep);
	if ($nb_rep == 0) {
	echo '0 réponse';
	}
	else {
	echo  $nb_rep. 'réponses';
		}
mes tables sql sont les suivantes :
CREATE TABLE `forum_sujets` (
  `id` int(6) NOT NULL auto_increment,
  `auteur` varchar(30) collate latin1_german2_ci NOT NULL,
  `titre` text collate latin1_german2_ci NOT NULL,
  `date_derniere_reponse` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
);

CREATE TABLE `forum_reponses` (
  `id` int(6) NOT NULL auto_increment,
  `auteur` varchar(30) collate latin1_german2_ci NOT NULL,
  `message` text collate latin1_german2_ci NOT NULL,
  `date_reponse` datetime NOT NULL default '0000-00-00 00:00:00',
  `correspondance_sujet` int(6) NOT NULL,
  PRIMARY KEY  (`id`)
);

ViPHP
ViPHP | 5462 Messages

02 juin 2010, 13:30

essaye comme ca, mais fait d'hab ta requête dans phpmyadmin
SELECT sujet.*, COUNT(forum_reponses.id) AS num_ reponses
FROM forum_sujets AS sujet 
LEFT JOIN forum_reponses WHERE forum_reponses.correspondance_sujet = forum_sujets.id

Mammouth du PHP | 620 Messages

02 juin 2010, 13:37

après test avec ta requete, le nombre de réponses est à chaque fois de 0... :cry:
Modifié en dernier par fabrice88250 le 02 juin 2010, 14:52, modifié 1 fois.

Mammouth du PHP | 620 Messages

02 juin 2010, 14:15

Bon alors comme je galère et qu'après plusieurs heures d'essais je n'y arrive toujours pas je vous met le code complet. Peut etre trouverez vous ou est mon probléme ?
<?php
function switchcolor()
 { 
   static $col;
   $couleur1 = "#F9D893";
   $couleur2 = "#F6C664";

    if ($col == $couleur1)
     {
       $col = $couleur2;
     }
    else
     {
       $col = $couleur1;
     }
    return $col; 
 }

$req = mysql_query("SELECT forum_sujets.id, forum_sujets.auteur, forum_sujets.titre, forum_sujets.date_derniere_reponse, forum_reponses.message, forum_reponses.correspondance_sujet FROM forum_sujets INNER JOIN forum_reponses ON (forum_reponses.correspondance_sujet = forum_sujets.id) group by forum_sujets.id order by forum_sujets.date_derniere_reponse desc,forum_reponses.date_reponse desc"); 

//$req = mysql_query("SELECT id, auteur, titre, date_derniere_reponse FROM forum_sujets ORDER BY date_derniere_reponse DESC"); 
// on compte le nombre de sujets du forum
$nb_sujets = mysql_num_rows ($req);
if ($nb_sujets == 0) {
	echo 'Aucun sujet';
}
else {
	echo '<h3>Nombre total de sujet postés sur le Forum :'.$nb_sujets.'</h3>';
	echo '<table width="780" border="0" cellpadding="5" cellspacing="0">
    <tr>
        <td>
        <span class="orange">Titre du sujet</span>
        </td>
        <td>
        <div align="center"><span class="orange">Auteur</span></div>
        </td>
		<td>
        <div align="center"><span class="orange">Vues</span></div>
        </td>        
		<td>
        <div align="center"><span class="orange">Réponses</span></div>
        </td>
        <td>
        <div align="center"><span class="orange">Date dernière réponse</span></div>
        </td>        
    </tr>';

	// on va scanner tous les tuples un par un
	while ($data = mysql_fetch_array($req)) {

	// on décompose la date
	sscanf($data['date_derniere_reponse'], "%4s-%2s-%2s %2s:%2s:%2s", $annee, $mois, $jour, $heure, $minute, $seconde);

	// on affiche les résultats
?>
    <?php echo "<tr bgcolor=\""; echo switchcolor(); echo "\">" ?>
    <?php $Id[]=$data['id']; ?>
<?php
	echo '<td>';
	// on affiche le titre du sujet, et sur ce sujet, on insère le lien qui nous permettra de lire les différentes réponses de ce sujet
	echo '<a href="./lire_sujet.php?id_sujet_a_lire=' , $data['id'] , '">' , $data['titre'] , '</a>';
	//aperçu du message de l'internaute
	echo '<p>'.substr($data['message'], 0, 80). '...</p>';

	echo '</td><td><div align="center">';
	// on affiche le nom de l'auteur de sujet
	echo $data['auteur'];
	echo '</div></td><td><div align="center">';

	// on affiche le nombre de fois ou le sujet a été vue
	echo 'vue';
	
	echo '</div></td><td><div align="center">';

	// on affiche le nombre de réponse de ce sujet
	$sqlrep = 'SELECT sujet.*, COUNT(forum_reponses.id) AS num_ reponses FROM forum_sujets AS sujet LEFT JOIN forum_reponses WHERE forum_reponses.correspondance_sujet = forum_sujets.id';
	$reqrep = mysql_query($sqlrep);
	//on conte le nombre de reponses :
	$nb_rep = mysql_num_rows ($reqrep);
	if ($nb_rep == 0) {
	echo '0 réponse';
	}
	else {
	echo  $nb_rep. ' réponses';
		}
	
	echo '</div></td><td><div align="center">';

	// on affiche la date de la dernière réponse de ce sujet
	echo $jour , '-' , $mois , '-' , $annee , ' ' , $heure , ':' , $minute;
	}

	echo '</div></td></tr></table>';

}

// on libère l'espace mémoire alloué pour cette requête
mysql_free_result ($req);
// on ferme la connexion à la base de données.
mysql_close ();
?>

ViPHP
ViPHP | 5462 Messages

02 juin 2010, 16:36

ta pas une page visible en ligne ?

Mammouth du PHP | 620 Messages

02 juin 2010, 16:51

non désolé je suis en local. mais si tu veus un aperçu
aperçu
là tu as la page d'accueil et on voit bien que le nombre de réponses est le meme pour tout les sujets au lieu d'avoir un nombre different

ViPHP
ViPHP | 5462 Messages

02 juin 2010, 17:00

ta pas rajouter le COUNT dans ta requete

Mammouth du PHP | 620 Messages

02 juin 2010, 17:05

en fait en mettant ta requete avec count :
SELECT sujet.*, COUNT(forum_reponses.id) AS num_ reponses
FROM forum_sujets AS sujet 
LEFT JOIN forum_reponses WHERE forum_reponses.correspondance_sujet = forum_sujets.id
au lieu d'avoir un resultat 8 réponse comme acctuellemnt j'ai 0 réponse.

ViPHP
ViPHP | 5462 Messages

02 juin 2010, 17:29

ta essayes dans phpmyadmin ?

Mammouth du PHP | 620 Messages

02 juin 2010, 17:40

quand je l'essai dans phpmyadmin j'ai un message d'erreur :
#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 'reponses FROM forum_sujets AS sujet LEFT JOIN forum_reponses WHERE forum_repon' at line 1
dans la requete il y a un espace entre num_ et reponse.
en suppriment l'espace j'ai cette erreur :
#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 'WHERE forum_reponses . correspondance_sujet = forum_sujets . id LIMIT 0, 30' at line 1
de plus je ne sais pas si sa peut t'aider mais dans la réecriture de la requete par phpmyadmin il met en rouge la partie . * , COUNT(

ViPHP
ViPHP | 5462 Messages

02 juin 2010, 17:46

et comme ca
SELECT *, COUNT(forum_reponses.id) AS num_ reponses
FROM forum_sujets
LEFT JOIN forum_reponses ON forum_reponses.correspondance_sujet = forum_sujets.id

Mammouth du PHP | 620 Messages

02 juin 2010, 17:50

idem
#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 'reponses FROM forum_sujets LEFT JOIN forum_reponses ON forum_reponses . corres' at line 1
l'espace entre le num_ et reponse c'est exprès ?
Modifié en dernier par fabrice88250 le 02 juin 2010, 18:00, modifié 2 fois.

ViPHP
ViPHP | 5462 Messages

02 juin 2010, 17:59

non y'en a pas c'est une erreur

Mammouth du PHP | 620 Messages

02 juin 2010, 18:01

ok bon de tout facon sa resoud pas le probleme qui est toujours le même.

depuis ma page lire_sujet j'arrive pourtant bien a compté les réponses mais sur cette page pas besoin de jointure. Je pense que le probleme pourrait provenir de la jointure mais je suis incapable de dire pourquoi.
voilà le code sur ma page lire_sujet qui fonctionne.
	<?php
	// on prépare notre requête
	$sql = 'SELECT auteur, message, date_reponse FROM forum_reponses WHERE correspondance_sujet="'.$_GET['id_sujet_a_lire'].'" ORDER BY date_reponse ASC';
	// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
	$req = mysql_query($sql);
	//on conte le nombre de reponses:
	$nb_sujets = mysql_num_rows ($req);
	
if ($nb_sujets == 0) 
{
	echo 'Aucun sujet';
}
else {
//on soustrait au nombre total le message d'origine qui n'est pas un réponse
$nb_sujets = $nb_sujets-1;
echo '<h2><span class="orange">Nombre de réponse(s) pour ce sujet : </span><span class="bleu">' .$nb_sujets.'</span></h2>';
}
?>

ViPHP
ViPHP | 5462 Messages

02 juin 2010, 18:05

ok bon de tout facon sa resoud pas le probleme qui est toujours le même.
non, faux mettre un COUNT dans ta requête ca marchera jamais sinon, c'est COUNT + GROUP BY