Mon formulaire ne marche pas

Résolu/Fermé
Altaïr Rouss - Modifié le 21 août 2017 à 15:50
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 - 22 août 2017 à 20:23
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

yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 Ambassadeur 1 554
Modifié le 21 août 2017 à 19:26
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
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
21 août 2017 à 21:34
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
Altaïr Rouss
22 août 2017 à 19:47
C'est les égalités, il y en a deux que j'ai mal écrites, tout est réglé
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
22 août 2017 à 20:23
Oui.
Mais... tiens compte quand même de mes remarques....
0