Version complète: sur le forum Webmaster Hub : Traitement de formulaire
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
MarvinLeRouge
Salut,

Il mse semble que quelqu'un avait indiqué une méthode pour éviter les problèmes de renvoi des données post quand on recharge une page contenant un formulaire php ET son traitement. Mais je n'arrive plus à retrouver le thread en question.

Plizzzzz helpp blush.gif
lupucide
Tiens, je me posais la même question il y a peu de temps. La méthode m'intéresse aussi.
Compte supprimé
La solution est de faire une redirection aprés le traitement si le formulaire a été correctement rempli.
MarvinLeRouge
Tu pourrais détailler la méthode s'il te plait ?
Cas pratique : une page avec un formulaire de contact émettant un mail. L'internaute retombe sur la même page qui traite le formulaire et
a ) lui met un message si ça a marché
b ) lui met un message et remplis le formulaire s'il s'est trompé

Comment fais-tu pour détecter l'état du traitement si tu proviens d'une redirection ?
hcplayer
en traitant les données dans une autre page que la page qui affiche la ré"ponse (echec ou réussite) (pas dans la même) puis en redirigeant avec un header("location:...") vers la page qui affiche la réponse wink.gif
Portekoi
Même en fesant cela, si tu cliques sur actualiser, tu renverras les infos.

Sauf si la page de d'affichage du message est différente de la page de traitement et diférente de la page contenant le formulaire....

smile.gif
Compte supprimé
CITATION(hcplayer @ jeudi 07 juillet 2005, 10h35)
en traitant les données dans une autre page que la page qui affiche la ré"ponse (echec ou réussite) (pas dans la même) puis en redirigeant avec un header("location:...") vers la page qui affiche la réponse wink.gif
*


Non car avec cette méthode, difficile de transmettre les champs du formulaire (et ainsi éviter de tout reremplir)

La solution est :
cible du formulaire sur la même page, avec traitement au début de la page.
Si traitement incorect, on affiche le reste de la page avec les champs déjà remplis et les messages d'alerte qui vont bien.
si traitement ok, on redirige vers la page ok

capito ??
lupucide
Mais est-ce qu'il existe un moyen d'éviter l'effet du refresh sur mon formulaire ? Il est facile d'effectuer le traitement du formulaire par un script externe et faire une redirection mais alors, comment renvoyer mes données POST pour effectuer un affichage ?

formulaire.php => POST => traitement.php => POST => formulaire.php

Je suis preneur de toutes suggestions smile.gif
PoM_-
Moi je ne pense pas que t'as methode est la meilleur. Mon point de vu se tournerais plutot sur une methode utilisant deux pages.
L'une contenant le formulaire, l'autre les fonctions neccessaire a la verification du formulaire et à l'envoie.

-> Si tous les champs sont bon: Ok, on envoie le mail et on redirige sur la page du formulaire echo"Mail envoyé";
-> Si il manque des champs: Erreur, on met les champs deja remplit en session et on redirige vers la page d'envoie echo"Veuillez renseigner tous les champs";
-> Si tous les champs ok, alor qu'il y avait deja eu une erreur on efface les variable session. unset @$_SESSION['message'], etc....

Voila mon point de vu si vous desirez les sources je les mettrais.
PoM_-
CITATION(lupucide @ jeudi 07 juillet 2005, 09h56)
Mais est-ce qu'il existe un moyen d'éviter l'effet du refresh sur mon formulaire ? Il est facile d'effectuer le traitement du formulaire par un script externe et faire une redirection mais alors, comment renvoyer mes données POST pour effectuer un affichage ?

formulaire.php => POST => traitement.php => POST => formulaire.php

Je suis preneur de toutes suggestions smile.gif
*


Il faut utiliser les SESSIONs...
Compte supprimé
CITATION(lupucide @ jeudi 07 juillet 2005, 10h56)
Mais est-ce qu'il existe un moyen d'éviter l'effet du refresh sur mon formulaire ? Il est facile d'effectuer le traitement du formulaire par un script externe et faire une redirection mais alors, comment renvoyer mes données POST pour effectuer un affichage ?

formulaire.php => POST => traitement.php => POST => formulaire.php

Je suis preneur de toutes suggestions smile.gif
*


Ma méthode évite un refresh du formulaire.
Compte supprimé
CITATION(PoM_- @ jeudi 07 juillet 2005, 11h00)
Moi je ne pense pas que t'as methode est la meilleur.

Explique moi pourquoi ? (parce que moi je ne vois pas...)
Ta méthode oblige à se trainer des sessions, et en plus tu fais 2 redirections.
Moi j'ai pas de sessions, et au pire, une redirection.
PoM_-
Je n'ai qu'une redirection. Mais bon apres tout chaqun ca methode tongue.gif ! Tans que le résultat est là smile.gif.
Si il t'es possible de mettre tes source dans un zip et mettre le liens, je serais curieux de voir comment tu procède.
Compte supprimé
CITATION(PoM_- @ jeudi 07 juillet 2005, 14h29)
Je n'ai qu'une redirection. Mais bon apres tout chaqun ca methode tongue.gif ! Tans que le résultat est là smile.gif.
Si il t'es possible de mettre tes source dans un zip et mettre le liens, je serais curieux de voir comment tu procède.
*


Oui, sorry, une redirection mais 2 pages

Je fais tout simplement un truc du genre

CODE
<?php
// traitement du formulaire
if (isset($_POST['monchamp']))
    {
    // vérification des champs
    ....
    if ($verification_ok)
 {
 // traitement
 ....

 // redirection
 header ("formulaire_soumis.htm");
 exit();
 }
    }
?>

