bonjour a tous
je viens de trouver un super tuto pour relaiser une page ou les utlisateurs peuvent ecrire des commentaires
il fonctionne a merveille

Ce que je fais

mais je souhaiterais avoir une moderation sur les commentaires
donc que je puisse les lire avant leurs publications
qui a une idee comment je pourrais m y prendre
merci de l aide

<?php
// Partie connexion à la BDD et initialisation
$mysqli = new Mysqli('localhost', 'root', '', 'dialogue');
$contenu = '';
//---------------------------------------------------------------------------------------------
// Partie enregistrement
if($_POST)
{
    $_POST['pseudo'] = addslashes($_POST['pseudo']);
    $_POST['message'] = addslashes($_POST['message']);
    if(!empty($_POST['pseudo']) && !empty($_POST['message']))
    {
        $mysqli->query("INSERT INTO commentaire (pseudo, message, date_enregistrement) VALUES ('$_POST[pseudo]', '$_POST[message]', NOW())") OR DIE ($mysqli->error);
        $contenu .= '<div class="validation">Votre message a bien été enregistré.</div>';
    }
    else
    {
        $contenu .= '<div class="erreur">Afin de déposer un commentaire, veuillez svp remplir tous les champs du formulaire.</div>';
    }
}
//---------------------------------------------------------------------------------------------
// Partie affichage des commentaires
$résultat = $mysqli->query("SELECT pseudo, message, DATE_FORMAT(date_enregistrement, '%d/%m/%Y') AS datefr, DATE_FORMAT(date_enregistrement, '%H:%i:%s') AS heurefr FROM commentaire ORDER BY date_enregistrement DESC");    
$contenu .= '<h2>'  . $résultat->num_rows . ' commentaire(s)';
while($commentaire = $résultat->fetch_assoc())
{
    $contenu .= '<div class="message">';
        $contenu .= '<div class="titre">Par: ' . $commentaire['pseudo'] . ', le ' . $commentaire['datefr'] . ' à ' . $commentaire['heurefr'] . '</div>';
        $contenu .= '<div class="contenu">' . $commentaire['message'] . '</div>';
    $contenu .= '</div>';
}
//---------------------------------------------------------------------------------------------
// Partie formulaire d'envoi de commentaire
?>

<!Doctype html>
<html>
    <head>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <div class="commentaire"><?php echo $contenu; ?></div>
        <form method="post" action="">
            <label for="pseudo">Pseudo</label><br>
            <input type="text" id="pseudo" name="pseudo" maxlength="20" pattern="[a-zA-Z0-9.-_]+" title="caractère autorisés : a-zA-Z0-9.-_"><br>

            <label for="message">Message</label><br>
            <textarea id="message" name="message" cols="50" rows="7"></textarea><br>

            <input type="submit" value="Envoyer le message">
        </form>
    </body>   
</html>

Ce que je veux

avoir le cotrole sur les commentaire avant la publication

Ce que j'obtiens

55 réponses


phenix
Réponse acceptée

il faut que tu fasses

<?php

$mysqli = new Mysqli('localhost', 'root', '', 'dialogue');
$contenu = '';
if($_POST)
{
    $_POST['pseudo'] = addslashes($_POST['pseudo']);
    $_POST['message'] = addslashes($_POST['message']);
    if(!empty($_POST['pseudo']) && !empty($_POST['message']))
    {
        $mysqli->query("INSERT INTO commentaire (pseudo, message, date_enregistrement) VALUES ('$_POST[pseudo]', '$_POST[message]', NOW())") OR DIE ($mysqli->error);
        $contenu .= '<div class="validation">Votre message a bien été enregistré.</div>';
    }
    else
    {
        $contenu .= '<div class="erreur">Afin de déposer un commentaire, veuillez svp remplir tous les champs du formulaire.</div>';
    }
}
$resultat = $mysqli->query("SELECT pseudo, message, DATE_FORMAT(date_enregistrement, '%d/%m/%Y') AS datefr, DATE_FORMAT(date_enregistrement, '%H:%i:%s') AS heurefr FROM commentaire WHERE valider = 1 ORDER BY date_enregistrement DESC");    
$contenu .= '<h2>'  . $resultat->num_rows . ' commentaire(s)';
if($commentaire !== null)
{
while($commentaire = $resultat->fetch_assoc())
{
        $contenu .= '<div class="message">';
            $contenu .= "<div class=\"titre\">Par: " . $commentaire['pseudo'] . ', le ' . $commentaire['datefr'] . " à " .      $commentaire['heurefr'] . "</div>";
            $contenu .= '<div class="contenu">' . $commentaire['message'] . '</div>';
        $contenu .= '</div>';
    }
}
flexi2202
Auteur
Réponse acceptée

