Probleme d'affichage de commentaire

Petit nouveau ! | 1 Messages

05 mars 2012, 12:16

Bonjour ! :D

J'ai commencé le php il y a 1 mois et je m'entraine pour m'améliorer mais depuis 4 jour (oui 4 jours :?) je suis bloqué.
Mon but est de faire un forum mais j'ai un problème niveau commentaire, tout marche : la liste des topics, création d'un topic sauf l'affichage des commentaires en effet quand on clique sur un topic on doit avoir la possibilité de voir le topic et en dessous les commentaires, et un bouton pour faire un commentaire, le formulaire marche il n’y a pas de problème mais comme je l'ai dis, on ne voit pas les commentaires par la suite :(
Ils sont pourtant présent dans ma table commentaires !
Un ami a essayé de m'aider mais il n'a pas réussis donc j'en appel à vous :)

Bref voici mes codes concernant les commentaires :

Liste des topics : listetopic.php
<?php
// Connexion à la base de données
try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
    // Récupération des 10 derniers messages
    $reponse = $bdd->query('SELECT * FROM topic ORDER BY id DESC');
    
    // Affichage de chaque message (toutes les données sont protégées par htmlspecialchars)
    while ($donnees = $reponse->fetch())
    {
    
        echo '<h3><center><font face="arial"><strong><a href="topic.php?id='.$donnees['id'].'">' . htmlspecialchars($donnees['titre']) . '</a></strong></font><br>Par : ' . htmlspecialchars($donnees['pseudo']) . '<br></h3></centre><br>';
        echo '<p><FONT COLOR="blue" >' . htmlspecialchars($donnees['message']) . '</font></p><br />';
    
    }
    
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
    ?>
Quand on clique sur un topic on va dans la page où il y a une icone pour faire un commentaire, la liste des commentaires et le topic sélectionner

topic.php
<a href="fairecommentaire.php"><img src="répondre.gif" /></a>
<?php
try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);


    // Récupération des commentaires
    $reponse = $bdd->prepare('SELECT * FROM commentaires ORDER BY id LIMIT 0, 10 WHERE id_topic=\''.mysql_real_escape_string($_GET['id']));
    
    while ($donnees = $reponse->fetch())
    {
    ?>
    <?php echo '<h4>' . htmlspecialchars($donnees['pseudo']) . '</h4>'; ?>
    <?php echo '<p><FONT COLOR="red" >' . htmlspecialchars($donnees['commentaire']) . '</font></p>'; ?>
    
    <?php
    } // Fin de la boucle des commentaires
    $reponse->closeCursor();
    
   

}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}

?>
Donc quand on clique sur l'icone on va au formulaire :

fairecommentaire.php
<form action="fairecommentairepost.php" method="post">
<h3>Pseudo:
<input type="text" name="pseudo" maxlength="13" id="pseudo"/></h3>
<h3>Contenu:
<textarea name="commentaire" rows="8" cols="53" id="commentaire"></textarea></h3>
<center><input type="submit" value="Valider" /></center>
        <input type="hidden" name="id_topic" value="'.mysql_real_escape_string($_GET['id']).'" />
        </form>
L'enregistrement des commentaires :

fairecommentairepost.php
<?php
    // Connexion à la base de données
  try
  {
     $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
      $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
     
      // Insertion du message à l'aide d'une requête préparée
    $req = $bdd->prepare('INSERT INTO commentaires (id_topic, pseudo, commentaire) VALUES(?, ?, ?)');
    $req->execute(array(mysql_real_escape_string($_POST['id_topic']), $_POST['pseudo'], $_POST['commentaire']));
     
    // Redirection du visiteur vers la page du minichat, vers le topic ou le message a ete poster, donc redirection sur topic id=$_POST['id_topic']
      header('Location: topic.php?id='.$_POST['id_topic'].'');
  }
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}

?>
Et pour finir mes tables :
TABLE topic :
 
id - int Auto Increment - PRIMARY
titre - varchar (255)
pseudo - varchar (255)
message - text
 
TABLE commentaires :
 
id - int Auto Increment - PRIMARY
id_topic - int
pseudo - varchar (255)
commentaire - text
 
Voila voila, et aussi je n'arrive pas à afficher le topic sélectionné dans topic.php :(

Merci de votre aide ! :)

ViPHP
ViPHP | 2577 Messages

05 mars 2012, 12:32

Si les commentaires ne s'affiche pas, soit la table est mal renseignée (puisque tu les voies dans la table) avec une erreur sur l'id_topic dans la table.
Soit la requete n'est pas bonne ('SELECT * FROM commentaires ORDER BY id LIMIT 0, 10 WHERE id_topic=\''.mysql_real_escape_string($_GET['id']

A priori, on met WHERE, puis ORDER et enfin LIMIT (mais est ce une habitude de ma part ?). Autrement, il est possible que $_GET['id'] ne contienne pas ce que tu crois. Un echo de ta requete permettrai de le vérifier.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 mars 2012, 12:45

1/ d'accord avec Mazarini il y a un ordre a respecter
2/ tu n'affiche pas les erreurs
3/ tu mélange PDO et l'utilisation de l'extension mysql
4/ STOP aux requêtes préparées à tout va c'est n'importe quoi !!!!!

mysql_real_escape_string ne peux être utilisée que si une connexion au sgbd est effectuée, ce qui n'est pas ton cas (normalement puisse que tu utilise PDO) et quand je dit une connexion c'est avec mysql_connect !

Ceci m'indique que tu n'affiche surement pas les erreurs vu que rien que l'utilisation du mysql_real_escape_string DOIT fournir une erreur (fatale de mémoire).

l'équivalent de mysql_real_escape_string pour PDO est la méthode quote, attention au type des données.

les requête préparée c'est lorsque l'on a besoin d'utiliser plusieurs fois une requête (dans une boucle quoi) et que l'on arrête de me dire que c'est plus sécurisé si on met n'importe quoi dedans (avec une requête du style présenté ici) le résultat est le même !

Donc pour faire une requête select tu utilise la méthode query et la méthode quote pour protéger les données.

Il faut impérativement tester l'existence des paramètres de l'url avant de les utiliser pour cela utilise la fonction empty.

@+
Il en faut peu pour être heureux ......