<!-- Formulaire -->
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<input type="text" name="monchamp" id="monchamp" value="<?php echo $_POST['monchamp'] ?>" />
<input type="submit" value="Envoyer" />
</form>
MarvinLeRouge
Et comme je souhaite que la personne retombe sur la même page, on a :
1) page formulaire_soumis = page formulaire
2) il faut donc faire passer l'état "ok" lors de la redirection

J'ai peut-être une idée :
a) nom de la page : formulaire.php
B) cible du formulaire : formulaire.php
c) si problème de traitement, on reremplit le formulaire en demandant de corriger. Donc la re-soumission se contentera de ré-afficher l'erreur
d) si traitement ok, on envoie le mail (ou on insère en bdd ou que sais-je), et on redirige vers formulaire_ok.php, qui utilise en fait un url-rewriting pour renvoyer sur formulaire.php?etat=ok

Voui je suis d'accord, c'est tordu wacko.gif IMSTP6.gif
Ceci dit, ça devrair marcher, non ?

(Pfft : bruit de claquage des liaisons dendritiques, avec étrange odeur de caramel)
PoM_-
CITATION
CODE
<?php
// traitement du formulaire
if (isset($_POST['monchamp']))
{
// vérification des champs
....
if ($verification_ok)
{
// traitement
....

// redirection
header ("formulaire_soumis.htm");
exit();
}
}
?>

<!-- Formulaire -->
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<input type="text" name="monchamp" id="monchamp" value="<?php echo $_POST['monchamp'] ?>" />
<input type="submit" value="Envoyer" />
</form>


Oui c'est pas mal. Mais tu as deux pages aussi tongue.gif ( formulaire_soumis.htm ).
De plus y a une erreur avec ton header la syntaxe est pas bonne : header("Location: formulaire_soumis.htm"); et ca ne marchera pas car le header est déjà pris par le formulaire html ( je ne suis pas sur de ca vu que le formulaire est apres le php ).

Mais on peut facilement faire qu'une page en rajoutant 2 lignes, comme suit :

CODE
<?php

//form.php
// traitement du formulaire
if (isset($_POST['monchamp']))
{
// vérification des champs
....
if ($verification_ok){

// traitement
....

//on vire les variables
unset($_POST['monchamp']);
// redirection
header ("form.php?send=ok");
exit();
}else{
 header ("form.php?send=no");
}
?>

<!-- Formulaire -->
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<input type="text" name="monchamp" id="monchamp" value="<?php echo [COLOR=red]@[/COLOR]$_POST['monchamp'] ?>" />
<input type="submit" value="Envoyer" />
</form><br><br>

<?
if($_GET['send'] == "ok"){
echo "Mail envoye avec succes!";
}if($_GET['send'] == "no"){
echo "Veuillez renseigner tous les champs!";
}
?>


Voila bon j'ai fais ca a la va vite, j'ai pas verifier, mais si y a des erreurs c'est des erreur de , ; " ' etc.. tongue.gif
lupucide
Je repose ma question car il me semble qu'elle n'a pas été bien comprise whistling.gif

Imaginons ma page (écrite vite fait, pour l'exemple) :
CODE
<?php
if (isset($_POST)) {
// Traitement du formulaire
}
?>

<html><body>

<form action="cette-page.php">
<input />
<form>

<?php echo $_POST; ?>

</body></html>


Si je passe par une nouvelle page pour le traitement, je ne pourrais pas renvoyer mes données en POST pour les afficher. Pour un exemple plus concret : premier lien en signature.

Je vais essayer un unset() après mon echo(), dès fois que...
PoM_-
Bin une fois que c'est posté, bien sur que si tu peux trimbaler tes variables de partout. Surtout comme sur le premier liens 'simplecode' dans ta signature il y a un seul chargement donc je crain ne pas comprendre quel est le probleme ..
lupucide
Et bien le problème vient du refresh de la page qui n'est pas très ergonomique, tout simplement rolleyes.gif
PoM_-
Pourquoi n'utilises tu pas les sessions ? C'est facile et efficace.. Comme ca tu n'auras plus de probleme avectes refresh.. non ?
Compte supprimé
CITATION(lupucide @ vendredi 08 juillet 2005, 09h54)
Et bien le problème vient du refresh de la page qui n'est pas très ergonomique, tout simplement rolleyes.gif
*


Pourquoi diable est-ce que tu n'utilise pas ma méthode ? angry.gif (ou alors je ne comprends rien)
PoM_-
mdr .. je crain ne pas comprendre non plus son probleme on lui a donné toutes les solutions possibles, les codes, il a plus qu'a faire copier/coller lol smile.gif
MarvinLeRouge
Bon ben moi j'vais vous laisser vous battre, et je vous dirais ce que donne mon idée tordue dès que je l'aurais testée. Et encore merci pour toutes ces options biggrin.gif
lupucide
CITATION(PoM_- @ vendredi 08 juillet 2005, 10h31)
mdr .. je crain ne pas comprendre non plus son probleme on lui a donné toutes les solutions possibles, les codes, il a plus qu'a faire copier/coller lol smile.gif
*


mdr aussi alors, sans vouloir vexer quelqu'un vos méthodes ne sont pas très explicites tongue.gif
Ce sont mes données POST qui sont traités pour être réaffichées sur la même page, une redirection perd ces données.

A moins que j'ai mal suivi, auquel cas je m'excuse humblement hypocrite.gif
lupucide
Hop, un double post pour la bonne cause et pour m'excuser de ma mauvaise foi whistling.gif

J'ai donc tester la méthode avec l'ouverture d'une session en deux pages, formulaire et traitement ; j'arrive désormais à faire passer mes données de l'une à l'autre. Merci de vos conseils.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.