desole du retard mais j ai fini par trouver un autre tuto

Bonjour flexi 2202,
Je pense que tu pourrais peut-être rajouter une colonne dans ta table ou il y a tes commentaires.
Une colonne qui retient si le commentaire a été validé ou non.

Bonjour,
tu rajoutes un champ "valider" par défault sur false dans la table des commentaires ensuite dans la partie affichage tu fais un where valider = true

bonjour
merci pour l aide c est gentil
donc je vais dans ma base de donnee ajoute ce champ "valider" mais dans la colonne "valeur par defaut "je ne vois pas false ?je laisse en "aucun"
dans la partie affichage je mets un where valider = true
comme ceci

// Partie affichage des commentaires
$résultat = $mysqli->query("SELECT pseudo, message, DATE_FORMAT(date_enregistrement, '%d/%m/%Y') AS datefr, DATE_FORMAT(date_enregistrement, '%H:%i:%s') AS heurefr FROM commentaire ORDER BY date_enregistrement DESC");    
$contenu .= '<h2>'  . $résultat->num_rows . ' commentaire(s)';
while($commentaire = $résultat->fetch_assoc())
{
    $contenu .= '<div class="message">';
        $contenu .= '<div class="titre">Par: ' . $commentaire['pseudo'] . ', le ' . $commentaire['datefr'] . ' à ' . $commentaire['heurefr'] . '</div>';
        $contenu .= '<div class="contenu">' . $commentaire['message'] . '</div>';
    $contenu .= '</div>';
    where valider = true
}

De rien.

Tu rajoutes le champ valider dans ta table commentaire, les booléens c'est soit 1 ou 0 dans la table donc par défault c'est 0 ensuite lors de ta requête sql pour récupérer tes commentaires tu rajoutes le where `$mysqli->query("SELECT pseudo, message, DATE_FORMAT(date_enregistrement, '%d/%m/%Y') AS datefr, DATE_FORMAT(date_enregistrement, '%H:%i:%s') AS heurefr FROM commentaire WHERE valider = 1 ORDER BY date_enregistrement DESC");

Flexi, ca fonctionne ? Parce qu'avec ce que tu viens d'envoyer, j'ai un doute :P

merci de votre aide a tous c est genial
mais j ai une erreur
apres avoir modifie lecode de cette maniere

// Partie affichage des commentaires
$résultat = `$mysqli->query("SELECT pseudo, message, DATE_FORMAT(date_enregistrement, '%d/%m/%Y') AS datefr, DATE_FORMAT(date_enregistrement, '%H:%i:%s') AS heurefr FROM commentaire WHERE valider = 1 ORDER BY date_enregistrement DESC");    
$contenu .= '<h2>'  . $résultat->num_rows . ' commentaire(s)';

while($commentaire = $résultat->fetch_assoc())
{
    $contenu .= '<div class="message">';
        $contenu .= '<div class="titre">Par: ' . $commentaire['pseudo'] . ', le ' . $commentaire['datefr'] . ' à ' . $commentaire['heurefr'] . '</div>';
        $contenu .= '<div class="contenu">' . $commentaire['message'] . '</div>';
    $contenu .= '</div>';
}

j ai cette belle erreur

Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\wamp64\www\dialogue\dialogue.php on line 32

Quelle est ta ligne 32 ???

   $contenu .= '<div class="titre">Par: ' . $commentaire['pseudo'] . ', le ' . $commentaire['datefr'] . ' à ' . $commentaire['heurefr'] . '</div>';

