OVH Cloud OVH Cloud

Validation de formulaires enchaines

15 réponses
Avatar
Denis Bitouze
Bonjour,

je suis en train de me plonger dans PHP et suis sur le point de
finaliser un projet modeste pour lequel je me suis aidé du livre « PHP
& MySQL, Développement de sites Web » de Larry Ullman.

Mon problème est que, si je parviens sans problème à tester la
validité d'un formulaire côté serveur si le script « s'appelle
lui-même », je ne pas comment procéder si le script en appelle un
autre lorsque l'utilisateur appuie sur le bouton de type « submit
». Pour résumer, voici la structure de mon code :

<?php
// script script_php_1.php

if (isset($_POST['submit'])) { // Si le formulaire a été soumis

$message = NULL;

if ($_POST['champ1'] pas OK){
$champ1 = FALSE;
$message .= "<p>Le champ 1 ne va pas</p>";
}
else {
$champ1 = escape_data($_POST['champ1']);
}

if ($_POST['champ2'] pas OK){
$champ2 = FALSE;
$message .= "<p>Le champ 2 ne va pas</p>";
}
else {
$champ2 = escape_data($_POST['champ2']);
}

if ($message==NULL) { // Tout est OK
$_SESSION['champ1'] = $champ1;
$_SESSION['champ2'] = $champ2;
}
else { // L'un des deux champs au moins ne va pas
echo "$message";
}
}
?>

<!-- <form action="<?php $_SERVER['PHP_SELF']?>" method='post'> -->
<form action='script_php_2' method='post'>
Champ 1 : <input type='text' name='champ1' /> <br />
Champ 2 : <input type='text' name='champ2' /> <br />
<input type='submit' name='submit' value='OK' /><br />
</form>


Lorsque j'utilise :

<form action="<?php $_SERVER['PHP_SELF']?>" method='post'>

à la place de :

<form action='script_php_2' method='post'>

tout va bien mais, dans le cas contraire (celui du script ci-dessus),
l'utilisateur arrive au script script_php_2.php avec des champs champs
champ1 et
champ2 éventuellement non valides, sans qu'il en ait été empêché.

J'ai eu beau chercher dans les forums (où il y a pléthore de fils au
sujet de la validation de formulaires) et les divers tutoriaux du Web,
je n'ai rien trouvé lorsque, donc, le formulaire appelle un autre
script.

Merci d'avance pour toute indication.
--
Denis

10 réponses

1 2
Avatar
Bruno Desthuilliers
Denis Bitouze wrote:
Bonjour,

je suis en train de me plonger dans PHP et suis sur le point de
finaliser un projet modeste pour lequel je me suis aidé du livre « PHP
& MySQL, Développement de sites Web » de Larry Ullman.

Mon problème est que, si je parviens sans problème à tester la
validité d'un formulaire côté serveur si le script « s'appelle
lui-même », je ne pas comment procéder si le script en appelle un
autre lorsque l'utilisateur appuie sur le bouton de type « submit
».


En mettant la validation dans le script appelé, ça marcherait
probablement mieux...

(snip code)


Lorsque j'utilise :

<form action="<?php $_SERVER['PHP_SELF']?>" method='post'>

à la place de :

<form action='script_php_2' method='post'>

tout va bien mais, dans le cas contraire (celui du script ci-dessus),
l'utilisateur arrive au script script_php_2.php


C'est normal, c'est toi qui l'y envoie.

avec des champs champs
champ1 et
champ2 éventuellement non valides, sans qu'il en ait été empêché.

J'ai eu beau chercher dans les forums (où il y a pléthore de fils au
sujet de la validation de formulaires) et les divers tutoriaux du Web,
je n'ai rien trouvé lorsque, donc, le formulaire appelle un autre
script.


Ce n'est pas un problème de "même" ou "d'autre" script. Un formulaire
est posté à l'adresse indiquée dans l'attribut "action" du formulaire,
point barre. Que cette adresse corresponde ou non au script ayant généré
le formulaire est sans la moindre incidence.

La solution consiste bien sûr à disjoindre le script effectuant la
validation de celui affichant le formulaire [1] - libre au premier de
faire un include du second, ou de prendre toute autre action appropriée
(ce qui peut être par exemple fonction d'un champ - caché - du
formulaire, si le même script de validation doit être utilisable dans
plusieurs contextes).

[1] ce qui devrait être de toutes façons le cas si l'on s'applique à
séparer les traitements de la présentation.


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Denis Bitouze
Le 26 sep 2006 à 12h25

En mettant la validation dans le script appelé, ça marcherait
probablement mieux...


