Blog avec commentaires

Fermé
Nike7414 Messages postés 23 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 19 avril 2012 - 16 nov. 2010 à 12:51
Nike7414 Messages postés 23 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 19 avril 2012 - 17 nov. 2010 à 22:21
Bonjour,


Bonjour,

je suis très nul en php, donc j'ai besoin de votre aide. Je me suis aidé du TP mini chat et blog-commentaire sur ce site pour faire un blog mais j'ai un soucis... Quand je veux poster un commentaire, je n'ai pas la date ni le id_billet (le id du commentaire associé au id du billet) qui s'affiche dans mon tableau sur phpmyadmin... Comment je rajoute quoi dans mon code pour que quand je post un commentaire le id_billet et la date se rajoute aussi?
J'ai un tableau "commentaires" (pour les commentaires du blog) et un tableau "billet" (pour les messages du blog)

code php du billet avec les commentaires qui lui sont associés commentaires.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
    <head>
        <title>Mon blog</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link href="style.css" rel="stylesheet" type="text/css" /> 
    </head>
        
    <body>
        <h1>Mon super blog !</h1>
        <p><a href="index.php">Retour à la liste des billets</a></p>
 
<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

// Récupération du billet
$req = $bdd->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr FROM billets WHERE id = ?');
$req->execute(array($_GET['billet']));
$donnees = $req->fetch();
?>

<div class="news">
    <h3>
        <?php echo htmlspecialchars($donnees['titre']); ?>
        <em>le <?php echo $donnees['date_creation_fr']; ?></em>
    </h3>
    
    <p>
    <?php
    echo nl2br(htmlspecialchars($donnees['contenu']));
    ?>
    </p>
</div>

<h2>Commentaires</h2>

<?php
$req->closeCursor(); // Important : on libère le curseur pour la prochaine requête

// Récupération des commentaires
$req = $bdd->prepare('SELECT auteur, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_commentaire_fr FROM commentaires WHERE id_billet = ? ORDER BY date_commentaire');
$req->execute(array($_GET['billet']));

while ($donnees = $req->fetch())
{
?>
<p><strong><?php echo htmlspecialchars($donnees['auteur']); ?></strong> le <?php echo $donnees['date_commentaire_fr']; ?></p>
<p><?php echo nl2br(htmlspecialchars($donnees['commentaire'])); ?></p>
<?php
} // Fin de la boucle des commentaires
$req->closeCursor();
?>








<!-- Ajouter un commentaire -->


    
    <form action="commentaires_post.php" method="post">
        <p>
        <label for="auteur">Auteur</label> : <input type="text" name="auteur" id="auteur" /><br />
        <label for="commentaire">Commentaire</label> :  <input type="text" name="commentaire" id="commentaire" /><br />

        <input type="submit" value="Envoyer" />
	</p>
    </form>



</body>
</html>



et le code du fichier commentaires_post.php qui recoit les données du formulaire, enregistre et me redirige vers commentaires.php:

<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

// Insertion du commentaire à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO commentaires (auteur, commentaire) VALUES(?, ?)');
$req->execute(array($_POST['auteur'], $_POST['commentaire']));

// Redirection du visiteur vers la page du minichat
header('Location: commentaires.php');
?>




19 réponses

avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
16 nov. 2010 à 17:06
Salut.

Dans ton formulaire, ajoute un champ caché (type="hidden"), avec par exemple "id_billet" comme name, et qui aura pour valeur (value) l'id de l'article.

Ainsi, dans commentaires_post.php, tu pourras utiliser $_POST['id_billet'].
0
Nike7414 Messages postés 23 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 19 avril 2012
16 nov. 2010 à 17:12
Oui, mais l'id de l'article je ne le connais pas, donc je met "id_billet=?" ?
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
16 nov. 2010 à 17:28
Où que tu ne le connais pas ?

- Sur la page d'ajout de commentaire : $_GET['billet']
Donc tu ajoutes ce champs de le formulaire d'ajout :
<input type="hidden" name="id_billet" value="<?php echo $_GET['billet']; ?>" />


- Sur la page de traitement (commentaires_post.php), tu pourras utiliser $_POST['id_billet']
0
Nike7414 Messages postés 23 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 19 avril 2012
Modifié par Nike7414 le 16/11/2010 à 17:42
ah oki merci! mais ca ne marche toujours pas... peut etre parce que ca cherche une date de création et que ca ne trouve pas de date et heure de création... Comment je rajoute une date de création?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
16 nov. 2010 à 18:08
Tu peux utiliser la fonction SQL NOW() pour la date.
INSERT INTO commentaires (auteur, commentaire, date) VALUES(?, ?, NOW())
0
Nike7414 Messages postés 23 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 19 avril 2012
16 nov. 2010 à 18:33
Ca ne marche toujours pas... J'ai fais quelque chose de faux la dedant?

