Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
903 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1327724
xman
branleur
Posté le 18-03-2006 à 06:39:56  profilanswer
 

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
mood
Publicité
Posté le 18-03-2006 à 06:39:56  profilanswer
 

n°1327749
Gat$
http://www.wowteamfinder.com
Posté le 18-03-2006 à 10:31:47  profilanswer
 

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

n°1327772
nargy
Posté le 18-03-2006 à 11:26:06  profilanswer
 

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.
 

n°1327873
xman
branleur
Posté le 18-03-2006 à 16:19:05  profilanswer
 

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
n°1327879
h4rold
Posté le 18-03-2006 à 16:29:33  profilanswer
 

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
n°1327881
xman
branleur
Posté le 18-03-2006 à 16:42:40  profilanswer
 

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
n°1327882
h4rold
Posté le 18-03-2006 à 16:43:36  profilanswer
 

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
n°1327889
xman
branleur
Posté le 18-03-2006 à 16:53:51  profilanswer
 

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

n°1327941
Dj YeLL
$question = $to_be || !$to_be;
Posté le 18-03-2006 à 20:26:58  profilanswer
 

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
n°1327942
xman
branleur
Posté le 18-03-2006 à 20:32:08  profilanswer
 

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.

mood
Publicité
Posté le 18-03-2006 à 20:32:08  profilanswer
 

n°1327960
Dj YeLL
$question = $to_be || !$to_be;
Posté le 18-03-2006 à 21:27:12  profilanswer
 

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
n°1327967
xman
branleur
Posté le 18-03-2006 à 21:34:44  profilanswer
 

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]

n°1327968
Dj YeLL
$question = $to_be || !$to_be;
Posté le 18-03-2006 à 21:35:28  profilanswer
 

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


---------------
Gamertag: CoteBlack YeLL
n°1328012
xman
branleur
Posté le 18-03-2006 à 22:52:11  profilanswer
 

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
n°1328139
xman
branleur
Posté le 19-03-2006 à 03:29:47  profilanswer
 

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
n°1328175
Dj YeLL
$question = $to_be || !$to_be;
Posté le 19-03-2006 à 09:03:04  profilanswer
 

Tant mieux :)
 
A+


---------------
Gamertag: CoteBlack YeLL
n°1330524
xman
branleur
Posté le 22-03-2006 à 19:58:46  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
Lien wmv et fenetre vide[PHP] erreur
[PHP/SQL] erreur sql[resolu] suppression caracteres invisibles retour charriot
[Résolu] Erreur internet explorer sur forum phpbbFormulaire : editer et aperçu mais comment ?
[résolu] strtok, ou comment prendre ce qu'il ya apres un espace[Sécurité] CrossScripting, SQL injection comment les éviter
[Résolu] Changement de port sur une page webCherche programmeur en PHP/MySQL
Plus de sujets relatifs à : [PHP] Comment éviter qu'un formulaire se vide si on revient ? [Résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR