Mon formulaire ne marche pas

Résolu
Altaïr Rouss -  
jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour*

Voici mon problème:
Je veux créer dans mon site, un chat permettant aux visiteurs de communiquer.
Je me sers des COOKIES et d'une base de données afin d'avoir une saisie automatique du pseudo pour un utilisateur enregistré et pour éviter que plusieurs utilisateurs aient le même pseudo.
Cependant, mon code ne marche pas. Voici le protocole de l'erreur étape par étape:
- Ma base de données est vide, je n'ai aucun cookie lié à ce site (RAS)
- J'entre un pseudo et un message. Ils s'affichent sur la page et mon champ "pseudo" prend automatiquement la valeur du cookie (RAS)
- Je supprime le cookie qui à été créé pour simuler un nouvel utilisateur utilisant le chat (RAS)
- Quel que soit le pseudo que j'utilise, il prendra la valeur "Array" et aucun cookie n'est enregistré

Voici le code de mon chat


<div id="form">
Envoyer un message:
<form action="recus.php" method="post">
<p>
<label for="pseudo">Pseudo</label> : <input type="text" name="pseudo" id="pseudo" value=
<?php
if (isset($_COOKIE['pseudo']))
{
echo $_COOKIE['pseudo'];
}
?>
><br />
<label for="message">Message</label> : <input type="text" name="message" id="message" /><br />
<input type="submit" value="Envoyer" />
</p>
</form>
</div>

