PHP - Semaine 3 (TP) Openclassrooms

Résolu
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 !

4 réponses

  1. Merci beaucoup Xavier j'y vois plus clair dans le code !
    Bonne journée!
    1. 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 ?
      1. 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
    2. 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 ! ^^
      1. 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...
    3. 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
      1. 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