Précédent   Forum des professionnels en informatique > PHP > Langage > Formulaires
Formulaires Forum d'entraide sur les formulaires avec PHP. Avant de poster -> FAQ formulaires, Cours de formulaires et Sources de formulaires
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/01/2011, 12h28   #1
Membre du Club
 
Inscription : juillet 2003
Messages : 214
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 214
Points : 54
Points : 54
Envoyer un message via MSN à babylone7
Par défaut Formulaire sur plusieurs pages php

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.
- 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
Code :
include_once "livraison.php";
ou
Code :
include_once "enligne.php";
- une troisième page de confirmation "confirmation_livraison.php" ou "confirmation_enligne.php "

1er souci [RESOLU] : un texte présent sur devis.php apparait toujours dans livraison.php alors que le reste du formulaire devis.php n'apparait pas comme demandé

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

Code :
include_once "confirmation_livraison.php";
J'ai bient essayé la redirection via

Code :
 header('location: livraison.php');
mais j'ai la traditionnelle erreur :
Code :
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..

Est-ce que quelqu'un peut m'aider ?
Souhaitez-vous davantage de code ?

Merci beaucoup et excellente année à tous
babylone7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 13h02   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Sans voir le code qui gere tes enchainements c'est difficile de te repondre.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 13h30   #3
Membre du Club
 
Inscription : juillet 2003
Messages : 214
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 214
Points : 54
Points : 54
Envoyer un message via MSN à babylone7
Bonjour Sabotage,

Voici le code :

devis.php :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
<?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 "<font color=\"red\" size=\"3\" face=\"Verdana, Arial, Helvetica, sans-serif\" ><strong>Veuillez remplir correctement tous les champs obligatoires (en rouge).</strong></font><br>";	
	}
}
?>
 
<form name="formulaire" method="post"> 
 
<?php if(!isset($page_suivante)){?>
<h1> Votre devis automatique</h1><br> <!-- c'est ce titre qui continue d'apparaître meme sur livraison.php -->
<?php } ?>
 
[champs du formulaire]
<input type="submit" name="envoyer" value="Envoyer">
</form>

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

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
 <?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 "<font color=\"red\" size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\" ><strong>Vous devez joindre un fichier à traduire.</strong></font><br><br><br>";
		}else if(!isset($cgv)){
			echo "<font color=\"red\" size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\" ><strong>Vous devez accepter les conditons générales de vente</strong></font><br><br><br>";
		}
	}
} 
?>
 
<form name="formulaire_livraison" method="post"> 
 
[champs du formulaire]
<input type="submit" name="envoyer_livraison" value="Valider" />
</form>
La fonction verif_null() étant déja définie dans le fichier "devis.php", je le na remets pas dans "livraison.php"

Au clic sur "Valider" adns 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"


Merci bcp pour ton aide
babylone7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 14h52   #4
Membre du Club
 
Inscription : juillet 2003
Messages : 214
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 214
Points : 54
Points : 54
Envoyer un message via MSN à babylone7
Quand je regarde la source de la page devis.php avec l'include "livraison.php", je comprends mieux.. Il y a 2 formulaires, celui du devis et celui de la livraison.
Il faut que je place mon include ailleurs je pense ?



Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
<form name="formulaire" method="post"><!-- action=""> -->
 
<h1> Votre devis automatique</h1><br>
<body>
  <h1> Votre  commande</h1>
  <p>&nbsp;</p>
 
<form name="formulaire_livraison" method="post"> 
 
[...]
</form>
Ça résout mon souci d'affichage du titre en trop mais le formulaire n'est toujours pas posté
babylone7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 01h10   #5
Modérateur
 
Avatar de Vil'Coyote
 
Développeur Web
Inscription : février 2008
Messages : 3 302
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2008
Messages : 3 302
Points : 4 480
Points : 4 480
on peut avoir le code de la page ou se trouve tes include?
Vil'Coyote est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 16h59   #6
Membre du Club
 
Inscription : juillet 2003
Messages : 214
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 214
Points : 54
Points : 54
Envoyer un message via MSN à babylone7
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 :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
<html>
[...]
 
<script type="text/javascript">
[...]
</script>
 
<body>
[...]
 
<?php
require 'form_devis.inc.php';
?> 
 
</body>
</html>
- form_devis.inc.php contient juste le formulaire
Code :
1
2
3
4
 
<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)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
<html>
[...]
 
<script type="text/javascript">
[...]
</script>
 
<body>
[...]
 
<?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 "<span class='Error'>Veuillez remplir correctement tous les champs obligatoires (en rouge).</span><br/>"; // Une erreur dans le formulaire
	require 'form_devis.inc.php';
	}
 
?>
 
</body>
</html>
- livraison.php qui fonctionne comme devis.php : contient le html et le javascript et un include :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
<html>
[...]
 
<script type="text/javascript">
[...]
</script>
 
<body>
[...]
 
<?php
require 'form_livraison.inc.php';
?> 
 
</body>
</html>
- form_livraison.inc.php contient juste le formulaire
Code :
1
2
3
4
 
<form name="formulaire" method="post" action="traitement_livraison.php">
[...]
</form>
- traitement_livraison.php contient le php de contrôle

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
<html>
[...]
 
<script type="text/javascript">
[...]
</script>
 
<body>
[...]
 
//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 "<span class='Error'>Vous devez joindre un fichier &agrave; traduire.<br><br><br>";
		require 'form_livraison.inc.php';
	}else if(!isset($cgv)){
		echo "<span class='Error'>Vous devez accepter les conditons g&eacute;n&eacute;rales de vente<br><br><br>";
		require 'form_livraison.inc.php';
	}
}
?>
 
</body>
</html>

Je continue et reviens dire comment cela se passe
babylone7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h37   #7
Invité régulier
 