commentaires.php:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
    <head>
        <title>Mon blog</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link href="style.css" rel="stylesheet" type="text/css" /> 
    </head>
        
    <body>
        <h1>Mon super blog !</h1>
        <p><a href="index.php">Retour à la liste des billets</a></p>
 
<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

// Récupération du billet
$req = $bdd->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr FROM billets WHERE id = ?');
$req->execute(array($_GET['billet']));
$donnees = $req->fetch();
?>

<div class="news">
    <h3>
        <?php echo htmlspecialchars($donnees['titre']); ?>
        <em>le <?php echo $donnees['date_creation_fr']; ?></em>
    </h3>
    
    <p>
    <?php
    echo nl2br(htmlspecialchars($donnees['contenu']));
    ?>
    </p>
</div>

<h2>Commentaires</h2>

<?php
$req->closeCursor(); // Important : on libère le curseur pour la prochaine requête

// Récupération des commentaires
$req = $bdd->prepare('SELECT auteur, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_commentaire_fr FROM commentaires WHERE id_billet = ? ORDER BY date_commentaire');
$req->execute(array($_GET['billet']));

while ($donnees = $req->fetch())
{
?>
<p><strong><?php echo htmlspecialchars($donnees['auteur']); ?></strong> le <?php echo $donnees['date_commentaire_fr']; ?></p>
<p><?php echo nl2br(htmlspecialchars($donnees['commentaire'])); ?></p>
<?php
} // Fin de la boucle des commentaires
$req->closeCursor();
?>








<!-- Ajouter un commentaire -->


    
    <form action="commentaires_post.php" method="post">
        <p>
        <label for="auteur">Auteur</label> : <input type="text" name="auteur" id="auteur" /><br />
        <label for="commentaire">Commentaire</label> :  <input type="text" name="commentaire" id="commentaire" /><br />
		<input type="hidden" name="id_billet" value="<?php echo $_GET['billet']; ?>" />
		
        <input type="submit" value="Envoyer" />
	</p>
    </form>
	</body>
</html>



commentaires_post.php:


<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

// Insertion du commentaire à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO commentaires (auteur, commentaire, date) VALUES(?, ?, NOW())');
$req->execute(array($_POST['auteur'], $_POST['commentaire'], $_POST['id_billet'], ));

// Redirection du visiteur vers la page de commentaires.php
header('Location: commentaires.php');
?>


