[PHP] Comment éviter qu'un formulaire se vide si on revient ? [Résolu]

Comment éviter qu'un formulaire se vide si on revient ? [Résolu] [PHP] - PHP - Programmation

Marsh Posté le 18-03-2006 à 06:39:56    

EDIT : résolu grâce à session_cache_limiter('private, must-revalidate'); à mettre au tout début (avant session_start(); qui était la 1ère ligne du premier fichier inclus)
 
 
Bonjour,
 
Je suis en train de programmer un forum (il fonctionne déjà) mais j'ai un petit problème d'ordre pratique...
 
Prenons un cas concret. Imaginons qu'on veuille créer un nouveau sujet.
Il faut saisir un titre et un message dans un formulaire.
Si un de ces deux éléments est vide, on affiche une page d'erreur invitant l'utilisateur à cliquer sur le bouton "Page précédente" de son navigateur et à compléter son formulaire.
Mon problème est le suivant : quand je clique sur "Page précédente", mon formulaire est devenu vide !
Très frustrant pour un membre qui aurait tapé un long message et aurait bêtement oublié de taper un titre.
 
Cas encore plus simple : je tape un message puis, sans l'envoyer, je clique sur "Page précédente" puis sur "Page suivante". Là encore mon formulaire s'est vidé. :(
Je précise que si on fait ça sur Hfr ou à peu près n'importe quel autre forum le contenu du formulaire n'est pas vidé, donc il y a bien un moyen (mais j'ai beau étudier le code source des pages générées par ces forums, je ne vois pas ce qui fait la différence).
 
Si ça peut vous aider à y voir plus clair, voici le code de la page de mon formulaire :

Code :
  1. <?php
  2.   session_cache_limiter('private, must-revalidate');  // <== C'EST CETTE LIGNE QUI A CORRIGE MON PROBLEME
  3.   require("veriflogin.php" );
  4.   echo '<?xml version="1.0" encoding="ISO-8859-1" ?>';
  5. ?>
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  7. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  8. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr-FR">
  9. <head>
  10.   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  11.   <meta http-equiv="content-language" content="fr-FR" />
  12.   <meta name="language" content="fr-FR" />
  13.   <link rel="stylesheet" href="style.css" type="text/css" />
  14.   <title><?php require('param.php'); print $titreforum; ?> - Créer un nouveau sujet</title>
  15. </head>
  16. <body>
  17.   <?php
  18.     require('banner.php');
  19.     $idsection = $_GET['s'];
  20.     print '<form method="post" name="formnouvtopic" action="posttopic.php?s='.$idsection.'">';
  21.   ?>
  22.     <table>
  23.       <tr>
  24.         <td width="100px">Titre</td>
  25.         <td><input type="text" maxlength="80" name="titre"></td>
  26.       </tr>
  27.       <tr>
  28.         <td>Sous-titre</td>
  29.         <td><input type="text" maxlength="80" name="soustitre"></td>
  30.       </tr>
  31.       <tr>
  32.         <td><input type="submit" name="bouton" value="Envoyer"></td>
  33.         <td><textarea name="message" rows="16" cols="80"></textarea></td>
  34.       </tr>
  35.     </table>
  36.     <script language="JavaScript" type="text/javascript">
  37.       document.formnouvtopic.titre.focus();
  38.     </script>
  39.   </form>
  40. </body>
  41. </html>


 
Et voici le code appelé pour gérer les données postées dans le formulaire :

Code :
  1. <?php
  2.   require("veriflogin.php" );
  3.   if ($_POST['titre']=='')
  4.   {
  5.     header('location: error.php?err=3'); // Veuillez donner un titre à votre message.
  6.     exit;
  7.   }
  8.   if ($_POST['message']=='')
  9.   {
  10.     header('location: error.php?err=4'); // Veuillez saisir un message.
  11.     exit;
  12.   }
  13.   /*
  14.     Ici je procède à d'autres tests, je crée le topic et j'ajoute le message dans la base de données
  15.     ... Mais je vire pour abréger ce post.
  16.   */
  17.  
  18.   // Tout s'est bien passé, on affiche le topic
  19.   header('location: readtopic.php?t='.$idtopic);
  20. ?>


 
Et si vous voulez voir par vous-même ce que ça fait sur mon forum, c'est ici (mais faut s'inscrire :o) :
http://xmanvip.free.fr/foruxm


Message édité par xman le 22-03-2006 à 19:59:27
Reply

Marsh Posté le 18-03-2006 à 06:39:56   

Reply

Marsh Posté le 18-03-2006 à 10:31:47    

au lieu de proposer un retour en arrière (chose que je trouve très irritante sur un site) réaffiche directement le formulaire avec les données entrée à l'aide de la variable $_POST ;)
 
et tu insère si nécéssaire un petit message d'erreur...

Reply

Marsh Posté le 18-03-2006 à 11:26:06    

Tu réaffiche la même page, avec les cases déjà complétées avec les variables POST et les titre de champs en rouge et un message d invite.
genre:

Code :
  1. if($bouton_ok && (!$titre || !$message)) // afficher invite
  2. else // tout s est bien passé
  3. if($bouton_ok && !$titre) // afficher titre en rouge
  4. if($bouton_ok && !$message) // afficher message en rouge


 
Une approche complémentaire est d utiliser javascript:

Code :
  1. <input type=submit ... onclick="javascript: if(document.form1.titre.length()!=0) alert(...); else document.form1.submit(); return false;">


qui affiche un message d erreur javascript (un ptit popup) si le titre est vide, sinon soumet le formulaire.
 

Reply

Marsh Posté le 18-03-2006 à 16:19:05    

Je suis plutôt d'accord avec vous dans le cadre de mon premier exemple mais comment expliquez-vous le 2ème exemple ?
Sur tous les sites, le navigateur (FF ou IE c'est idem) se souvient de ce qu'on a commencé à taper ; mais sur mon site, ça vide.


Message édité par xman le 18-03-2006 à 16:19:20
Reply

Marsh Posté le 18-03-2006 à 16:29:33    

ca se vide sur le tiens parceque tu as changé de page. Ce que tu peux faire aussi cest mettre un lien vers history.back(); qui gardera le formulaire. (revient au meme que de cliquer sur precedent)


Message édité par h4rold le 18-03-2006 à 16:29:52
Reply

Marsh Posté le 18-03-2006 à 16:42:40    

Ben justement sur ma page d'erreur, j'ai un lien history.back(); mais ça fait pareil qu'on clique dessus ou sur le bouton Back du navigateur.
Mais faites comme si je n'avais pas donné le 1er exemple et concentrez-vous s'il vous plait sur le 2ème. ;)

Message cité 1 fois
Message édité par xman le 18-03-2006 à 16:43:09
Reply

Marsh Posté le 18-03-2006 à 16:43:36    

xman a écrit :

Ben justement sur ma page d'erreur, j'ai un lien history.back(); mais ça fait pareil qu'on clique dessus ou sur le bouton Back du navigateur.
Mais faites comme si je n'avais pas donné le 1er exemple et concentrez-vous s'il vous plait sur le 2ème. ;)


 
 :lol:


