PHP - Semaine 3 (TP) Openclassrooms

Résolu
ReadyPlayerOne Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
ReadyPlayerOne Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -
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. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    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
    1. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      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
      0
  2. ReadyPlayerOne Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
     
    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 ! ^^
    0
    1. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      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...
      0
  3. ReadyPlayerOne Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
     
    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 ?
    0
    1. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      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
      0
  4. ReadyPlayerOne Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
     
    Merci beaucoup Xavier j'y vois plus clair dans le code !
    Bonne journée!
    0