Il faudrait aussi fermer ta balise h2 $contenu .= '<h2>' . $résultat->num_rows . ' commentaire(s)</h2>';

merci pour l aide
dans la table des donnees ?
j ai laisse sur "aucun " pour le champ "valider"
donc pour le champ valider j ai fait ceci
4 valider int(11) Non Aucun(e)

Met la valeur par défaut à 0.
Comme ça aucun ne sera null et tu pourras les récupérer plus facilement pour les valider.

j ai donc mis la table en
tel que defini a 0
mais j ai toujours l erreur

Pourquoi tu n'as pas mis une condition dans ton while ???

car le code que j ai trouve et qui est fonctionnel n en avais pas
merci

curvata bien vu pour la balise merci

La méthode fetch assoc sort de quelle class ???
Moi j'utilise plutot pdo.

le code que j ai trouve est ecrit en mysqli
je l ai poste en debut de ce post
mais bon que cela soit fait en PDO ou en mysqli
ce que je recherche c est juste une methode pour qu un visiteur puisse poster des commentaires , mais que je puisse controler avant leurs mise en ligne

De Mysqli mais je pense que le problème c'est les guillemets

Ce que tu as mis en place te permettra de faire la modération des commentaires maintenant il y a une petite erreur de syntaxe.

ah ok , faut juste trouver cette erreur , mais elle bien cachee ...

fait des var_dumps sur toutes tes variables a différents endroit de ton script, tu verras peut etre pourquoi ça plante

merci pour l aide
j en ai mis deux de cette facon

 <?php
