Partage

soucis avec mes modifications du tp mini-chat

Sujet résolu
22 juin 2018 à 14:54:11

Bonjour ! Alors le tp dis entrez le pseudo , le msg et affichez la discussion (dans un ordre decroissant) les 10 derniers msg, moi j'ai voulu ajouter un détail: si l'utilisateur ne remplie pas le champ pseudo ou le champ msg je lui affiche un msg disant de le rentrer et je n'enregistre pas dans la base de donnée tant que les deux champs ne sont pas remplies. Mes je gelère trop :( voici mes codes et je ne comprend pas pourquoi ça ne marche pas ! malgré toute les conditions des lignes vides s'ajoutent dans ma base et ça affiche du vide ( : ) au lieu de (pseudo:msg) , où est le problème? :(
<?php //mini-chat-traiter.php
session_start();
if (isset($_POST['msg'])!=1) //j'ai mis non egale car apparament si $_POST['msg'] existe ça renvoie 1 sinon ça ne renvoie rien
	{
	    $_SESSION['msg'] = -1;//j'ai pas trouvé une maniere de renvoyer une variable à traiter selon ses valeur dans la page formulaire je ne vois pas comment utiliser la methode post ici ni get donc j opté pour une session
	    header('Location: mini-chat-formulaire.php');
	}
elseif (isset($_POST['pseudo'])!=1)
   	{
   		$_SESSION['pseudo'] = -2;
   		header('Location: mini-chat-formulaire.php');
   	} 
elseif(isset($_POST['msg']) AND isset($_POST['pseudo']))
	{
        $_SESSION['msg'] = 0;
        $_SESSION['pseudo'] = 0;
		try
		{
		// On se connecte à MySQL
		$bdd = new PDO('mysql:host=localhost;dbname=ma_base;charset=utf8', 'root', '');
		}
		catch(Exception $e)
		{
		// En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
		}
	$req = $bdd->prepare('INSERT INTO minichat(pseudo, msg) VALUES(:pseudo, :msg) ');
$req->execute(array(
	'pseudo' =>htmlspecialchars($_POST['pseudo']),
	'msg' => htmlspecialchars($_POST['msg']),
	));
		header('Location: mini-chat-formulaire.php');

	}
?>
<?php session_start();//mini-chat-formulaire.php  ?>
<!DOCTYPE html> 
<html>
    <head>
        <title>tinhi messagerie</title>
        <link rel="stylesheet" href="style.css" />
        <meta charset="utf-8" />
    </head>
    <body>
    	<form method="post" action="mini-chat-traiter.php" >
        <h1>CHATTER</h1>    
        	<label>pseudo</label></br>
        	<input type="text" name="pseudo"/></br>
        	<label>message</label></br>
        	<textarea name="msg"></textarea> 
        	<p><input type="submit" value="Envoyer"/></p>
        </form>
       <?php 
       if($_SESSION['msg'] == -1){echo"<p>Le message est vide tapez quelque chose!</p>";}
       elseif($_SESSION['pseudo'] ==-2){echo "<p>Renseignez votre pseudo.</p>";}
       else{
       try
        {
        // On se connecte à MySQL
        $bdd = new PDO('mysql:host=localhost;dbname=ma_base;charset=utf8', 'root', '');
        }
        catch(Exception $e)
        {
        // En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
        }
       $reponse = $bdd->query('SELECT * FROM minichat ORDER BY id DESC');
echo '<p>DISCUSSION:</p>';
echo '<ul>';
$i=0;
    while($donnees=$reponse->fetch() AND $i<10)
    {
    echo '<li>' . $donnees['pseudo'] . ' :' . $donnees['msg'].'</li>';
$i++;
}
echo '</ul>';

$reponse->closeCursor();}?>
    </body>
</html>


-
Edité par TinhiNane3 22 juin 2018 à 15:16:04

Vous êtes demandeur·se d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur·se web junior

Je postule
Formation
courte
Financée
à 100%
22 juin 2018 à 15:35:31

Hello, 

Je viens de reprendre ton code, l'ai modifié, et ai fait deux trois améliorations.

Je n'ai pas pu le tester, donc je ne garanti pas qu'il fonctionne du premier coup, à toi de voir. Je l'ai commenté aux maximum afin de t'aider. Essayes de comprendre la logique, et de modifier au besoin. N'hésites pas au besoin, postes ton problème ici.

<?php 
//On initialise les sessions et on lance la requête de récupération des messages
session_start();
try {
    $bdd = new PDO('mysql:host=localhost;dbname=ma_base;charset=utf8', 'root', '');
    $reponse = $bdd->query('SELECT * FROM minichat ORDER BY id DESC LIMIT 10');
    $donnees=$reponse->fetchAll();
} 
catch(Exception $e) {
    //En cas d'erreur, on affecte un message au tableau
    $_SESSION['err'] = "ERREUR PDO : ".$e->getMessage();
}
?>
<!DOCTYPE html>
<html>
    <head>
        <title>tinhi messagerie</title>
        <link rel="stylesheet" href="style.css" />
        <meta charset="utf-8" />
    </head>
    <body>
        <form method="post" action="mini-chat-traiter.php" >
        <h1>CHATTER</h1>   
            <label>pseudo</label></br>
            <input type="text" name="pseudo"/></br>
            <label>message</label></br>
            <textarea name="msg"></textarea>
            <p><input type="submit" value="Envoyer"/></p>
        </form>
       <?php
       //Ici on balaye le tableau d'erreur s'il existe et on les affiche
       if(isset($_SESSION['err']){
           foreach($_SESSION['err'] as $errmsg) {
               echo "<p>{$errmsg}</p>";
            }
            //Pour éviter tout soucis après, on efface tous les messages d'erreur
            unset($_SESSION['err']);
        }
        ?>
       <p>DISCUSSION :</p>
        <ul>
        <?php
        //Ici on affiche les 10 derniers messages sous forme de liste
            foreach($donnees as $message){
                echo '<li>' . $message['pseudo'] . ' :' . $message['msg'].'</li>';
            }
        ?>
        </ul>
    </body>
</html>
<?php
// On initialise les sessions
session_start();
//On vérifie indépendament que les champs soient remplis
//Si ils sont vides, on affecte une erreur dans un tableau de messages flash en session
if (empty($_POST['msg'])) {
    $_SESSION['err'] = "Le message est vide tapez quelque chose !";
}
if (empty($_POST['pseudo'])) {
     $_SESSION['err'] = "Renseignez votre pseudo.";
}
//Si notre tableau de message d'erreurs est vide, c'est que tout est bon, donc on continue
if(!isset($_SESSION['err'])) {
    $pseudo = $_POST['pseudo'];
    $msg = $_POST['msg'];
    //On fait un try catch sur toute la partie de requête
    try {
        $bdd = new PDO('mysql:host=localhost;dbname=ma_base;charset=utf8', 'root', '');
        $req = $bdd->prepare('INSERT INTO minichat(pseudo, msg) VALUES (:pseudo, :msg)');
        $req->bindValue(':pseudo', $pseudo, PDO::PARAM_STR);
        $req->bindValue(':msg', $msg, PDO::PARAM_STR);
        $req->execute();
    }
    catch(Exception $e) {
        //En cas d'erreur, on plante pas le script, mais on affecte un message dans le tableau
        $_SESSION['err'] = "ERREUR PDO : ".$e->getMessage();
    }
}
//On redirige sur la page mini-chat
header('Location: mini-chat-formulaire.php');
exit();




-
Edité par Ealon 22 juin 2018 à 15:52:49

Kwo:re / topic OC | Aidez les autres, indiquez un sujet résolu ! | Vous êtes bloqué ? Suivez le guide ! | N'aide pas par MP
22 juin 2018 à 15:39:43

C'est plutôt ?

if (empty($_POST['msg'])) {
    $_SESSION['err'] = "Le message est vide tapez quelque chose !";
}
if (empty($_POST['pseudo'])) {
     $_SESSION['err'] = "Renseignez votre pseudo.";
}

-
Edité par DevMercenaire 22 juin 2018 à 15:40:30

22 juin 2018 à 15:52:19

Ah oui, pardon !

Un peu trop rapide dans le post ... Je corrige également dans mon post !

Merci.

Kwo:re / topic OC | Aidez les autres, indiquez un sujet résolu ! | Vous êtes bloqué ? Suivez le guide ! | N'aide pas par MP
22 juin 2018 à 17:12:26

Merci pour votre aide! Ealon j'ai voulu essayer ton code mais ça m'indique cette erreur et je ne trouve pas à quoi elle est dû:

et c'est quoi la difference entre empty et !isset en fait?

et c'est quoi exactement le soucis avec mon code pourquoi ça ne marche pas comme j'ai fais c'est quoi l'erreur?

dans vos code il y a des fonctions et des methodes que je ne connais pas (j'arrive à comprendre ce que ça fait) car elle ne sont pas dans le cours, par exemple la façon de traiter les erreurs ça n'a pas du tt été bien expliqué dans le cours il n'y a pas de details juste la formule de die qu'on copie colle sans trop comprendre le fonctionnement.

OUUUGHA! ça fonctionne ! j'ai juste remplacer dans mon code mon bricolage avec isset par empty et dans la page du formulaire le elseif par if (pour traiter le 2eme meme si le 1er s'est réaliser) un pour le msg et l'autre pour le pseudo , au final mon code marche completement sans souci !

-
Edité par TinhiNane3 22 juin 2018 à 17:34:07

22 juin 2018 à 17:35:50

Alors, pour la précision sur isset() et empty() :

isset() cherche si la variable existe, si elle est définie. Quelle que soit sa valeur, si cette variable a été initialisée à un moment ou à un autre, cette fonction te renverra true (ou 1). Au contraire empty() cherche à savoir si la variable en question est vide, et te renverra true si c'est le cas.

Souvent, pour du test de formulaire, les cours donnent la façon !isset() pour savoir si des champs ne sont pas remplis. Cependant, il n'est pas impossible de se retrouver avec la variable du champ initialisée, mais vide ... Alors que empty() saura si cette variable existe, mais également si elle est vide.

Si tu cherches de la documentation sur le traitement des erreurs, je t'invite à te renseigner sur les messages flash (c'est ce que j'ai utilisé dans mon code) qui ressemblent beaucoup au final aux message en bas à gauche du forum quand on poste. Si c'est pour la gestion des erreurs PDO, il y à là encore de bons liens sur le net, mais je n'ai pas trop le temps de cherche en ce moment.

Kwo:re / topic OC | Aidez les autres, indiquez un sujet résolu ! | Vous êtes bloqué ? Suivez le guide ! | N'aide pas par MP
22 juin 2018 à 17:40:24

oui merci pour toute ces indications je chercherai !

soucis avec mes modifications du tp mini-chat

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown