PHP - Semaine 3 (TP) Openclassrooms [Résolu]

Messages postés
10
Date d'inscription
jeudi 16 août 2018
Statut
Membre
Dernière intervention
17 juillet 2019
- - Dernière réponse : ReadyPlayerOne
Messages postés
10
Date d'inscription
jeudi 16 août 2018
Statut
Membre
Dernière intervention
17 juillet 2019
- 17 juil. 2019 à 10:33
Bonjour à tous,
je suis actuellement le cours de Mathieu Nebra sur Php et Mysql sur Openclassrooms.
Je suis arrivé à la partie " activité 3 " , qui porte sur un " minichat".
Mes problèmes sont :
  • Je n'arrive pas a faire retenir le pseudo du visiteur
  • Je voudrais empêcher un envoie de "pseudo" et "message" vide par l'utilisateur.


Voici mon code pour "minichat.php"
<?
session_start()
$_SESSION['pseudo'] = $_POST['pseudo']




<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Le minichat</title>
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>
  
    <body>
  
    <form action="minichat_post.php" method="post">
        <p>
        <label for="pseudo">Votre pseudo</label> : <input type="text" name="pseudo" id="pseudo" /><br />
        <label for="message">Votre message</label> : <input type="text" name="message" id="message" /><br />
        <input type="submit"  value="Envoyez !" />
        </p>
    </form>
  
<?php
  
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8','root', '');
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
  

$reponse = $bdd->query('SELECT pseudo, message, DATE_FORMAT(date_creation, \'%d/%m/%Y %Hh%imin%ss\') AS date_creation_fr FROM minichat ORDER BY date_creation_fr DESC LIMIT 0, 10');

while($donnees = $reponse->fetch())

{
    echo ' <p> ' . htmlspecialchars($donnees['date_creation_fr']) .  ' : <strong> '  .  htmlspecialchars($_SESSION['pseudo']) . ' </strong> : '  . htmlspecialchars($donnees['message']) . ' </p> ';
}
 
$reponse->closeCursor();
?>
  
    </body>
</html>



Et pour "minichat_post.php":

<?
session_start()
$_SESSION['pseudo'] = $_POST['pseudo']
?>




<?php
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8','root', '');
	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
    die(' Erreur : ' .$e->getMessage());
}


$req = $bdd->prepare('INSERT INTO minichat (pseudo, message) VALUES(?, ?)');
$req->execute(array($_SESSION['pseudo'], $_POST['message']));


header('Location: minichat.php');
?>


Je vous remercie par avance pour votre aide ! Hâte de comprendre mes erreurs !
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
3455
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
14 août 2019
913
1
Merci
Bonjour,

Le soucis à première vue, c'est que la ligne
$_SESSION['pseudo'] = $_POST['pseudo']
est exécutée à chaque appel de la page, alors que, probablement, $_POST['pseudo'] n'est pas toujours mis.
Du coup l'éventuelle valeur de $_SESSION['pseudo'] est écrasée.

Je te suggère de vérifier que $_SESSION['pseudo'] n'a pas déjà été créé (et, tant qu'à faire, qu'à l'opposé $_POST['pseudo'] existe bien) en mettant :
if (!isset($_SESSION['pseudo']) && isset($_POST['pseudo']))
    $_SESSION['pseudo'] = $_POST['pseudo']

Xavier

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 58732 internautes nous ont dit merci ce mois-ci

Reivax962
Messages postés
3455
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
14 août 2019
913 -
Pardon, j'ai répondu beaucoup trop vite.

Ce que je te dis ne s'applique à la page minichat.php, puisque dans l'autre, $_POST est toujours mis. Quand tu fais la redirection, c'est comme si tu appelais une nouvelle page, donc $_POST est perdu.

De plus, il faut également que tu donnes la valeur par défaut au champ pseudo, en rappelant la valeur en session :
<input type="text" name="pseudo" id="pseudo" value="<?php echo $_SESSION['pseudo'];?>" /><br />