// Partie connexion à la BDD et initialisation
$mysqli = new Mysqli('localhost', 'root', '', 'dialogue');
$contenu = '';
//---------------------------------------------------------------------------------------------
// Partie enregistrement
if($_POST)
{
    $_POST['pseudo'] = addslashes($_POST['pseudo']);
    $_POST['message'] = addslashes($_POST['message']);
    if(!empty($_POST['pseudo']) && !empty($_POST['message']))
    {
        $mysqli->query("INSERT INTO commentaire (pseudo, message, date_enregistrement) VALUES ('$_POST[pseudo]', '$_POST[message]', NOW())") OR DIE ($mysqli->error);
        $contenu .= '<div class="validation">Votre message a bien été enregistré.</div>';
    }
    else
    {
        $contenu .= '<div class="erreur">Afin de déposer un commentaire, veuillez svp remplir tous les champs du formulaire.</div>';
    }
}
echo var_dump($contenu) . "<br>";
echo var_dump($commentaire) . "<br>";
//---------------------------------------------------------------------------------------------
// Partie affichage des commentaires
$résultat = `$mysqli->query("SELECT pseudo, message, DATE_FORMAT(date_enregistrement, '%d/%m/%Y') AS datefr, DATE_FORMAT(date_enregistrement, '%H:%i:%s') AS heurefr FROM commentaire WHERE valider = 1 ORDER BY date_enregistrement DESC");    
$contenu .= '<h2>'  . $résultat->num_rows . ' commentaire(s)';

echo var_dump($contenu) . "<br>";
echo var_dump($commentaire) . "<br>";

while($commentaire = $résultat->fetch_assoc())
{
    $contenu .= '<div class="message">';
        $contenu .= '<div class="titre">Par: ' . $commentaire['pseudo'] . ', le ' . $commentaire['datefr'] . ' à ' . $commentaire['heurefr'] . '</div>';
        $contenu .= '<div class="contenu">' . $commentaire['message'] . '</div>';
    $contenu .= '</div>';
}
//---------------------------------------------------------------------------------------------
// Partie formulaire d'envoi de commentaire
?>

mais toujours l erreur

Et si tu met un die() après tes var_dumps, ça donne quoi ???

j ai donc modifie comme ceci

echo var_dump($contenu) . "<br>"OR DIE ($mysqli->error);
echo var_dump($commentaire) . "<br>"OR DIE ($mysqli->error);
mais toujours pareil

Et un die juste après cette ligne : $contenu .= '<h2>' . $résultat->num_rows . ' commentaire(s)';

rien non plus

toujours l'erreur ???

oui toujours

alors que code d origine sans aucune modification fonctionne correctement ...

Puis il ne faut pas mettre d'accent sur les variables. $résultat doit etre $resultat

ça doit etre ca

merci pour ce soutien
mais j ai toujours la meme erreur

a cette ligne

    $contenu .= '<div class="titre">Par: ' . $commentaire['pseudo'] . ', le ' . $commentaire['datefr'] . ' à ' . $commentaire['heurefr'] . '</div>';

Est ce que tu connais exactement le contenu de ta variable $commentaire.

connaitre le contenu de ma variable $commentaire ?
c est a dire ?

c'est un tableau qui contient quoi (ses valeurs)

Après ta requête tu fais $commentaire = $résultat->fetch_assoc(); et ensuite tu fais le var_dump($commentaire); die(); pour voir ce que tu récupères de la base de donnée.

la variable $commentaire
contient les messages que les utilisateurs laisse et que j aimerais valider avant leurs publications

Curvata
merci
mais c est toujours pareil
toujours la meme erreur

Si l'erreur est présente à la ligne $contenu .= '<div class="titre">Par: ' . $commentaire['pseudo'] . ', le ' . $commentaire['datefr'] . ' à ' . $commentaire['heurefr'] . '</div>'; et si tu fais le var_dump et die avant celle-ci tu ne dois pas avoir une erreur ou alors l'erreur ne vient pas de cette ligne.

merci pour l aide
mais j ai toujours l erreur a cette ligne
voic le nouveau code avec les var_dump

<?php
// Partie connexion à la BDD et initialisation
$mysqli = new Mysqli('localhost', 'root', '', 'dialogue');
$contenu = '';
//---------------------------------------------------------------------------------------------
// Partie enregistrement
if($_POST)
{
    $_POST['pseudo'] = addslashes($_POST['pseudo']);
    $_POST['message'] = addslashes($_POST['message']);
    if(!empty($_POST['pseudo']) && !empty($_POST['message']))
    {
        $mysqli->query("INSERT INTO commentaire (pseudo, message, date_enregistrement) VALUES ('$_POST[pseudo]', '$_POST[message]', NOW())") OR DIE ($mysqli->error);
        $contenu .= '<div class="validation">Votre message a bien été enregistré.</div>';
    }
    else
    {
        $contenu .= '<div class="erreur">Afin de déposer un commentaire, veuillez svp remplir tous les champs du formulaire.</div>';
    }
}
echo var_dump($contenu) . "<br>"OR DIE ($mysqli->error);
echo var_dump($commentaire) . "<br>"OR DIE ($mysqli->error);
//---------------------------------------------------------------------------------------------
// Partie affichage des commentaires
$resultat = `$mysqli->query("SELECT pseudo, message, DATE_FORMAT(date_enregistrement, '%d/%m/%Y') AS datefr, DATE_FORMAT(date_enregistrement, '%H:%i:%s') AS heurefr FROM commentaire WHERE valider = 1 ORDER BY date_enregistrement DESC");    
$contenu .= '<h2>' . $resultat->num_rows . ' commentaire(s)</h2>'OR DIE ($mysqli->error);

echo var_dump($contenu) . "<br>"OR DIE ($mysqli->error);
echo var_dump($commentaire) . "<br>"OR DIE ($mysqli->error);

while($commentaire = $resultat->fetch_assoc());

 var_dump($commentaire); die();
{
    $contenu .= '<div class="message">';
     var_dump($commentaire); die();
        $contenu .= '<div class="titre">Par: ' . $commentaire['pseudo'] . ', le ' . $commentaire['datefr'] . ' à ' . $commentaire['heurefr'] . '</div>';
        $contenu .= '<div class="contenu">' . $commentaire['message'] . '</div>';
    $contenu .= '</div>';
}
//---------------------------------------------------------------------------------------------
// Partie formulaire d'envoi de commentaire
?>

et la base de donnee

--
-- Structure de la table `commentaire`
--

