Actualisation chat -> Double message

stranger98

stranger98 Le 19 août 2016 à 00:11 (Édité le 25 janvier 2019 à 17:52)

Voila mon problème,
j'ai crée un chat en suivant le tuto.
Quand j'envoie un message et que j'actualise ça renvoi le même message à chaq fois que j'actualise et je comprend pas poruquoi? :(

<?php 
    $bdd = new PDO("mysql:host=127.0.0.1;dbname=tuto", "root", "");
    if(isset($_POST['Pseudo'])  AND isset($_POST['Message']) AND !empty($_POST['Pseudo']) AND !empty($_POST['Message']))
{
    $pseudo = htmlspecialchars($_POST['Pseudo']);
    $message = htmlspecialchars($_POST['Message']);
    $insertmsg = $bdd->prepare('INSERT INTO chat(pseudo, message) VALUES (?, ?)');
    $insertmsg->execute(array($pseudo, $message));
}
?>
 <html>
  <head>
    <title> </title>
    <meta charset="utf-8">
  </head>
  <body>
    <form method="post" action="">
    <input type="text" name="Pseudo" placeholder="PSEUDO" value="<?php if(isset($pseudo)) { echo $pseudo; } ?>"><br>
    <textarea type="text" name="Message" placeholder="MESSAGE"></textarea><br>
    <input type="submit" value="Envoyer"/>
    </form>
    <?php
    $allmsg = $bdd->query('SELECT * FROM chat ORDER BY id DESC');
    while ($msg = $allmsg->fetch()) 
    {
    ?>
    <b> <?php echo $msg['pseudo']; ?> : </b> <?php echo $msg['message']; ?> <br />
    <?php
    }
    ?>
   
  </body>
</html>

TheOldNoob

TheOldNoob Le 19 août 2016 à 02:36

Salut l'ami,
Tu peu utilisé après ta ligne 8 :

header('Location: nomdetapage.php');
Après l'insertion en bdd, ça va te renvoyer sur la même page et donc vidé ton $_POST

Mais... ça va aussi vidé le pseudo. Pour ça, il faudra créer un cookie 😉
stranger98

stranger98 Le 19 août 2016 à 15:41

Merci TheHoldNoob tu m'a vraiment aidé, 😀
stranger98

stranger98 Le 19 août 2016 à 16:47

setcookie('pseudo', time() + 0, null, null, false, true):
Excuse moi de te déranger encore une fois en faites je voulais mettre des cookies pour que le pseudo reste, est-ce que tu peut m'aidez stp,
je sais qu’après la connexion il faut mettre : 