Mon souci est de faire en sorte que, tant que le formulaire n'est pas
validé, l'utilisateur « reste » sur la page qui affiche ce formulaire
(avec, en plus, un message indiquant ce qui ne va pas) et que, une
fois le formulaire validé, il soit envoyé sur le second script. Or, si
« la validation [a lieu] dans le script appelé » (ce que j'appelle le
second script si j'ai bien compris), c'est un peu tard pour afficher à
nouveau le formulaire non validé, non ? Je précise que, sur la
deuxième page sur laquelle arrive l'utilisateur une fois le (premier)
formulaire validé, se trouve un second formulaire dont les champs
dépendent de ce qui a été saisi sur le premier formulaire.

Lorsque j'utilise :

<form action="<?php $_SERVER['PHP_SELF']?>" method='post'>

à la place de :

<form action='script_php_2' method='post'>

tout va bien mais, dans le cas contraire (celui du script
ci-dessus), l'utilisateur arrive au script script_php_2.php


C'est normal, c'est toi qui l'y envoie.


Oui, ça, j'avais remarqué ;)

Je vais examiner en détail les pistes de disjonction du script
effectuant la
validation de celui affichant le formulaire (j'aime la séparation
fond/forme ;)

Merci !
--
Denis


Avatar
Bruno Desthuilliers
Denis Bitouze wrote:
Le 26 sep 2006 à 12h25

En mettant la validation dans le script appelé, ça marcherait
probablement mieux...


Mon souci est de faire en sorte que, tant que le formulaire n'est pas
validé, l'utilisateur « reste » sur la page qui affiche ce formulaire
(avec, en plus, un message indiquant ce qui ne va pas) et que, une
fois le formulaire validé, il soit envoyé sur le second script. Or, si
« la validation [a lieu] dans le script appelé » (ce que j'appelle le
second script si j'ai bien compris), c'est un peu tard pour afficher à
nouveau le formulaire non validé, non ?


Bon, reprenons... Il n'est en rien nécessaire que ce soit le même
*script* (ie: script != page) qui se charge de l'affichage et du
traitement du formulaire. Le second (appellons le "traitement.php") peut
très bien, selon que la saisie est ok ou pas, soit inclure un autre
script (par exemple celui qui génère le formulaire), soit rediriger vers
une autre page.


Je précise que, sur la
deuxième page sur laquelle arrive l'utilisateur une fois le (premier)
formulaire validé, se trouve un second formulaire dont les champs
dépendent de ce qui a été saisi sur le premier formulaire.


Oui, c'est un "wizard". Raison de plus pour séparer la validation de la
génération.

Une solution possible est d'avoir
- un controleur principal pour tout le wizard, qui se charge, selon
l'étape en cours, d'envoyer vers l'étape suivante
- un jeu de scripts de génération de formulaire
- un jeu de fonctions de validations.


Le controleur principal peut être très simple en fait:

<?php
if (la_methode_http == "POST") {
$etape = $_POST['etape'];
if (!empty($etape)) {
inclure("traitements/etape{$etape}.php");
// chaque fichier traitements/etapeXXX.php définit
// une fonction ValiderEtape() qui fait la validation
// et positionne les variables qui vont bien
if (ValiderEtape()) {
$etape +=1;
}
}
}
if (empty($etape)) {
$etape = 1;
}
include("forms/etape{$etape}.php);
?>

Tu peux éventuellement améliorer le principe en faisant en sorte que ce
soit le ValiderEtape qui détermine l'étape suivante en fonction des
choix déjà effectués, voire construire une machine à état pour gérer le
tout...


HTH

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
David JOURAND
Le Tue, 26 Sep 2006 15:36:56 +0000, Denis Bitouze a écrit :

Mon souci est de faire en sorte que, tant que le formulaire n'est pas
validé, l'utilisateur « reste » sur la page qui affiche ce formulaire
(avec, en plus, un message indiquant ce qui ne va pas) et que, une fois le
formulaire validé, il soit envoyé sur le second script. Or, si « la
validation [a lieu] dans le script appelé » (ce que j'appelle le second
script si j'ai bien compris), c'est un peu tard pour afficher à nouveau
le formulaire non validé, non ? Je précise que, sur la deuxième page
sur laquelle arrive l'utilisateur une fois le (premier) formulaire
validé, se trouve un second formulaire dont les champs dépendent de ce
qui a été saisi sur le premier formulaire.


index1.php :

if (formulaire1 pas bon) {
include('form1.php');
} else {
include('form2.php');
}


form1.php :

<form action='index1.php' method='post'>


form2.php :

<form action='index2.php' method='post'>


index2.php :

if (formulaire2 pas bon) {
include('form2.php');
} else {
include('done.php');
}


done.php :

Terminer !


Pour une solution plus élaborée : framework MVC.


--
David JOURAND - http://www.numabilis.com
Supprimer "site." et ".invalid" de mon adresse mail pour me répondre.

Avatar
Denis Bitouze
Le 26 sep 2006 à 20h56

soit rediriger vers
une autre page.


J'avais songé à cela mais le seul outil que j'ai trouvé pour rediriger
vers une autre page est headers mais, avec ça, je ne parvenais pas à
conserver les données qui avaient été saisies dans le premier
formulaire. Y a-t-il une autre possibilité pour rediriger vers une
autre page ?

En attendant, j'examine la solution que tu proposes.

Merci !
--
Denis

Avatar
Denis Bitouze
Le 26 sep 2006 à 20h56

[...]
Terminer !


OK, j'examine cela...

Pour une solution plus élaborée : framework MVC.


Houla, j'ai jeté un coup d'oeil mais je n'ai plus le temps de me
plonger là dedans (dommage, si j'avais eu connaissance de cela au
début, j'aurais essayé).

Merci !
--
Denis

Avatar
Bruno Desthuilliers
Denis Bitouze wrote:
Le 26 sep 2006 à 20h56

soit rediriger vers
une autre page.


J'avais songé à cela mais le seul outil que j'ai trouvé pour rediriger
vers une autre page est headers mais, avec ça, je ne parvenais pas à
conserver les données qui avaient été saisies dans le premier
formulaire.


Pour ça, il faudrait utiliser les sessions. Mais tu n'en n'a pas besoin
ici - il te suffit, dans chaque formulaire "d'étape", de stocker les
saisies déjà validées dans des champs cachés.

Y a-t-il une autre possibilité pour rediriger vers une
autre page ?


En PHP ? Pas à ma connaissance (je parles bien de redirection HTTP).

En attendant, j'examine la solution que tu proposes.

Merci !


De rien.

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
Denis Bitouze
Le 27 sep 2006 à 11h31

Pour ça, il faudrait utiliser les sessions. Mais tu n'en n'a pas
besoin ici - il te suffit, dans chaque formulaire "d'étape", de
stocker les saisies déjà validées dans des champs cachés.


Justement, je stocke mes variables dans la variable (globale je crois)
$_SESSION ainsi :

$_SESSION['variable1'] = valeur1
$_SESSION['variable2'] = valeur2
...

mais je ne sais pas si c'est préférable ou pas au stockage dans des
champs cachés (il n'y a rien de confidentiel dans ces variables).

Y a-t-il une autre possibilité pour rediriger vers une
autre page ?


En PHP ? Pas à ma connaissance (je parles bien de redirection HTTP).


Euh oui, en PHP. Tu pensais à autre chose ?
--
Denis


Avatar
Bruno Desthuilliers
Denis Bitouze wrote:
Le 26 sep 2006 à 20h56

[...]
Terminer !


OK, j'examine cela...

Pour une solution plus élaborée : framework MVC.


Houla, j'ai jeté un coup d'oeil mais je n'ai plus le temps de me
plonger là dedans (dommage, si j'avais eu connaissance de cela au
début, j'aurais essayé).


Pas besoin de POO ni de gros framework pour mettre en place une archi
MVC en PHP. Ca se gère aussi bien avec des scripts et des includes, sur
le même principe qu'évoqué dans le post de David ou le mien (voir aussi
le thread sur "les limites de PHP").


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
Bruno Desthuilliers
Denis Bitouze wrote:
Le 27 sep 2006 à 11h31

Pour ça, il faudrait utiliser les sessions. Mais tu n'en n'a pas
besoin ici - il te suffit, dans chaque formulaire "d'étape", de
stocker les saisies déjà validées dans des champs cachés.


Justement, je stocke mes variables dans la variable (globale je crois)
$_SESSION ainsi :

$_SESSION['variable1'] = valeur1
$_SESSION['variable2'] = valeur2
...

mais je ne sais pas si c'est préférable ou pas au stockage dans des
champs cachés.


"Préférable", je ne sais pas. Disons que j'ai personnellement tendance à
éviter autant que possible les sessions, mais il n'y a pas lieu d'en
faire de règle absolue - la seule règle "absolue" AMHA est "faire ce qui
convient pour le problème en cours" !-)

<thinking-out-loud>
L'intérêt de passer par des champs cachés est que ton code ne dépend pas
d'un état 'global' (la session), mais seulement des données qui lui sont
directement accessibles (on est en fait exactement dans le même cas
qu'une fonction dépendant d'une variable globale vs une fonction ne
dépendant que de ses paramètres - et il est bien connu que la seconde
option est de loin préférable en termes de modularité / testabilité /
maintenabilité).

D'un autre côté, en mettant les données en session au fur et à mesure,
tu es sûr que ce sont bien les données validées, alors qu'avec des
champs cachés tu ne peux jamais être sûr (rien ne te dit que c'est bien
à partir de *ton* formulaire que la requête a été postée)... ce qui
pourrait t'amener à revalider toutes les données à chaque étape.

Mouais. En bref, c'est à toi de voire en fonction du contexte. Un seul
point AMHA : si tu mets les données en session, mets y aussi l'étape en
cours et utilise une seule et même URL pour gérer tout le wizard.
</thinking-out-loud>


(il n'y a rien de confidentiel dans ces variables)


S'il s'agit des données POSTées à l'étape précédente, de toutes façons,
elles sont déjà passées en clair sur le net, donc pour ce qui est de la
confidentialité, hein, c'est un peu rapé !-)

La seule solution fiable ici est HTTPS, et dans ce cas tu peux aussi
bien repasser ces données de formulaire en formulaire...


Y a-t-il une autre possibilité pour rediriger vers une
autre page ?
En PHP ? Pas à ma connaissance (je parles bien de redirection HTTP).



Euh oui, en PHP. Tu pensais à autre chose ?


Non, c'était juste pour faire avancer le schimilimili... le
schmililimili... le... <candidat suivant, Simone, s'il vous plait>

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"



1 2