Xavier
Commenter la réponse de Reivax962
Messages postés
10
Date d'inscription
jeudi 16 août 2018
Statut
Membre
Dernière intervention
17 juillet 2019
0
Merci
Bonjour Xavier et merci pour ta réponse!
J'ai tenté de revoir mon code avec ce que tu m'as dit :
minichat:
<?
session_start()
$_SESSION['pseudo'] = $_POST['pseudo']
?>



<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Le minichat</title>
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>
  
    <body>
  
    <form action="minichat_post.php" method="post">
        <p>
        <label for="pseudo">Votre pseudo</label> : <input type="text" name="pseudo" id="pseudo" value="<?php echo $_SESSION['pseudo'];?>" /><br />
        <label for="message">Votre message</label> : <input type="text" name="message" id="message" /><br />
        <input type="submit"  value="Envoyez !" />
        </p>
    </form>
  
<?php
if (!isset($_SESSION['pseudo']) && isset($_POST['pseudo']))
    $_SESSION['pseudo'] = $_POST['pseudo']
{
    try
    {
    $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8','root', '');
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }   
    catch(Exception $e)
    {
    die('Erreur : '.$e->getMessage());
    }
  

    $reponse = $bdd->query('SELECT pseudo, message, DATE_FORMAT(date_creation, \'%d/%m/%Y %Hh%imin%ss\') AS date_creation_fr FROM minichat ORDER BY date_creation_fr DESC LIMIT 0, 10');

    while($donnees = $reponse->fetch())

    {
    echo ' <p> ' . htmlspecialchars($donnees['date_creation_fr']) .  ' : <strong> '  .  htmlspecialchars($_SESSION['pseudo']) . ' </strong> : '  . htmlspecialchars($donnees['message']) . ' </p> ';
    }
}
else
{
    header('Location: minichat.php');
}




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



minichat_post.php:
<?
session_start()
if (!isset($_SESSION['pseudo']) && isset($_POST['pseudo']))
    $_SESSION['pseudo'] = $_POST['pseudo']
?>




<?php
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8','root', '');
	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
    die(' Erreur : ' .$e->getMessage());
}


$req = $bdd->prepare('INSERT INTO minichat (pseudo, message) VALUES(?, ?)');
$req->execute(array($_SESSION['pseudo'], $_POST['message']));


header('Location: minichat.php');
?>


Cela ne fonctionne toujours pas, je pensais avoir " saisi " comment faire mais là je crois que je patauge ! help ! ^^
Reivax962
Messages postés
3455
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
14 août 2019
913 -
Ah ah, en effet, il manquait un mot à ma réponse, et t'as pas choisi le bon :p
J'ai écrit
 ne s'applique à la page minichat.php

Tu as lu
 ne s'applique pas à la page minichat.php

Il fallait lire
 ne s'applique qu'à la page minichat.php

Toutes mes excuses...
Commenter la réponse de ReadyPlayerOne
Messages postés
10
Date d'inscription
jeudi 16 août 2018
Statut
Membre
Dernière intervention
17 juillet 2019
0
Merci
Pas de problème c'est déjà gentil d'intervenir !
Je reprends:

minichat.php:
<?
session_start()
$_SESSION['pseudo'] = $_POST['pseudo']
?>



<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Le minichat</title>
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>
  
    <body>
  
    <form action="minichat_post.php" method="post">
        <p>
        <label for="pseudo">Votre pseudo</label> : <input type="text" name="pseudo" id="pseudo" value="<?php echo $_SESSION['pseudo'];?>" /><br />
        <label for="message">Votre message</label> : <input type="text" name="message" id="message" /><br />
        <input type="submit"  value="Envoyez !" />
        </p>
    </form>
  