DROP TABLE IF EXISTS `commentaire`;
CREATE TABLE IF NOT EXISTS `commentaire` (
  `id_commentaire` int(3) NOT NULL AUTO_INCREMENT,
  `pseudo` varchar(20) NOT NULL,
  `message` text NOT NULL,
  `valider` int(11) NOT NULL DEFAULT '0',
  `date_enregistrement` datetime NOT NULL,
  PRIMARY KEY (`id_commentaire`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

Il y a un simple quote de trop devant : $mysqli->query("SELECT pseudo, message, DATE_FORMAT(date_enregistrement, '%d/%m/%Y') AS datefr, DATE_FORMAT(date_enregistrement, '%H:%i:%s') AS heurefr FROM commentaire WHERE valider = 1 ORDER BY date_enregistrement DESC");

J'ai fait le test je n'ai plus d'erreur

Le bon code est :

<?php

$mysqli = new Mysqli('localhost', 'root', '', 'dialogue');
$contenu = '';
if($_POST)
{
    $_POST['pseudo'] = addslashes($_POST['pseudo']);
    $_POST['message'] = addslashes($_POST['message']);
    if(!empty($_POST['pseudo']) && !empty($_POST['message']))
    {
        $mysqli->query("INSERT INTO commentaire (pseudo, message, date_enregistrement) VALUES ('$_POST[pseudo]', '$_POST[message]', NOW())") OR DIE ($mysqli->error);
        $contenu .= '<div class="validation">Votre message a bien été enregistré.</div>';
    }
    else
    {
        $contenu .= '<div class="erreur">Afin de déposer un commentaire, veuillez svp remplir tous les champs du formulaire.</div>';
    }
}
$resultat = $mysqli->query("SELECT pseudo, message, DATE_FORMAT(date_enregistrement, '%d/%m/%Y') AS datefr, DATE_FORMAT(date_enregistrement, '%H:%i:%s') AS heurefr FROM commentaire WHERE valider = 1 ORDER BY date_enregistrement DESC");    
$contenu .= '<h2>'  . $resultat->num_rows . ' commentaire(s)';

while($commentaire = $resultat->fetch_assoc())
{
    $contenu .= '<div class="message">';
        $contenu .= "<div class=\"titre\">Par: " . $commentaire['pseudo'] . ', le ' . $commentaire['datefr'] . " à " . $commentaire['heurefr'] . "</div>";
        $contenu .= '<div class="contenu">' . $commentaire['message'] . '</div>';
    $contenu .= '</div>';
}

Merci pour la solution
cela a regle l erreur
par contre j en ai deux nouvelles a la fin du code

   $contenu .= '<div class="titre">Par: ' . $commentaire['pseudo'] . ', le ' . $commentaire['datefr'] . ' à ' . $commentaire['heurefr'] . '</div>';
        $contenu .= '<div class="contenu">' . $commentaire['message'] . '</div>';

qui sont les suivantes
Notice: Trying to access array offset on value of type null in C:\wamp64\www\dialogue\dialogue.php on line 38
Notice: Trying to access array offset on value of type null in C:\wamp64\www\dialogue\dialogue.php on line 38
Notice: Trying to access array offset on value of type null in C:\wamp64\www\dialogue\dialogue.php on line 38
Notice: Trying to access array offset on value of type null in C:\wamp64\www\dialogue\dialogue.php on line 39

ouppss
desole
je viens jsute de voir le nouveau code
plus d erreur
en effet
je teste et je reviens

un tout tres grand merci

Si tu as toutes ces erreurs c'est parce que tu n'as aucun commentaire validé

non non c est bon
tout y est
juste que j avais ouvert la reponse trop vite et donc que le code n etais pas encore dans al reponse
mais tout fonctionne a merveille
un tout tres grand merci
vous etes geniaux
bonne fin d apres midi

De rien et bonne fin d'après-midi a vous aussi

Et, pourriez-vous mettre ma réponse comme acceptée, svp ???

cela ce fait comment

Tu parles de quoi sydneyikia ? Le code fonctionne parfaitement mais il voulait rajouter la modération des commentaires...