<div id="chat">
<h2>Chat :</h2>
<?php
// Connexion à la base de données
try
{
$bdd = new PDO('mysql:host=localhost;dbname=ptsi;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
// Récupération des 25 derniers messages
$reponse = $bdd->query('SELECT date_message, pseudo, message FROM recus ORDER BY ID DESC LIMIT 0, 25') OR die(print_r($bdd->errorInfo()));
// Affichage de chaque message (toutes les données sont protégées par htmlspecialchars)
while ($donnees = $reponse->fetch())
{
echo
'<p><em>'
.htmlspecialchars($donnees['date_message']).
'</em><strong> -'
.htmlspecialchars($donnees['pseudo']).
': </strong>'
.htmlspecialchars($donnees['message']).
'</p>'
;
}
$reponse->closeCursor();
?>
</div>


Voici le code de ma page de traitement:

<?php
$autorisation = NULL;
// Si les deux champs sont remplis
if (!empty($_POST['pseudo']) AND !empty($_POST['message']))
{
    // Si le PC client possède un pseudo
    if (isset($_COOKIE['pseudo']))
    {
        // Si le pseudo est celui du client
        if ($_POST['pseudo'] = $_COOKIE['pseudo'])
        {
            // On se connecte à MySQL
            try
            {
                $bdd = new PDO('mysql:host=localhost;dbname=ptsi;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
            }
            // En cas d'erreur, on affiche un message et on arrête tout
            catch(Exception $e)
            {
                die('Erreur : '.$e->getMessage());
            }
            // Insertion du message à l'aide d'une requête préparée
            $req = $bdd->prepare('INSERT INTO recus (date_message, pseudo, message) VALUES(:date_message, :pseudo, :message)');
             if (!$req) {echo "\nPDO::errorInfo():\n"; print_r($bdd->errorInfo());}
            $req->execute(array(
             'date_message' => date('Y-m-d H:i:s'),
             'pseudo' => $_POST['pseudo'],
             'message' => $_POST['message']));
            // Redirection du visiteur vers la page du minichat
            header('Location: forum.php');
        // Si le pseudo n'est pas celui du client
        }
        else
        {
            echo "Ceci n'est pas votre pseudo";
        }
    }
    // Si le PC client ne possède pas de pseudo
    else
    {
        // On se connecte à MySQL
        try
        {
            $bdd = new PDO('mysql:host=localhost;dbname=ptsi;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        }
        // En cas d'erreur, on affiche un message et on arrête tout
        catch (Exception $e)
        {
            die('Erreur : ' . $e->getMessage());
        }
        // On récupère l'ensemble des pseudos
        $reponse = $bdd->query('SELECT pseudo FROM recus') OR die(print_r($bdd->errorInfo()));
        // On vérifie tous les pseudos
        while ($donnees = $reponse->fetch())
        {
            // Si le pseudo est déja utilisé
            if ($_POST['pseudo'] = $donnees)
            {
                $autorisation = false;
            }
            // Si le pseudo n'est pas déja utilisé
            elseif ($_POST['pseudo'] != $donnees)
            {
            }
        }
        $reponse->closeCursor();
     if ($autorisation == NULL)
     {
      // On crée un cookie pour donner un nom à l'utilisateur
         setcookie('pseudo', $_POST['pseudo'], time()+2.5*365*24*3600, null, null, false, true);
         // On se connecte à MySQL
         try
         {
             $bdd = new PDO('mysql:host=localhost;dbname=ptsi;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
         }
         // En cas d'erreur, on affiche un message et on arrête tout
         catch(Exception $e)
         {
             die('Erreur : '.$e->getMessage());
         }
         // Insertion du message à l'aide d'une requête préparée
         $req = $bdd->prepare('INSERT INTO recus (date_message, pseudo, message) VALUES(:date_message, :pseudo, :message)');
             if (!$req) {echo "\nPDO::errorInfo():\n"; print_r($bdd->errorInfo());}
         $req->execute(array(
             'date_message' => date('Y-m-d H:i:s'),
             'pseudo' => $_POST['pseudo'],
             'message' => $_POST['message']));
         // Redirection du visiteur vers la page du minichat
         header('Location: forum.php');
     }
     else
     {
      echo "Ce pseudo est déjà utilisé, veuillez en choisir un autre";
     }
    }
// S'il manque un champ
}
else
{
    echo "Veuillez renseigner un pseudo et un message pour intéragir avec le chat";
}
?>


Je ne sais vraiment pas comment régler ce soucis ni même d'où il vient.
Merci beaucoup à qui trouvera une réponse et bonne journée

3 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonsoir,
    peux-tu donner les noms de tes deux fichiers php?
    peux-tu aussi expliquer le scenario plus factuellement?
    - Ma base de données est vide, je n'ai aucun cookie lié à ce site (RAS)
    - J'entre un pseudo et un message (?sur quelle page?). Ils s'affichent sur la page (quelle page, la même?) et mon champ "pseudo" prend automatiquement la valeur du cookie (RAS) (tu n'as aucun cookie, comment le champ peut-il prendre la valeur du cookie?)
    - Je supprime le cookie qui à été créé pour simuler un nouvel utilisateur utilisant le chat (RAS)
    - (et ensuite que fais-tu?) Quel que soit le pseudo que j'utilise, il prendra la valeur "Array" (où vois-tu cette valeur?) et aucun cookie n'est enregistré
    0
  2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,

    On le code de connexion à la bdd dans un fichier à part qu'il suffit d'inclure dans ses pages au lieu de le réécrire à chaque fois !
    <?php
    //fichier cnxbdd.php
    try{
      $bdd =new PDO('mysql:host=localhost;dbname=ptsi; charset=utf8', 'root', '');
      // Activation des erreurs PDO
      $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
      $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    } catch(PDOException $e) {
      die('Erreur : ' . $e->getMessage());
    }
    ?>
    


    Puis concernant le reste de ton code :
    déjà.. on place le maximum de code php EN DEHORS du html (au début du fichier)
    par exemple.. la connexion à la bdd, la récupération PROPRE des variables AVANT de les utiliser
    le traitement du formulaire .. etc...

    Ensuite.. pour gérer les erreurs PHP .. on utilise des blocs TRY/CATCH .. pas des " OR DIE.. "

    Et pour finir .. les égalité se vérifient avec == ou === mais pas avec = !

    <?php
    //Activation des erreurs PHP
    error_reporting(E_ALL);
    ini_set('display-errors','on');
    
    //connexion à la bdd
    require_once "cnxbdd.php";
    
    //récupération PROPRE des variables
    $pseudo = !empty($_COOKIE['pseudo']) ? $_COOKIE['pseudo'] : NULL;
    
    // Récupération des 25 derniers messages
    $sql = "SELECT date_message
                  , pseudo
                  , message 
           FROM recus 
           ORDER BY ID DESC 
           LIMIT 0, 25";
    try{
      $requete = $bdd -> prepare($sql) ;
      $requete->execute() ;
      //on stocke le résultat dans un ARRAY
      $messages = $requete->fetchAll();
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
    }
    
    ?>
    
    <div id="form">
            Envoyer un message:
            <form action="recus.php" method="post">
                <p>
                    <label for="pseudo">Pseudo</label> : <input type="text" name="pseudo" id="pseudo" value="<?php echo $pseudo; ?>"><br />
                    <label for="message">Message</label> :  <input type="text" name="message" id="message" /><br />
                    <input type="submit" value="Envoyer" />
                </p>
            </form>
            </div>
    
            <div id="chat">
                <h2>Chat :</h2>
                <?php
                // Affichage de chaque message (toutes les données sont protégées par htmlspecialchars)
                foreach($messages as $donnees) {
                    echo
                        '<p><em>'
                        .htmlspecialchars($donnees['date_message']).
                        '</em><strong> -'
                        .htmlspecialchars($donnees['pseudo']).
                        ': </strong>'
                        .htmlspecialchars($donnees['message']).
                        '</p>'
                    ;
                }
                ?>
            </div>
    </div> <!-- Fin div "form" -->
    


    <?php
    //Fichier recus.php
    
    //Activation des erreurs PHP
    error_reporting(E_ALL);
    ini_set('display-errors','on');
    
    //connexion à la bdd
    require_once "cnxbdd.php";
    
    //fonctions
    function add_message($post_pseudo,$message){
      $sql = 'INSERT INTO recus (date_message, pseudo, message) VALUES(:date_message, :pseudo, :message)';
      $datas = array(
          'date_message' => date('Y-m-d H:i:s'),
          'pseudo' => $post_pseudo,
         'message' => $message);
      try{
        $requete = $bdd -> prepare($sql) ;
        $result = $requete->execute($datas) ;
        // Redirection du visiteur vers la page du minichat
        if($result){
         header('Location: forum.php');
         exit();
        }
      }catch(Exception $e){
        // en cas d'erreur :
         echo " Erreur ! ".$e->getMessage();
      }
    }
    
    //récupération PROPRE des variables
    $autorisation = NULL;
    $cookie_pseudo = !empty($_COOKIE['pseudo']) ? $_COOKIE['pseudo'] : NULL;
    $post_pseudo = !empty($_POST['pseudo']) ? $_POST['pseudo'] : NULL;
    $message = !empty($_POST['message']) ? $_POST['message'] : NULL;
    
    // Si les deux champs sont remplis
    if ($post_pseudo && $message) {
        // Si le PC client possède un pseudo
        if ($cookie_pseudo) {
            // Si le pseudo est celui du client
            if ($post_pseudo == $pseudo) {
                add_message($post_pseudo,$message);
            } else  {
              // Si le pseudo n'est pas celui du client  
              echo "Ceci n'est pas votre pseudo";
            }
        } else {
           // Si le PC client ne possède pas de pseudo
            // On regarde si le pseudo existe en base
             $sql = 'SELECT pseudo FROM recus WHERE pseudo =:pseudo';
             $datas = array( 'pseudo' => $post_pseudo);
             try{
               $requete = $bdd -> prepare($sql) ;
               $result = $requete->execute($datas) ;
               $reponse = $result->fetchAll();
             }catch(Exception $e){
                // en cas d'erreur :
                 echo " Erreur ! ".$e->getMessage();
             }
            
            if(empty($reponse)){
               $autorisation = false;
               // On crée un cookie pour donner un nom à l'utilisateur
               setcookie('pseudo', $_POST['pseudo'], time()+2.5*365*24*3600, null, null, false, true);
               add_message($post_pseudo,$message);
            }  else  {
              echo "Ce pseudo est déjà utilisé, veuillez en choisir un autre";
            }
        }
    }else{
      // S'il manque un champ
      echo "Veuillez renseigner un pseudo et un message pour intéragir avec le chat";
    }
    ?>
    
    

    0
  3. Altaïr Rouss
     
    C'est les égalités, il y en a deux que j'ai mal écrites, tout est réglé
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Oui.
      Mais... tiens compte quand même de mes remarques....
      0