Actualisation chat -> Double message
- Accueil
- Forum
- Programmation
- PHP
- Actualisation chat -> Double message
stranger98 Le 19 août 2016 à 00:11 (Édité le 25 janvier 2019 à 17:52)
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 Le 19 août 2016 à 02:36 (Édité le 1 janvier 1970 à 01:00)
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 Le 19 août 2016 à 15:41 (Édité le 1 janvier 1970 à 01:00)
stranger98 Le 19 août 2016 à 16:47 (Édité le 1 janvier 1970 à 01:00)
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 Le 19 août 2016 à 18:01 (Édité le 19 août 2016 à 18:02)
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 Le 19 août 2016 à 19:55 (Édité le 19 août 2016 à 19:57)
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 Le 19 août 2016 à 20:03 (Édité le 1 janvier 1970 à 01:00)
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 Le 19 août 2016 à 20:22 (Édité le 1 janvier 1970 à 01:00)
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 Le 19 août 2016 à 20:27 (Édité le 1 janvier 1970 à 01:00)
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 Le 19 août 2016 à 20:36 (Édité le 1 janvier 1970 à 01:00)
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 Le 19 août 2016 à 20:43 (Édité le 1 janvier 1970 à 01:00)
Je t'en pris 😉
Chooper01 Le 19 août 2016 à 21:53 (Édité le 19 août 2016 à 21:57)
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 Le 19 août 2016 à 23:16 (Édité le 1 janvier 1970 à 01:00)
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 Le 19 août 2016 à 23:25 (Édité le 1 janvier 1970 à 01:00)
et je cherche pourquoi chez moi sa veut pas 😭 :)
TheOldNoob Le 19 août 2016 à 23:52 (Édité le 1 janvier 1970 à 01:00)
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 Le 20 août 2016 à 00:11 (Édité le 1 janvier 1970 à 01:00)
stranger98 Le 20 août 2016 à 18:33 (Édité le 1 janvier 1970 à 01:00)
<?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 Le 21 août 2016 à 12:55 (Édité le 1 janvier 1970 à 01:00)
(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 Le 21 août 2016 à 20:59 (Édité le 1 janvier 1970 à 01:00)
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)