Un tchat avec une vérification des données

Résolu/Fermé
Utilisateur anonyme - Modifié par jordane45 le 2/05/2015 à 17:36
 Utilisateur anonyme - 2 mai 2015 à 18:09
Bonjour,

Tout d'abord désolé si la question a déjà été posée. Je suis en train de faire un minichat et j'aimerais que les messages s'affichent seulement si le visiteur a écrit un message ( sinon on affiche un message d'erreur ), j'utilise donc un formulaire et la fonction isset mais je ne sais pas à quel moment mettre la condition : le visiteur a-t-il écrit un message ou non.

J'ai essayé plusieurs possibilités, soit les messages apparaissent alors qu'il n'y a pas de message, soit il est impossible de rentrer un message ( le message d'erreur s'affiche dès le début ).

Quelqu'un a-t-il une idée ? Merci :-)

Voici le code pour lequel on ne peut pas rentrer de message, il y a la page du formulaire ( minichat.php ) et la page qui enregistre dans une base de donnée, le message du visiteur ( minichat_post.php ) :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
    </head>

    <body>
    
    <form action="minichat_post.php" method="post">
        <p>
        <label for="pseudo">pseudo</label> : <input type="text" name="pseudo" id="pseudo" /><br />
        <label for="message">message</label> :  <input type="text" name="message" id="message" /><br />

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

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


if (isset($_POST['pseudo']) AND $_POST['message']) // Si le pseudo et le message existent
{

 // Récupération des 10 derniers messages
 $reponse = $bdd->query('SELECT pseudo, message FROM minichat ORDER BY ID DESC LIMIT 0, 10');

 // Affichage de chaque message (toutes les données sont protégées par htmlspecialchars)
 while ($donnees = $reponse->fetch())
 {
  echo '<p><strong>' . htmlspecialchars($donnees['pseudo']) . '</strong> : ' . htmlspecialchars($donnees['message']) . '</p>';
 }

 $reponse->closeCursor();

}
else // Sinon, on affiche un message d'erreur
{
    echo '<p>Problème </p>';
}



?>
    </body>
</html>


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

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

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

1 réponse

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
Modifié par jordane45 le 2/05/2015 à 18:21
Bonjour,

$_POST est envoyé à ton fichier d'insertion en BDD ... il n'est pas présent sur la page de ton formulaire....

A la limite, tu peux :
Soit faire une requête SELECT (en mettant le pseudo du gars dans le WHERE) pour voir s'il a déjà posté un message ...

Soit utiliser les variables de SESSION ( ou les COOKIES) pour "mémoriser" le fait qu'il ait déjà écrit.

Quoi qu'il en soit, je pense que tu devrais mettre TOUT ton code PHP directement dans ta première page au lieu de renvoyer vers minichat_post.php

  <form action="" method="post">


A ce momment là .. la variable $_POST sera présente sur cette même page.....

Petit conseille, place ton code PHP au début de ta page plutôt qu'au milieu de ton code html...
ça rendra ton code plus simple à maintenir.

par exemple :

<?php
//démarrage de la session
session_start();

// Connexion à la base de données
require_once "connexion_bdd.php";

//récupération des variables
$pseudo = isset($_POST['pseudo']) ? $_POST['pseudo'] : NULL;
$message = isset($_POST['message']) ? $_POST['message'] : NULL;

// traitement du submit
if($pseudo && $message){
 // Insertion du message à l'aide d'une requête préparée
 $sql = "INSERT INTO minichat (pseudo, message) VALUES(?, ?)";
 $params = array($pseudo, $message);
 $req = $bdd->prepare($sql);
 $req->execute($params);
 $_SESSION['a_poste'] = true;

}
 
//récupération des messages
 if($_SESSION['a_poste'] == true){
 // Récupération des 10 derniers messages
 $sql = "SELECT pseudo, message FROM minichat ORDER BY ID DESC LIMIT 0, 10";
 $req = $bdd->prepare($sql);
 $req->execute($params);
 $reponse = $req->fetchAll();
  
}

$reponse->closeCursor();
?>


<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
    </head>

    <body>
    
    <form action="minichat_post.php" method="post">
        <p>
        <label for="pseudo">pseudo</label> : <input type="text" name="pseudo" id="pseudo" /><br />
        <label for="message">message</label> :  <input type="text" name="message" id="message" /><br />

        <input type="submit" value="Envoyer" />
       </p>
    </form>
 <?php
 if($_SESSION['a_poste'] == true){
  // Affichage de chaque message (toutes les données sont protégées par htmlspecialchars)
  foreach($reponse as $donnees ){
   echo '<p><strong>' . htmlspecialchars($donnees['pseudo']) . '</strong> : ' . htmlspecialchars($donnees['message']) . '</p>';
  }
 }else{// Sinon, on affiche un message d'erreur
   echo '<p>Problème </p>';
 }
 ?>
 </body>
</html>




Cordialement,
Jordane
0
Utilisateur anonyme
2 mai 2015 à 18:09
Merci pour ta réponse rapide ;) je vais essayer ça !
0