0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
16 nov. 2010 à 18:38
Dans le commentaires_post.php, il faut indiquer l'id de l'article auquel le commentaire est attaché (grâce à la variable provenant du formulaire).
0
Nike7414 Messages postés 23 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 19 avril 2012
16 nov. 2010 à 18:45
Je suis vraiment désolé, mais je m'y connais pas du tout en PHP, les scripts là c'est des scripts que j'ai pris d'internet de deux TP sur le siteduzero que j'essai de mixer pour créer un blog avec commentaire, mais à part ca je n'ai rien appris en PHP... Je rajoute quoi exactement? :(
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
16 nov. 2010 à 20:18
Au lieu de copier bêtement les scripts, pourquoi ne pas tout simplement apprendre le PHP ?
Tu as déjà le site ...
0
Nike7414 Messages postés 23 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 19 avril 2012
16 nov. 2010 à 20:21
Car je dois faire ce blog pour lundi (pour quelqu'un) et je n'ai pas le temps d'apprendre le PHP juste pour faire ce blog pour lundi, donc es ce que tu pourrais m'aider stp? (Comme tu es le seul qui à répondu et je n'aimerais pas abandonner ici :( )
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
16 nov. 2010 à 20:35
Tu peux utiliser un CMS comme Wordpress ou Dotclear.
Dans la requête d'insertion, dans la première parenthèse, ajoute le nom de la colonne contenant l'id de l'article, et dans la seconde, ajoute cette valeur ($_POST['id_billet']).
0
Nike7414 Messages postés 23 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 19 avril 2012
16 nov. 2010 à 21:00
Ca ne marche toujours pas...
J'ai ca dans mon tableau "commentaires" de phpmyadmin
Field:
id
id_billet
auteur
commentaire
date_commentaire

J'ai rajouté dans ma requête d'insertion de commentaires_post.php, dans la premiere parenthèse la colonne contenant l'id de l'article, donc "id_billet" et dans la seconde j'avais déjà ($_POST['id_billet']).

$req = $bdd->prepare('INSERT INTO commentaires (auteur, commentaire, date_commentaire, id_billet) VALUES(?, ?, NOW())');
$req->execute(array($_POST['auteur'], $_POST['commentaire'], $_POST['id_billet'] ));



Et ca me donne:

"Notice: Undefined index: billet in C:\wamp\www\tests\commentaires.php on line 26
le

Commentaires

Notice: Undefined index: billet in C:\wamp\www\tests\commentaires.php on line 50"

Merci pour ton conseil pour un CMS, j'essairai ca.
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
16 nov. 2010 à 21:36
$req = $bdd->prepare('INSERT INTO commentaires (auteur, commentaire, date_commentaire, id_billet) VALUES(?, ?, NOW(), ?)');
$req->execute(array($_POST['auteur'], $_POST['commentaire'], $_POST['id_billet'] ));
Il ne faut pas oublier de donner une valeur dans la seconde parenthèse de la requête SQL (je l'ai ajouté, c'est le "?" après NOW())
0
Nike7414 Messages postés 23 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 19 avril 2012
17 nov. 2010 à 10:34
J'ai essayé ca aussi mais ca ne marchais pas. Il n'y a vraiment rien à ajouter dans commentaires.php? dans les input?
0
Mahaxs Messages postés 40 Date d'inscription mercredi 30 juin 2010 Statut Membre Dernière intervention 10 novembre 2011 18
17 nov. 2010 à 11:02
Tu peux utiliser le timestamp aussi :

<input type="hidden" name="date" value="<?php echo '' . time();?>" />
pour enregistrer l'heure au moment du commentaire.


Puis pour l'afficher :

<?php $timestamp =($donnees['date']); ?>

Commentaire posté le <?php echo date('d/m/Y', $timestamp); ?> à <?php echo date('H\:i', $timestamp); ?>


Voila qui devrait regler ton problème d'affichage de l'heure..

Le time() affiche l'heure de ton serveur, il se peux que tu ai un décalage par rapport à notre fuseau horaire.
Si c'est le cas, tu compense de décalage à la récupération du timestamp en ajoutant + et le nombre de secondes par exemple pour un décalage d'une heure :

<input type="hidden" name="date" value="<?php echo '' . time()+60*60;?>" />

J'espère t'avoir aidé..
0
Nike7414 Messages postés 23 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 19 avril 2012
17 nov. 2010 à 12:23
Enfaite le problème ce n'est pas la date, mais l'id_billet. Quand je rajoute un commentaire dans le 2eme billet ca me met "1" au lieu de "2" en id_billet. dans mon tableau "commentaires" dans phpmyadmin ca me met bien la bonne date...
0
Nike7414 Messages postés 23 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 19 avril 2012
Modifié par Nike7414 le 17/11/2010 à 15:11
ca c'est mon index.php. On voit les 5 derniers billets. Quand on clique sur "Commentaires" ca affiche le billet avec ses commentaires.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
    <head>
        <title>Mon blog</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link href="style.css" rel="stylesheet" type="text/css" /> 
    </head>
        
    <body>
        <h1>Mon super blog !</h1>
        <p>Derniers billets du blog :</p>
 
<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

// On récupère les 5 derniers billets
$req = $bdd->query('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr FROM billets ORDER BY date_creation DESC LIMIT 0, 5');

while ($donnees = $req->fetch())
{
?>
<div class="news">
    <h3>
        <?php echo htmlspecialchars($donnees['titre']); ?>
        <em>le <?php echo $donnees['date_creation_fr']; ?></em>
    </h3>
    
    <p>
    <?php
    // On affiche le contenu du billet
    echo nl2br(htmlspecialchars($donnees['contenu']));
    ?>
    <br />
    <em><a href="commentaires.php?billet=<?php echo $donnees['id']; ?>">Commentaires</a></em>
    </p>
</div>
<?php
} // Fin de la boucle des billets
$req->closeCursor();
?>
</body>
</html>
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
17 nov. 2010 à 17:30
@Mahaxs: il peut récupérer le timestamp directement sur le fichier de traitement, inutile de le placer dans un champ caché. Pour les problèmes de fuseaux, la solution la plus propre est d'indiquer le timezone :
https://www.php.net/manual/fr/timezones.php

En regardant le code source, est-ce que tu vois le bon ID dans le champ caché ? (celui indiqué dans l'URL).
0
Nike7414 Messages postés 23 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 19 avril 2012
17 nov. 2010 à 22:21
Non, il n'y a pas de ID dans le champs caché:

<input type="hidden" name="id_billet" value="<?php echo $_GET['billet']; ?>" />


Plus haut j'ai posté les 3 pages de mon code source.
Vous avez pas msn par hazard? ca serai plus facile pour régler le problème.
0