(est-ce que c'est bon ?)
mais après je sais pas quoi mettre  ou où le mettre.
TheOldNoob

TheOldNoob Le 19 août 2016 à 18:01 (Édité le 19 août 2016 à 18:02)

Pas de soucis l'ami ça me fait plaisir ! 😀

La tu défini un cookie qui sera $_COOKIE['pseudo']
parfait, mais tu ne lui dit pas quel sera le cookie
setcookie('pseudo', $pseudo, time()...
ton setcookie doit du coup être placé après la création de ta variable $pseudo qui contien le pseudo de ton utilisateur.

Ensuite, seconde erreur, tu met un time a 0, du coup ton cookie va vivre zero seconde?

setcookie('pseudo', $pseudo, time() + 365*24*3600, null, null, false, true);
la, tu fait tenir ton cookie 365 jours x 24 heures x 3600 secondes = 1 an !
stranger98

stranger98 Le 19 août 2016 à 19:55 (Édité le 19 août 2016 à 19:57)

merci,
le cookie il marche mais au faite quand j'ai introduit :
header('Location: chat.php')
ben le code pour envoyer différents messages avec le même pseudo marche plus :
<input type="text" name="Pseudo" placeholder="PSEUDO" value="<?php if(isset($pseudo)) {echo $pseudo;} ?>">
je te donne tout le code : 
<?php 
    $bdd = new PDO("mysql:host=127.0.0.1;dbname=tuto", "root", "");
    setcookie('Pseudo', time() + 365*24*3600, null, null, false, true);
    if(isset($_POST['Pseudo'])  AND isset($_POST['Message']) AND !empty($_POST['Pseudo']) AND !empty($_POST['Message']))
{
    $pseudo = htmlspecialchars($_POST['Pseudo']);
    $message = htmlspecialchars($_POST['Message']);
    $insertmsg = $bdd->prepare('INSERT INTO chat(pseudo, message) VALUES (?, ?)');
    header('Location: chat.php');
    $insertmsg->execute(array($pseudo, $message));
}
?>
<html>
<head>
    <title> </title>
    <meta charset="utf-8">
</head>
<body>
   <form method="post" action="">
    <input type="text" name="Pseudo" placeholder="PSEUDO" value="<?php if(isset($pseudo)) {echo $pseudo;} ?>"><br>
    <textarea type="text" name="Message" placeholder="MESSAGE"></textarea><br>
    <input type="submit" value="Envoyer"/>
    </form>
    <?php
    $allmsg = $bdd->query('SELECT * FROM chat ORDER BY id DESC');
    while ($msg = $allmsg->fetch()) 
    {
    ?>
    <b><?php echo $msg['pseudo'];?> : </b>
    <?php echo $msg['message']; ?> <br>
    <?php
    }
    ?>
  </body>
</html>
TheOldNoob

TheOldNoob Le 19 août 2016 à 20:03

Tu y es presque, déjà, tu n'a pas bien lu mon précedent message, ta ligne 3, il manque une variable. Et du coup, ton setcookie ne doit pas se trouvé là.

Ensuite, ce que tu veux afficher dans ton value, ce n'est pas la variable pseudo, mais le cookie qui contiens la variable $pseudo, dont tu demandera d'afficher $_COOKIE['pseudo']

Je te laisse réessayé, si ça marche pas je te donne mon code
stranger98

stranger98 Le 19 août 2016 à 20:22

Merci de m'avoir répondu,
pour le cookie j'ai compris où il faut le placer, mais pour garder le même pseudo pour envoyer différents messages ne fonctionne pas :( 

<?php 
    $bdd = new PDO("mysql:host=127.0.0.1;dbname=tuto", "root", "");
    if(isset($_POST['Pseudo'])  AND isset($_POST['Message']) AND !empty($_POST['Pseudo']) AND !empty($_POST['Message']))
{
    $pseudo = htmlspecialchars($_POST['Pseudo']);
    $message = htmlspecialchars($_POST['Message']);
    setcookie('Pseudo', $pseudo, time() + 365*24*3600, null, null, false, true);
    $insertmsg = $bdd->prepare('INSERT INTO chat(pseudo, message) VALUES (?, ?)');
    header('Location: chat.php');
    $insertmsg->execute(array($pseudo, $message));
}
?>
<html>
<head>
    <title> </title>
    <meta charset="utf-8">
</head>
<body>
   <form method="post" action="">
    <input type="text" name="Pseudo" placeholder="PSEUDO" value="<?php if(isset($pseudo)) {echo $_COOKIE['pseudo'];} ?>"><br>
    <textarea type="text" name="Message" placeholder="MESSAGE"></textarea><br>
    <input type="submit" value="Envoyer"/>
    </form>
    <?php
    $allmsg = $bdd->query('SELECT * FROM chat ORDER BY id DESC');
    while ($msg = $allmsg->fetch()) 
    {
    ?>
    <b><?php echo $msg['pseudo'];?> : </b>
    <?php echo $msg['message']; ?><br>
    <?php
    }
    ?>
  </body>
</html>
TheOldNoob

TheOldNoob Le 19 août 2016 à 20:27

ça se rapproche, il te manque juste un petit truc a corriger sur la ligne 20,
tu remplace ton $pseudo par le cooki pseudo comme pour l'éco.

En gros, tu lui dit si il y a un cookie pseudo, affiche le...
stranger98

stranger98 Le 19 août 2016 à 20:36

Merci infiniment Monsieur,
Vous m'avez vraiment aidé, pour résumer ce que j'ai fait c'était une majuscule pour pseudo donc $_COOKIE['Pseudo'].
Je vous remercie sans vous je ne pourrais pas résoudre ce probleme :) 
TheOldNoob

TheOldNoob Le 19 août 2016 à 20:43

ahaha, on se dit tu?

Je t'en pris 😉
Chooper01

Chooper01 Le 19 août 2016 à 21:53 (Édité le 19 août 2016 à 21:57)

Bonsoir, 
Je me permets de rouvrir ce topic ^^
Ce que je ne comprends c'est que dans le tuto (https://www.youtube.com/watch?v=eDz0nmQM3xw) on a exactement le même code mais comme stranger98 sa affiche 2x le même message .. 

( Et j'ai remarqué ceci dans 2 tuto) 

Merci ^^
<?php
try {
      $bdd = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "", array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
         } catch (PDOException $e) 
      {
       echo 'Echec de la connexion : ' . $e->getMessage();
       exit;
      }   
   if (isset($_POST['pseudo']) AND isset($_POST['message']) AND !empty($_POST['pseudo']) AND !empty($_POST['message'])) 
   {
      $pseudo = htmlspecialchars($_POST['pseudo']) ;
      $message = htmlspecialchars($_POST['message']) ;
      $insertmsg = $bdd ->prepare('INSERT INTO chat(pseudo,message) VALUES (?, ?)') ;
      $insertmsg -> execute(array($pseudo, $message)) ;
   }
?>
<!DOCTYPE html>
<html>
   <head>
      <title>Chat</title>
      <meta charset=utf-8>
   </head>
   <body>
   <form method="POST" action="">
      <input type="text" name="pseudo" placeholder="PSEUDO" /> <br />
      <textarea type="textarea" name="message" placeholder="MESSAGE" ></textarea> <br />
      <input type="submit" value="Envoyer!" />
   </form>
   
   <?php
   $allmsg = $bdd->query('SELECT * FROM chat ORDER BY id DESC ');
      
   while($msg = $allmsg->fetch())
      {
   ?>
         <b><?php echo $_POST['pseudo'];?> : </b>
         <?php echo $_POST['message'];?> . <br />
      <?php
      }
      ?>
   </body>
</html>
TheOldNoob

TheOldNoob Le 19 août 2016 à 23:16

C'est un tuto, en générale ça aide pour placé les base du fonctionnement et après c'est a chacun d'amélioré le fonctionnement.

J'ai jamais fait de chat, j'ai jamais utilsé les cookies avant que tu pose la question, j'ai chercher un peu sur le net comment ça fonctionne, j'ai testé de mon coté et hop, je t'ai aidé 😀
Chooper01

Chooper01 Le 19 août 2016 à 23:25

Oui je suis d'accord mais lui de son coté sa fonctionne sans cookies  ^^
et je cherche pourquoi chez moi sa veut pas 😭 :) 
TheOldNoob

TheOldNoob Le 19 août 2016 à 23:52

j'ai regarder son tuto, il va avoir le même probleme si il actuelise après avoir posté un message.

Comme il dit dans son tuto, tu peu utilisé de l'AJAX pour rafrechir la partie du chat et ainsi l'utilisateur n'aura pas a recharger la page complete.
Je prend de l'avance, me demande pas pour l'AJAX j'y connais rien du tout 😋

Sinon, avec ce que tu a déjà, tu peu aussi utilisé les cookie couplé avec la méta refresh

<META HTTP-EQUIV="Refresh" CONTENT="3">

ici, le 3 correspond au nombre de second pour réactualisé la page.
Chooper01

Chooper01 Le 20 août 2016 à 00:11

Je vois ok un grand merci a toi pour l'aide merci et a la prochaine:p
stranger98

stranger98 Le 20 août 2016 à 18:33

j'ai un autre probleme :( si t'as le temps et ça te derange pas , quand ons'inscris dans la page inscription et qu'on a créé le compte:
<?php
$bdd = new PDO("mysql:host=127.0.0.1;dbname=tuto", "root", "");
 
if(isset($_POST['forminscription']))
{
    $pseudo = htmlspecialchars($_POST['pseudo']);
    $mdp = sha1($_POST['mdp']);
    $mdp2 = sha1($_POST['mdp2']);
 
    if(!empty($_POST['pseudo']) AND !empty($_POST['mdp']) AND !empty($_POST['mdp2']))
    {
        $pseudolength = strlen($pseudo);
        if($pseudolength <= 255)
        {
            $reqpseudo = $bdd->prepare("SELECT * FROM membres WHERE pseudo = ?");
            $reqpseudo->execute(array($pseudo));
            $pseudoexist = $reqpseudo->rowCount();
            if($pseudoexist == 0)
            {
                if($mdp == $mdp2)
                {
                    $insertmbr = $bdd->prepare("INSERT INTO membres(pseudo, motdepasse) VALUES(?, ?)");
                    $insertmbr->execute(array($pseudo, $mdp));
                    $erreur = "Votre compte a bien été créé !";
                     
                }
                else
                {
                    $erreur = "Vos mots de passes ne correspondent pas !";
                }
            }
            else
            {
                $erreur = "Pseudo dèja existant";
            }
        }
        else
        {
            $erreur ="Votre pseudo ne doit pas dépasser 255 caractères";
        }
    }
    else
    {
        $erreur = "Tous les Champs doivent être complétés !";
    }
}
 
 
?>
<!DOCTYPE html>
<html>
 
 
 
<head>
    <link rel="stylesheet" type="text/css" href="stylechat_inscription.css">
    <meta charset="utf-8">
    <title>Zone The Walking Dead</title>
</head>
 
 
 
<body>
    <?php include("../Inclusions/image.php")  ?>
 
 
 
    <?php include("../Inclusions/menu.php")  ?>
 
 
 
    <table cellspacing="0" cellpadding="0" align="center">
    <td height="460">
 
 
 
    <div id="table">
    <table width="500" cellspacing="0" cellpadding="0" align="center">
    <td bgcolor="#54542c" height="460" valign="top">
 
        <fieldset>
            <legend class="titre">Inscription</legend>
            <form method="POST" action="">
                <table>
                    <tr>
                        <td align="right">
                            <label for="pseudo" class="label">Pseudo :</label>
                        </td>
                        <td>
                            <input type="text" placeholder="Votre pseudo" id="pseudo" name="pseudo" value="<?php if(isset($pseudo)) { echo $pseudo; } ?>">
                        </td>
                    </tr>
                    <tr>
                        <td align="right">
                            <label for="mdp" class="label">Mot de passe :</label>
                        </td>
                        <td>
                            <input type="password" placeholder="Votre mot de passe" id="mdp" name="mdp">
                        </td>
                    </tr>
                    <tr>
                        <td align="right">
                            <label for="mdp2" class="label">Confirmation Mot de passe :</label>
                        </td>
                        <td>
                            <input type="password" placeholder="Confirmez Votre mdp" id="mdp2" name="mdp2">
                        </td>
                    </tr>
                    <tr>
                        <td></td>
                        <td align="center"><br><input class="button" type="submit" value="Je m'inscris" name="forminscription"></td>
                    </tr>
                </table>
            </form>
            </fieldset>
            <?php
            if(isset($erreur))
            {
                echo '<div class="erreur">'.$erreur."</div>";
            }
            ?>
        </div>
    </td>
    </table>
    </div>
    </td>
    </table>
 
    <footer class="footer">
            <p style="text-align:center;">© Droits réservés à zonethewalkingdead.esy.es</p>
    </footer>
</body>
</html> 
et qu'on se connecte dans la page connexion pour pouvoir tchatter :

<?php
session_start();
 
$bdd = new PDO("mysql:host=127.0.0.1;dbname=tuto", "root", "");
 
if(isset($_POST['formconnect']))
{
    $pseudoconnect = htmlspecialchars($_POST['pseudoconnect']);
    $mdpconnect = sha1($_POST['mdpconnect']);
    if(!empty($pseudoconnect) AND !empty($mdpconnect))
    {
        $requser = $bdd->prepare("SELECT * FROM membres WHERE pseudo = ? AND motdepasse = ?");
        $requser->execute(array($pseudoconnect, $mdpconnect));
        $userexist = $requser->rowCount();
        if($userexist == 1)
        {
            $userinfo = $requser->fetch();
            $_SESSION['id'] = $userinfo['id'];
            $_SESSION['pseudo'] = $userinfo['pseudo'];
            header('Location: chat.php?id='.$_SESSION['id']);
        }
        else
        {
            $erreur = "Mauvais pseudo ou mot de passe !";
        }
    }
    else
    {
        $erreur = "Tous les champs doivent être complétés !";
    }  
 
}
 
?>
<!DOCTYPE html>
<html>
 
 
 
<head>
    <link rel="stylesheet" type="text/css" href="stylechat_inscription.css">
    <meta charset="utf-8">
    <title>Zone The Walking Dead</title>
</head>
 
 
 
<body>
    <?php include("../Inclusions/image.php")  ?>
 
 
 
    <?php include("../Inclusions/menu.php")  ?>
 
 
 
    <table cellspacing="0" cellpadding="0" align="center">
    <td height="460">
 
 
 
    <div id="table">
    <table width="500" cellspacing="0" cellpadding="0" align="center">
    <td bgcolor="#54542c" height="460" valign="top">
 
        <fieldset>
            <legend class="titre">Connexion</legend>
            <form method="POST" action="">
                <input type="text" name="pseudoconnect" placeholder="Pseudo">
                <input type="password" name="mdpconnect" placeholder="Mot de Passe">
                <input type="submit" name="formconnect" value="Se connecter">
 
            </form>
            </fieldset>
 
            <?php
            if(isset($erreur))
            {
                echo '<div class="erreur">'.$erreur."</div>";
            }
            ?>
    </div>
    </td>
    </table>
    </div>
    </td>
    </table>
 
    <footer class="footer">
            <p style="text-align:center;">© Droits réservés à zonethewalkingdead.esy.es</p>
    </footer>
</body>
</html> 
je veux que qand il comment dans la page du chat, je veux faire apparaitre le pseudo si il est conecté et le message 😀:

<?php
session_start();
 
    $bdd = new PDO("mysql:host=127.0.0.1;dbname=tuto", "root", "");
 
    if(isset($_GET['id']) AND $_GET['id'] > 0)
    {
    $getid = intval($_GET['id']);
    $requser = $bdd->prepare('SELECT * FROM membres WHERE id = ?');
    $requser->execute(array($getid));
    $userinfo = $requser->fetch();
 
 
 
    if(isset($_POST['Pseudo']) AND isset($_POST['Message']) AND !empty($_POST['Pseudo']) AND
    !empty($_POST['Message']))
{
    $pseudo = htmlspecialchars($_POST['Pseudo']);
    $message = htmlspecialchars($_POST['Message']);
 
    setcookie('Pseudo', $pseudo, time() + 365*24*3600, null, null, false, true);
 
    $insertmsg = $bdd->prepare('INSERT INTO chat(pseudo, message) VALUES (?, ?)');
    header('Location: chat.php?id='.$_SESSION['id']);
    $insertmsg->execute(array($pseudo, $message));
}
 
 
 
 
?>
<!DOCTYPE html>
<html>
 
 
 
    <head>
        <link rel="stylesheet" type="text/css" href="stylechat.css">
        <meta charset="utf-8">
        <title>Zone The Walking Dead</title>
    </head>
 
 
 
    <body>
        <?php include("../Inclusions/image.php")  ?>
 
 
 
        <?php include("../Inclusions/menu.php")  ?>
 
 
 
        <table cellspacing="0" cellpadding="0" align="center">
        <td height="1800">
 
 
 
        <div id="table">
        <table width="600" cellspacing="0" cellpadding="0" align="center">
        <td bgcolor="#54542c" height="1800" valign="top">
 
            <div id="titre">
            <p>
            Tchat ZoneTWD
            </p>
            </div>
 
            <form method="post" action="">
            <input type="text" name="Pseudo" placeholder="PSEUDO" class="pseudo"></input><br>
            <textarea type="text" name="Message" class="message"></textarea><br>
            <input type="submit" value="Envoyer" class="envoyer">
            </form>
            <?php
            $allmsg = $bdd->query('SELECT * FROM chat ORDER BY id DESC');
 
            while ($msg = $allmsg->fetch())
            {
            ?>
            <div class="boite">
            <b><?php echo $msg['pseudo']; ?> : </b>
            <?php echo $msg['message']; ?><br>
            </div>
            <?php
            }
            ?>
 
 
 
        </td>
        </table>
        </div>
        </td>
        </table>
 
        <footer class="footer">
            <p style="text-align:center;">© Droits réservés à zonethewalkingdead.esy.es</p>
        </footer>
    </body>
</html>  
<?php
}
 
 
?>  
j'espere que tu comprendras 😀
Balatharas

Balatharas Le 21 août 2016 à 12:55

Salut, je ne sais pas si vous en avez parler, mais voila comment je fais pour garder le pseudo:
(par contre si tu n'as pas d'espace membre ignore ce message ^^)
En gros j'interdis l'accès au chat a ceux qui ne sont pas connecté, du coup dans l'input text je met comme value: <?= $_SESSION['pseudo'] ?> et je met disable dans cette input. Du coup l'input reste pleine meme apres actualisation, et on ne peux pas "usurper" le pseudo de quelqu'un.
Apres tu peux combiner cela avec le header que @TheHoldNoob ta montrer pour eviter le renvoi de formulaire si tu actualise.
TheOldNoob

TheOldNoob Le 21 août 2016 à 20:59

Re salut 😀

Alors, tu a plusieurs possibilité. ce que je propose, c'est sur la façon dont moi je ferais mon chat, mais si ça te conviens pas, il y a d'autre possibilité.

Pour moi, il n'y a que les gens inscrit et donc connecter qui peuvent parler sur le chat.
Si on part de là, il nous suffit de faire une simple condition, pour que l'imput message soit caché si une personne n'est pas connecter.
Du coup, tout le monde peu voir le chat, voir les messages et donc s'intéressé aux discutions. Ce qui devrait les motivé a s'inscrire.

Pour se faire, dans ta table membres, tu doit ajouter un champs 'role' qui, je pense existe déjà, puisque j'imagine tu a des administrateurs (au moins toi)

Donc très simplement, je met les roles suivant : chater, admin (tu peu ajouter autant de role que tu le souhaite, 'editor', 'visitor'...)

Bref, ici, on va mettre des conditions un peu comme le propose Beignet afin d'afficher ou non l'input du chat a ceux qui en ont le droit.

Tu instancie par exemple : $showMessage = false; // est cacher de base pour tout le monde

Je te met pas de code, je te met simplement les instructions 😉

Si ( la session n'est pas vide ET qu'elle qu'il y a un 'role' dans la table 'membres'
Si le 'role' de la table 'membres' est admin chater editeur
ta variable d'affichage passe a true


Du coup, si l'utilisateur remplis toute ses conditions et en fonction de son statue, il peu voir le chat.

C'est le même genre de code qui va te permettre d'ajouter des boutons visible ou non en fonction du role (pour modéré ou édité un forum par exemple)

Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte