Formulaire sur plusieurs pages php [Résolu]

babylone7 12 Messages postés vendredi 26 juin 2009Date d'inscription 16 décembre 2013 Dernière intervention - 3 janv. 2011 à 14:51 - Dernière réponse : babylone7 12 Messages postés vendredi 26 juin 2009Date d'inscription 16 décembre 2013 Dernière intervention
- 14 janv. 2011 à 17:10
Bonjour,

Je ne m'en sors pas
Voici mon cas :
- "devis.php" : un premier formulaire sur lequel je fais les contrôles de saisie en php et sur la même page (inspiré par le formulaire de Moon (cosmoswarezone1) http://www.phpcs.com/codes/FORMULAIRE-PHP-VERIFICATION-ENVOI-MAIL_47640.aspx.)
- une fois le premier formulaire correct, et selon la valeur d'un des champs, j'appelle "livraison.php" ou "enligne.php" via le code suivant
include_once "livraison.php";

ou
include_once "enligne.php";

- une troisième page de confirmation "confirmation_livraison.php" ou "confirmation_enligne.php "

Mon souci est que quand je valide le formulaire de "livraison.php", c'est la page "devis.php" qui est réaffichée malgré le code suivant :

include_once "confirmation_livraison.php";


J'ai bien essayé la redirection via

 header('location: livraison.php');


mais j'ai la traditionnelle erreur :
headers already sent by output started
....

J'ai essayé de modifier mon code mais j'ai du html partout je n'y arrive pas.
Le include_once me parait pas mal, mais il reste ces 2 soucis..

Voici une partie de mon code :

devis.php :

<?php

if(isset($_POST['envoyer'])){ // si une action est faite par l'utilisateur
$alerte =  $_POST['envoyer']; //chargement du button envoyer
[...]; 
}


if(isset($alerte)){ // vérifie si l'utilisateur a fait l'action d'envoyer
verif_form($nb_mots,$domaine,$nom,$prenom,$email,$tel,$pays,$type_commande,$logiciel,$source,$liste_cibles,$prix_standard,$prix_HT,$remise,$nb_jours);
}


[...]


function verif_form($nb_mots,$domaine,$nom,$prenom,$email,$tel,$pays,$type_commande,$logiciel,$source,$liste_cibles,$prix_standard,$prix_HT,$remise,$nb_jours){ 
if(verif_nb($nb_mots) && verif_null($domaine) && verif_null($nom) && verif_tel($tel) && verif_mail($email) && isset($liste_cibles) && $type_commande && $pays) { // vérifie si toutes les fonctions sont à true
switch ($type_commande) {
case "livraison":
$page_suivante="livraison";
include_once "livraison.php";
exit(); 
break;
case "enligne":
$page_suivante="enligne";
include_once "enligne.php";
exit(); 
break;
}
}
else {
echo " Veuillez remplir correctement tous les champs obligatoires (en rouge). 
";	
}
}
?>

<form name ="formulaire" method=  "post"> 

<?php if(!isset($page_suivante)){?>
 Votre devis automatique

 <!-- c'est ce titre qui continue d'apparaître meme sur livraison.php -->
<?php } ?>

[champs du formulaire]

</form>



livraison.php : (enligne.php focntionne pareil, les différences sont fonctionnelles)

 <?php
if(isset($_POST['envoyer_livraison'])){ // si une action est faite par l'utilisateur
$alerte_livraison   = $_POST['envoyer_livraison']; 
$cgv =  $_POST['cgv']; 
$fichier = $_POST['fichier']; 
}

if(isset($alerte_livraison)){ // vérifie si l'utilisateur a fait l'action d'envoyer
verif_form_livraison($fichier,$cgv);
}

[...]

function verif_form_livraison($fichier,$cgv){ //fonction qui vérifie si le formulaire est pret à etre envoyé
if(verif_null($fichier) && isset($cgv)) { // vérifie si toutes les fonctions sont à true
include_once "confirm_livraison.php";
exit(); 
} else {
if(!verif_null($fichier)){
echo " Vous devez joindre un fichier à traduire. 

";
}else if(!isset($cgv)){
echo "Vous devez accepter les conditons générales de vente

";
}
}
} 
?>

<form name ="formulaire_livraison" method="post"> 

[champs du formulaire]

</form>


La fonction verif_null() étant déja définie dans le fichier "devis.php", je le na remets pas dans "livraison.php"

Et donc au clic sur "Valider" dans livraison.php c'est le formulaire devis.php qui se réaffiche
- au lieu de "confirm_livraison.php", s'il n'y a pas d'erreur dans le formulaire "livraison.php"
- au lieu de "livraison.php", s'il y a des erreurs dans le formulaire "livraison.php"


Est-ce que quelqu'un peut m'aider ?

Merci beaucoup et excellente année à tous
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
babylone7 12 Messages postés vendredi 26 juin 2009Date d'inscription 16 décembre 2013 Dernière intervention - 14 janv. 2011 à 17:10
3
Merci
J'ai trouvé !

Il faut bien s'assurer que session_start(), est bien lancé systématiquement à chaque fois dans chaque page, car quand on change de page, c'est cette commande qui restaure les variables de session.

Merci babylone7 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de babylone7
babylone7 12 Messages postés vendredi 26 juin 2009Date d'inscription 16 décembre 2013 Dernière intervention - 4 janv. 2011 à 10:16
0
Merci
Bonjour,

Personne pour m'aider ?

Merci et bonne journée
Commenter la réponse de babylone7
Lyle56 240 Messages postés jeudi 1 mai 2008Date d'inscription 19 juillet 2012 Dernière intervention - 4 janv. 2011 à 13:56
0
Merci
Bonjour,

J'ai eu un peut de mal à comprendre ce que tu voulais faire, et comment tu avais fait pour y parvenir, mais je pense avoir mon idée.

On est bien d'accord que tu fait ton include de livraison.php dans le fichier devis.php

On est déjà face à un soucis de conception.
Actuellement, je suis sur à 90% que tu repasse par ce code

if(isset($_POST['envoyer'])){ // si une action est faite par l'utilisateur
$alerte = $_POST['envoyer']; //chargement du button envoyer
[...];
}

Donc ton $alerte n'est pas définie, et tu ré-affiche le formulaire de base.



Sans maitrise, la puissance n'est rien
Il ne faut pas vendre la peau de l'ours, non il ne faut pas.
Commenter la réponse de Lyle56
babylone7 12 Messages postés vendredi 26 juin 2009Date d'inscription 16 décembre 2013 Dernière intervention - 4 janv. 2011 à 14:19
0
Merci
Bonjour Lyle,

Je fais l'include de livraison.php dans le fichier devis.php
En effet, $alerte n'est pas affectée, je vais l'affecter à la soumission de livraison.php.

Cependant, tu me dis que la conception est mauvaise, je suis ouverte à la repenser, mais je ne ne vois pas bien comment, si tu as des conseils n'hésite pas.

Merci beaucoup
Commenter la réponse de babylone7
Lyle56 240 Messages postés jeudi 1 mai 2008Date d'inscription 19 juillet 2012 Dernière intervention - 4 janv. 2011 à 17:24
0
Merci
Bonjour,

En règle générale, on sépare traitement et présentation.
Tes formulaires devraient plutôt passer par un fichier de traitement 'validation_form.php' [nom en exemple]
Qui effectue la vérifications des informations saisies, stock en session ou base, les données et renvoi vers la page à affiché.

Dans ta page à affiché tu as ainsi un minimum de traitement : quel est la partie à affichée.

Ensuite,

"Vous devez accepter les conditons générales de vente

";

Pourquoi ne pas passer par un CSS ??

Si un jours tu veut passer en 'darkred' sur tes messages d'erreur tu devrais aller les recherchés partout...

en passant par une classe
[ Fichier css d'exemple fait de tête, je suis pas sur des attributs exacts ]

.Error {
font-family :Verdana, Arial, Helvetica, sans-serif;
color : red;
font-weight: bold;
}

tu obtient le même résultat en faisint simplement ceci :

"Vous devez accepter les conditons générales de vente

";

Et si tu change la couleur cela serra répercuté partout

Enfin, je suis un partisan du template...
Mais la cela fait beaucoup de changement en plus...

Sans maitrise, la puissance n'est rien
Il ne faut pas vendre la peau de l'ours, non il ne faut pas.
Commenter la réponse de Lyle56
babylone7 12 Messages postés vendredi 26 juin 2009Date d'inscription 16 décembre 2013 Dernière intervention - 4 janv. 2011 à 17:27
0
Merci
Merci Lyle,

Je voulais en effet passer par un formulaire de traitement au départ puis je suis tombée sur ce formulaire et me suis lancée comme ça..
Je vais donc revoir ça mais j'ai peur de ne pas m'en sortir :( Peux-tu m'aider ?

Pour la css oui oui pas de souci, c'est la graphiste avec qui je travaille qui corrigera ça :)

Merci
Commenter la réponse de babylone7
Lyle56 240 Messages postés jeudi 1 mai 2008Date d'inscription 19 juillet 2012 Dernière intervention - 5 janv. 2011 à 09:51
0
Merci
Bonjour,

Comme on me l'as récemment dit : pour apprendre à nager il faut se jeter à l'eau !

Essayer, si tu as peur que se soit trop lourd, dans un premier temps fait une succession de formulaire simple :

Formulaire 1 -> Juste le nom et valider
Tu fait un traitement simple : nom renseigné -> retour soit sur le premier formulaire soit sur le deuxiéme
Formulaire 2 -> Juste un autre champ texte et valider
idem ..

Une fois que tu as ta succession de formulaire avec le bon comportement [ le champ est rempli on passe au suivant ; il n'est pas remplis on reviens sur le formulaire ] tu ajoute les champs et les contrôles.


Sans maitrise, la puissance n'est rien
Il ne faut pas vendre la peau de l'ours, non il ne faut pas.
Commenter la réponse de Lyle56
babylone7 12 Messages postés vendredi 26 juin 2009Date d'inscription 16 décembre 2013 Dernière intervention - 5 janv. 2011 à 17:00
0
Merci
Bonjour et merci pour votre réponse.

Pour faire + propre, j'ai pris la décision de séparer les fichiers : affichage d'un côté, contrôle de l'autre.
J'ai donc cette cinématique :
- devis.php contient form_devis.inc.php qui post vers traitement_devis.php
- traitement_devis.php renvoie vers livraison.php
- livraison.php contient form_livraison.inc.php qui post vers traitement_livraison.php

Voici le détail des codes :
- devis.php contient le html et le javascript et un include :
<html>
[...]

<script type=  "text/javascript">
[...]
</script>


[...]

<?php
require 'form_devis.inc.php';
?> 


</html>


- form_devis.inc.php contient juste le formulaire
<form name  ="formulaire" method= "post" action= "traitement_devis.php">
[...]
</form>


- traitement_devis.php contient le php de control et le javascript (j'ai été obligé de le remettre sinon mes calculs lancés dès une saisie ne fonctionnaient plus)
<html>
[...]

<script type  ="text/javascript">
[...]
</script>


[...]

<?php

//code php de contrôle :

$nb_mots =  htmlspecialchars($_POST['nb_mots'], ENT_QUOTES);
[...]
$type_commande = htmlspecialchars($_POST['type_commande'], ENT_QUOTES); // chargement du type de commande + mise en forme de la variable


function verif_nb($var) { // fonction qui verifie si le nombre de mots est correct et si le champ est vide
$code_syntaxe= '#[0-9]{1,15}$#'; // chargement de la syntaxe nombre valide
if(preg_match($code_syntaxe,$var)){ // compare la syntaxe nombre valide au nombre saisi
return $var;
}
}



if(verif_nb($nb_mots) && [...] && isset($type_commande)) { // vérifie si toutes les fonctions sont à true
switch ($type_commande) {
case "livraison":
require "livraison.php";
break;
case "enligne":
require "enligne.php";
break;
}
} else {
echo "Veuillez remplir correctement tous les champs obligatoires (en rouge).
"; // Une erreur dans le formulaire
require 'form_devis.inc.php';
}

?>


</html>


- livraison.php qui fonctionne comme devis.php : contient le html et le javascript et un include :
<html>
[...]

<script type  ="text/javascript">
[...]
</script>


[...]

<?php
require 'form_livraison.inc.php';
?> 


</html>


- form_livraison.inc.php contient juste le formulaire
<form name= "formulaire" method="post" action= "traitement_livraison.php">
[...]
</form>


- traitement_livraison.php contient le php de contrôle

<html>
[...]

<script type  ="text/javascript">
[...]
</script>


[...]

//code php de contrôle :
<?php

$numero_commande = time().$nb_mots;
$prix_TTC = round($prix_standard + $prix_standard*0.196,"2");


$poids_max 50000000; // Poids max du fichier en octets (1Ko 1024 octets)
$repertoire = 'upload/'; // Repertoire d'upload
$nom_fichier = $_FILES['fichier']['name'];

$alerte_livraison = $_POST['envoyer_livraison']; 
$cgv = $_POST['cgv']; 
$fichier = $_POST['fichier']; 

function verif_null($var){ // fonction qui verifie si le champ est vide
if($var!=""){
return $var;
}
}

if(verif_null($fichier) && isset($cgv)) { // vérifie si toutes les fonctions sont à true
require 'confirm_livraison.php';
} else {
if(!verif_null($fichier)){
echo "Vous devez joindre un fichier à traduire.

";
require 'form_livraison.inc.php';
}else if(!isset($cgv)){
echo "Vous devez accepter les conditons générales de vente

";
require 'form_livraison.inc.php';
}
}
?>


</html>



Scénario :
Je remplis le formulaire de devis, parfait, je soumets avec ou sans erreur, tout marche bien.
Sauf que je suis dans traitement_devis.php quand s'affiche livraison.php.
Du coup, si je soumets le formulaire de livraison, je retombe à nouveau sur devis.php.

J'en suis toujours au même point, avec plus de fichiers ! Je suis un peu perdue :)
Commenter la réponse de babylone7
babylone7 12 Messages postés vendredi 26 juin 2009Date d'inscription 16 décembre 2013 Dernière intervention - 5 janv. 2011 à 17:18
0
Merci
Oups
j'avais oublié le code :
 action="traitement_livraison.php"


Je continue et reviens dire comment cela se passe
Commenter la réponse de babylone7
babylone7 12 Messages postés vendredi 26 juin 2009Date d'inscription 16 décembre 2013 Dernière intervention - 10 janv. 2011 à 16:22
0
Merci
Bonjour !

Alors j'ai pas mal avancé, mais j'ai maintenant un souci avec les variables de session.

J'ai besoin que les données saisies au 1er formulaire soient conservées jusqu'à la fin de la commande :
- 1ère étape : devis.php avec traitement_devis.php --> données de devis + coordonnées
- 2ème étape : livraison.php (ou enligne.php) avec traitement_livraison.php (ou traitement_enligne.php) selon le type de paiement choisi dans devis.php --> cgv à cocher + fichier à uploader
- 3ème étape : confirm_livraison.php (ou confirm_enligne.php) qui récapitule toutes les données des 2 formulaires précédents.

J'ai crée un fichier session.php que j'ai mis en include dans les fichiers de traitement traitement_devis.php , traitement_livraison.php et traitement_enligne.php.

Voici un extrait de ce fichier session.php :

<?php
$_SESSION['alerte'] =  $alerte;
$_SESSION['nb_mots']=$nb_mots;
$_SESSION['domaine']=$domaine;
$_SESSION['logiciel']=$logiciel;
$_SESSION['nom']=$nom;

[...]

?>


traitement_livraison.php :

<?php

include 'session.php';

$nb_mots =$_SESSION['nb_mots'];
$domaine=$_SESSION['domaine'];
$logiciel=$_SESSION['logiciel'];
$nom=$_SESSION['nom'];


[...] //traitements de vérification

?>

nb_mots=<?php echo $nb_mots; ?>

domaine=<?php echo $domaine; ?>

logiciel=<?php echo $logiciel; ?>

nom=<?php echo $nom; ?>


Or à ce moment là si je ne remets pas les variables dans le formulaire, je les perds.
j'ai testé en mettant les variables $nb_mots, $domaine et $logiciel dans le formulaire :

" />
" />
" />


Elles s'affichent bien dans le echo final, mais la variable $nom, elle, ne s'affiche pas ! Et ça m'embête de tout mettre dans le formulaire puisque les variables de session existent non ?

Pouvez-vous m'aider ?

Merci
Commenter la réponse de babylone7

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.