Inscription : janvier 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 10
Points : 9
Points : 9
Bonjour

Je n'ai pas tout compris entre devis traitement et livraison.

cependant, si tu veux charger le bon formulaire en fonction de ta page tu peux utiliser cette technique que j'utilise trés fréquemment pour réaliser mes sites.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
<?php
 
$Page = $_POST['page']; // tu peu ajouter sin non existe = valeur ..etc
?>
 
<form action="index.php" method="Post" name="PageForm" id="PageForm">
 
<?php
	 switch($Page)
 {
	case "Devis" : 
		echo "<legend id=\"legende\">Devis</legend>";
              include('Form_Devis.php');  // Sans les balises <FORM> et </FORM>
        break;
	case "Livraison" : 
		echo "<legend id=\"legende\">Livraison</legend>";
              include('Form_Livraison.php'); // Sans les balises <FORM> et </FORM>
        break;			
 }
?>
 
	<input type="hidden" name="page" value="<?php echo $Page;?>">
	<input type="submit" value=" Envoyer " >   <?php // posibiliter d'ajouter un control javascript onclick="javascript:submitpage(<?php echo $Page;?>)" ?>
</form>
 
 
<?php
	/// traitement de  tes donnés en fontion du TABLEAU $_POST[]
 
 
?>
J'espère que cette algo va t'aider ?

Cordialement
Davonex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 16h20   #8
Membre du Club
 
Inscription : juillet 2003
Messages : 214
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 214
Points : 54
Points : 54
Envoyer un message via MSN à babylone7
Merci Davonex pour ta réponse, j'ai gardé ton algo sous le coude ça pourra m'être utile.
Mais là du coup, je suis partie sur un fonctionnement différent.
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 :

Code :
1
2
3
4
5
6
7
8
9
10
<?php
$_SESSION['alerte'] = $alerte;
$_SESSION['nb_mots']=$nb_mots;
$_SESSION['domaine']=$domaine;
$_SESSION['logiciel']=$logiciel;
$_SESSION['nom']=$nom;
 
[...]
 
?>
traitement_livraison.php :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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; ?><br />
domaine=<?php echo $domaine; ?><br />
logiciel=<?php echo $logiciel; ?><br />
nom=<?php echo $nom; ?><br />
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 :

Code :
1
2
3
4
 
<input type="text" id="nb_mots" name="nb_mots" value="<?php echo $_POST['nb_mots']; ?>" />
<input type="text" id="domaine" name="domaine" value="<?php echo $_POST['domaine']; ?>" />
<input type="text" id="logiciel" name="logiciel" value="<?php echo $_POST['logiciel']; ?>" />
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
babylone7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 16h59   #9
Invité régulier
 
Inscription : janvier 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 10
Points : 9
Points : 9
Bonjour,

Je pense qu'il y a un souci avec ton register_globals.

Plus d'info à cette adresse http://fr.php.net/manual/fr/session.examples.basic.php

Cordialement
Davonex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 17h05   #10
Membre du Club
 
Inscription : juillet 2003
Messages : 214
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 214
Points : 54
Points : 54
Envoyer un message via MSN à babylone7
Merci Davonex,

Je tiens à préciser que je n'ai pas mis de :

Si je mets cette ligne, voici le message d'erreur que j'obtiens :

Citation:
Warning: session_start() [function.session-start]: open(/mnt/138/sdc/a/f/xxxx.xxxxx/sessions/sess_7657cf72221893caf070dd7fbeee5537, O_RDWR) failed: No such file or directory (2) in /mnt/138/sdc/a/f/xxxx.xxxxx/traitement_devis.php on line 1
babylone7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 17h38   #11
Membre du Club
 
Inscription : juillet 2003
Messages : 214
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 214
Points : 54
Points : 54
Envoyer un message via MSN à babylone7
Citation:
Envoyé par Davonex Voir le message
Bonjour,

Je pense qu'il y a un souci avec ton register_globals.

Plus d'info à cette adresse http://fr.php.net/manual/fr/session.examples.basic.php

Cordialement
Merci Davonex, mais alors du coup si je comprends bien il ne faut plus utiliser register_globals ? Quelle est l'alternative ?
Pfiou, je vais de sauts de puce en sauts de puce
babylone7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 15h54   #12
Membre du Club
 
Inscription : juillet 2003
Messages : 214
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 214
Points : 54
Points : 54
Envoyer un message via MSN à babylone7
J'ai changé de serveur, histoire de ne plus être embêtée avec les limitations des serveur gratuits.

Du coup le
fonctionne bien et ne me retourne plus d'erreur?

Par contre je perds toujours mes variables de session, je ne comprends pas

Je suis en PHP Version 5.2.6-1+lenny3
babylone7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 16h37   #13
Invité régulier
 
Inscription : janvier 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 10
Points : 9
Points : 9
Bonjour babylone7,

C'est difficile de voir le problème.

Cependant, assure toi bien que le Session_start (), est bien lancé systématiquement à caque fois. Car quand tu change de page, c'est cette commande qui restaure les variables sessions.

Sinon, peut-être utiliser la fonction session_register () pour déclarer les nouvelle variable.

Cdt
Davonex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 10h56   #14
Membre du Club
 
Inscription : juillet 2003
Messages : 214
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 214
Points : 54
Points : 54
Envoyer un message via MSN à babylone7
Citation:
Envoyé par Davonex Voir le message
Cependant, assure toi bien que le Session_start (), est bien lancé systématiquement à caque fois. Car quand tu change de page, c'est cette commande qui restaure les variables sessions.
Davonex tu es mon sauveur !!

Je continue mon périple !
Merci !
babylone7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h38.


 
 
 
 
Partenaires

Hébergement Web