Problème de Messages doubles dans mon livre d'or

Eléphanteau du PHP | 10 Messages

09 août 2006, 21:24

Bonjour,

Je viens de réaliser un livre d'or en php mais j'ai un petit problème:
Quand j'actualise la page pour voir s'il y a de nouveaux messages, le navigateur me demande s'il doit renvoyer les informations.
Si je dis "oui", alors le message qu'il vient d'envoyer sera réenvoyé, ce qui fait qu'il apparaîtra en double !
Comment faire pour eviter que cela n'arrive?
Voici mon code php:
 
    
if (isset($_POST['message']) AND isset($_POST['pseudo']))
{

  if (trim($_POST['message']) != NULL AND ($_POST['pseudo']) != NULL )
  {

       if($message != $donneestest['message']) // eliminer les messages  doubles
       {
       $test = mysql_query("SELECT * FROM livre ORDER BY id DESC LIMIT    0,1") or die (mysql_error());
       $donneestest = mysql_fetch_array($test);
       $pseudo = htmlentities ($_POST['pseudo'], ENT_QUOTES);
       $message = htmlentities ($_POST['message'], ENT_QUOTES);
       $message = nl2br($message);

        mysql_query("INSERT INTO livre VALUES('', ' " .$pseudo. " ', ' " .$message. " ')");
       }

   }
} 

Le code ci-dessus ne marchant pas, je viens demander de l'aide.
Merci d'avance.

Eléphant du PHP | 441 Messages

10 août 2006, 09:40

Pourquoi tu réactualises aussi ? tu fais dans la même page?
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 août 2006, 09:58

C'est normal, si tu actualises une page qui a nécessité les données d'un formulaire en POST pour s'ouvrir, il te demande si tu veux les renvoyer pour pouvoir ouvrir exactement la même page aevc les mêmes informations... et si tu dis oui, ben forcément il les renvois ;)

Tu auras également ce problème en faisant précédent/suivant puisque tu reviens sur la même page.

Pour éviter cela, on recommande d'utiliser le pattern "PRG : Post Redirect Get". L'idée est de récupérer les données reçues en "post", faire le traitement (dans ton cas ecrire dans ton livre d'or) puis rediriger l'utilisateur (avec la fonction header() nottamment) vers une page (ça peut être la même) appellée en "get" pour lui passer les éléments éventuels dont elle a besoin.

Ainsi, lorsque que actualises ou revient sur la page, c'est celle qui a été ouverte après la redirection qui s'actualise (donc pas de double post, pas de message de confirmation etc.)
Tu peux faire une petite recherche sur le forum si tu veux trouver un peu plus d'infos sur ce principe de fonctionnement :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 août 2006, 09:59

La solution bateau est, effectivement, de séparer la page qui affiche le livre d'or de celle qui l'enregistre.

Donc, à l'enregistrement d'un nouveau message, tu passes dans le script d'enregistrement et, à la fin de l'enregistrement, tu rediriges vers l'affichage.

Cette solution permet que, si tu raffraichis, tu ne refait que l'affichage
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 353 Messages

10 août 2006, 10:04

Petite question ! vis-à-vis de ce problème !! Si dans le bas de la page on fais un unset($_POST) ! es-ce que ça peut résoudre le problème ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 août 2006, 10:16

Non, parce que, quand tu revalides la page, c'est le navigateur qui renvoi les données au serveur.

Le unset n'a comme effet de supprimet les POST qui se trouvent sur le serveur ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 353 Messages

10 août 2006, 10:20

ok merci pour l'info , je suis encore moi bête aujourd'hui !! ca fait plaisir ;)