<?php
if (!isset($_SESSION['pseudo']) && isset($_POST['pseudo']))
    $_SESSION['pseudo'] = $_POST['pseudo']
{
    try
    {
    $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8','root', '');
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }   
    catch(Exception $e)
    {
    die('Erreur : '.$e->getMessage());
    }
  

    $reponse = $bdd->query('SELECT pseudo, message, DATE_FORMAT(date_creation, \'%d/%m/%Y %Hh%imin%ss\') AS date_creation_fr FROM minichat ORDER BY date_creation_fr DESC LIMIT 0, 10');

    while($donnees = $reponse->fetch())

    {
    echo ' <p> ' . htmlspecialchars($donnees['date_creation_fr']) .  ' : <strong> '  .  htmlspecialchars($_SESSION['pseudo']) . ' </strong> : '  . htmlspecialchars($donnees['message']) . ' </p> ';
    }
}
else
{
    header('Location: minichat.php');
}




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


Et aussi minichat_post.php:
<?php
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8','root', '');
	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
    die(' Erreur : ' .$e->getMessage());
}


$req = $bdd->prepare('INSERT INTO minichat (pseudo, message) VALUES(?, ?)');
$req->execute(array($_POST['pseudo'], $_POST['message']));


header('Location: minichat.php');
?>


Du coup, cela me donne une parse error ligne 31 sur minichat.php... Peux tu m'éclairer stp ?
Reivax962
Messages postés
3455
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
14 août 2019
913 -
Bonjour,

Dans minichat.php, il n'y a jamais de $_POST
Donc $_SESSION['pseudo'] = $_POST['pseudo'] va systématiquement écraser ta session !
Il faut enlever cette ligne. L'affectation à la session dois se faire dans minichat_post, puisque c'est là qu'on connaît le pseudo entré par l'utilisateur. Mais tu en as enlevé les infos de session...

Voici ce que je mettrais pour tes fichiers :
minichat.php
<?php
    session_start();
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Le minichat</title>
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>
  
    <body>
  
    <form action="minichat_post.php" method="post">
        <p>
        <label for="pseudo">Votre pseudo</label> : <input type="text" name="pseudo" id="pseudo" value="<?php echo $_SESSION['pseudo'];?>" /><br />
        <label for="message">Votre message</label> : <input type="text" name="message" id="message" /><br />
        <input type="submit"  value="Envoyez !" />
        </p>
    </form>
  
<?php
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8','root', '');
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}   
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
  
$reponse = $bdd->query('SELECT pseudo, message, DATE_FORMAT(date_creation, \'%d/%m/%Y %Hh%imin%ss\') AS date_creation_fr FROM minichat ORDER BY date_creation_fr DESC LIMIT 0, 10');

while ($donnees = $reponse->fetch())
{
    echo ' <p> ' . htmlspecialchars($donnees['date_creation_fr']) .  ' : <strong> '  .  htmlspecialchars($_SESSION['pseudo']) . ' </strong> : '  . htmlspecialchars($donnees['message']) . ' </p> ';
}
$reponse->closeCursor();
?>
  
    </body>
</html>

minichat_post.php
<?php
session_start();
$_SESSION['pseudo'] = $_POST['pseudo'];

try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8','root', '');
	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
    die(' Erreur : ' .$e->getMessage());
}


$req = $bdd->prepare('INSERT INTO minichat (pseudo, message) VALUES(?, ?)');
$req->execute(array($_POST['pseudo'], $_POST['message']));


header('Location: minichat.php');
?>


J'ai simplifié, en partant du principe que tu ne POSTais jamais vers minichat.php mais seulement vers minichat_post.php, ce qui est le cas dans le code présent mais dépend aussi des éventuelles autres pages que tu as.

Xavier
Commenter la réponse de ReadyPlayerOne
Messages postés
10
Date d'inscription
jeudi 16 août 2018
Statut
Membre
Dernière intervention
17 juillet 2019
0
Merci
Merci beaucoup Xavier j'y vois plus clair dans le code !
Bonne journée!
Commenter la réponse de ReadyPlayerOne