Message édité par h4rold le 18-03-2006 à 16:43:51
Reply

Marsh Posté le 18-03-2006 à 16:53:51    

On se calme, j'en vois qui bavardent au fond. :o :D

Reply

Marsh Posté le 18-03-2006 à 20:26:58    

En ce qui me concerne j'utilise les sessions pour gérer ça.
 
Lors de la validation du formulaire, j'ai une page de verification des champs (que l'adresse email soit bonne, que les cases soient remplies, que le numéro de tel fasse bien 10 chiffres etc...).
 
A la fin de mes tests, s'il y a 1 ou plusieurs erreurs, je stocke mon $_POST dans une session et je redirige vers ma page de formulaire. Sur cette derniere j'ai une portion de code qui detecte la session d'erreur et qui rempli donc les champs en conséquence.


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 18-03-2006 à 20:32:08    

Je pense que c'est la meilleure solution pour mon 1er exemple (j'étais justement en train d'envisager de le faire)
MAIS ça ne répond toujours pas à mon 2ème cas.

Reply

Marsh Posté le 18-03-2006 à 20:32:08   

Reply

Marsh Posté le 18-03-2006 à 21:27:12    

Aucune idée, j'ai été voir, on dirait que la page se recharge quand on fait precedent + suivant.
 
Edit : En même temps ... quelle idée d'aller faire precedent pendant qu'on tape un message :whistle:


Message édité par Dj YeLL le 18-03-2006 à 21:28:16

---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 18-03-2006 à 21:34:44    

Ben, sur ma souris, y'a des boutons latéraux pour faire "Page précédente" ou "Page suivante" et des fois je clique dessus sans faire exprès. [:tinostar]

Reply

Marsh Posté le 18-03-2006 à 21:35:28    

:lol:
 
Aucune idée en tout cas, va peut être voir du coté des balise meta de cache :??:


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 18-03-2006 à 22:52:11    

J'ai trouvé une piste.
Dans mon code j'inclue veriflogin.php (pour vérifier que l'utilisateur est connecté, sinon, je le redirige vers la page de login au lieu de lui permettre de poster) ainsi que banner.php (pour afficher l'entête du forum et un lien pour se déconnecter si l'on est connecté).
 
Or, ces deux fichiers contiennent l'instruction session_start();
 
Si supprime l'insertion de ces fichiers (chose que je ne veux pas faire mais que j'ai fait, juste pour tester), alors mon formulaire n'est plus effacé...
 
EDIT : et si je vire l'inclusion de ces fichiers MAIS que je mets juste un session_start(); au début de mon code, ça vide aussi le formulaire.
Donc c'est session_start(); qui vide mon formulaire.
Il faut donc que je trouve un moyen pour que session_start(); ne vide pas ou bien que je me passe de session_start(); sur cette page mais là ça va être chaud.


Message édité par xman le 18-03-2006 à 22:57:39
Reply

Marsh Posté le 19-03-2006 à 03:29:47    

Ouf ! J'ai trouvé ! (en partie grace à Yell qui m'a fait chercher des trucs avec "cache" comme mot clé et d'autre part avec le fait que j'ai trouvé que ça venait de la session)
 
Il faut mettre la ligne suivante au tout début de mon fichier contenant le formulaire :
session_cache_limiter('private_no_expire');


Message édité par xman le 19-03-2006 à 03:44:47
Reply

Marsh Posté le 19-03-2006 à 09:03:04    

Tant mieux :)
 
A+


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 22-03-2006 à 19:58:46    

Finalement, il semble qu'il vaut mieux la ligne suivante :
 
session_cache_limiter('private, must-revalidate');


Message édité par xman le 22-03-2006 à 20:02:14
Reply

Sujets relatifs:

Leave a Replay

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