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

A voir également:Php - semaine 3 (tp) openclassroomsProblème fonction obsolette sous PHP 5.3 ✓ - Forum - PHP Php 5.3 migration vers serveur ✓ - Forum - PHP Cherche hosting pour PHP 5.3 et Mysql 5 ✓ - Forum - PHP Joomla et php 5.3 ✓ - Forum - PHP Installé apache 2.0.63 / php 4.3.9 et mysql ✓ - Forum - Linux / Unix

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 !

Forum

A voir également:Php - semaine 3 (tp) openclassroomsProblème fonction obsolette sous PHP 5.3 ✓ - Forum - PHP Php 5.3 migration vers serveur ✓ - Forum - PHP Cherche hosting pour PHP 5.3 et Mysql 5 ✓ - Forum - PHP Joomla et php 5.3 ✓ - Forum - PHP Installé apache 2.0.63 / php 4.3.9 et mysql ✓ - Forum - Linux / Unix

Web: www.shapebootstrap.net

4 réponses

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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 55309 internautes nous ont dit merci ce mois-ci

Reply
réponses:
  • auteur

    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

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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 ! ^^

Reply
réponses:
  • auteur

    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...

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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 ?

Reply
réponses:
  • auteur

    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

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

Merci beaucoup Xavier j'y vois plus clair dans le code !
Bonne journée!

Reply

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed