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 23/09/2007, 00h25   #1
Membre du Club
 
Inscription : avril 2007
Messages : 93
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 93
Points : 61
Points : 61
Par défaut Disfonctionnement de la fonction header()

Bonjour à tous,

Avant d'exposer mon problème voici la situation :

J'ai un formulaire d'upload de fichier (sur une page formulaire_envoi.php) qui comporte :
  • un champ dans lequel l'utilisateur doit indiquer le fichier à uploader,
  • un champ dans lequel il doit saisir un commentaire sur ce fichier.

L'idée est que si l'un des deux champs n'est pas rempli (ou les deux), l'envoi ne se fasse pas et l'utilisateur se voit renvoyé sur la page d'upload.

Le formulaire se présente donc de la façon suivante :

Code HTML :
1
2
3
4
5
6
7
8
 
<form enctype="multipart/form-data" action="verification_envoi.php" method="post">
 
     <input type="hidden" name="MAX_FILE_SIZE" value="1048576" />
     <input type="file" name="fichierATraiter" />
     <textarea  name="commentaire" rows="4" cols="30" /></textarea>
 
</form>

Le formulaire fait donc appel à la page verification_envoi.php.

Au tout début de cette page figure la vérification du contenu des champs, pour savoir si ceux-ci sont bien remplis.

Voici le code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Contrôle du contenu des champs du formulaire
$codeErreur = '0';
 
if ( empty($_POST['commentaire']) )
{
	$codeErreur = $codeErreur . '4';
}
 
if (empty($_FILES['fichierATraiter']['name']))
{
	$codeErreur = $codeErreur . '2';
}
 
//Si on a rencontré des champs vides, le code d'erreur n'est pas 0, donc on redirige
if ($codeErreur != '0')
{
	$redirection = 'formulaire_envoi.php?codeErreur='.$codeErreur;
	header("Location: $redirection");
}
Comme vous le voyez, si un des champs est vide, la variable $codeErreur change de valeur, ce qui a pour effet de provoquer une redirection vers la page d'upload avec une adresse contenant le code d'erreur.


Je me heurte néanmoins à un problème :
  • Si seul le champ "fichierATraiter" n'est pas rempli, la redirection est effectuée (avec $codeErreur valant 02 donc tout est normal)
  • Si les 2 champs sont vides ("fichierATraiter" et "commentaire"), la redirection est effectuée (avec $codeErreur valant 042 donc tout est normal)
  • Si seul le champ "commentaire" n'est pas rempli, la redirection n'est pas effectuée !

Donc on peut envoyer un fichier sans commentaire, ce qui ne devrait pas être possible puisque quand les deux champs sont laissés vides, le script le détècte ($codeErreur valant 042).

Ma question : pourquoi lorsque seul le champ commentaire est laissé vide la redirection vers la page d'upload ne s'opère pas ?
Christophe_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2007, 15h50   #2
Membre émérite
 
Avatar de sharrascript
 
Homme Franck
Développeur Web indépendant
Inscription : avril 2007
Messages : 678
Détails du profil
Informations personnelles :
Nom : Homme Franck
Âge : 31
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web indépendant

Informations forums :
Inscription : avril 2007
Messages : 678
Points : 900
Points : 900
très étrange,

Si quand tu as les 2 champs vides ("fichierATraiter" et "commentaire") avec un code erreur 042, ta variable $codeErreur devrais avoir 04 si juste commentaire est vide, c'est sûr.

essais de mettre echo $codeErreur; juste avant ton if ($codeErreur != '0'), vois ce qu'il retourne...
__________________
LudiKreation Pour un web ludique et son Blog | CapRumbo pour un peu d'évasion | ChaOdisiaque Club Passion Rôliste |SierrElben le Jeu de rôle
sharrascript est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2007, 16h37   #3
Membre du Club
 
Inscription : avril 2007
Messages : 93
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 93
Points : 61
Points : 61
Bonjour,

Et bien avec un


juste avant le

Code php :
1
2
3
4
5
if ($codeErreur != '0')
{
	$redirection = 'formulaire_envoi.php?codeErreur='.$codeErreur;
	header("Location: $redirection");
}

Si je laisse seulement le champ commentaire vide, cela affiche bien 04

Je ne comprends vraiment pas le problème.

Est-ce-que php, lorsqu'on lui envoie un fichier, ne prête attention qu'à ce fichier et ignore tout le reste ?!
Christophe_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2007, 16h53   #4
Membre émérite
 
Avatar de sharrascript
 
Homme Franck
Développeur Web indépendant
Inscription : avril 2007
Messages : 678
Détails du profil
Informations personnelles :
Nom : Homme Franck
Âge : 31
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web indépendant

Informations forums :
Inscription : avril 2007
Messages : 678
Points : 900
Points : 900
non,

si juste avant ta condition if le echo te renvoie 04, il passe à coups sûr dedans!!

met ton echo à l'intérieur de la condition voir s'il rentre dedans... On sait jamais... trop étrange
__________________
LudiKreation Pour un web ludique et son Blog | CapRumbo pour un peu d'évasion | ChaOdisiaque Club Passion Rôliste |SierrElben le Jeu de rôle
sharrascript est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2007, 17h24   #5
Membre du Club
 
Inscription : avril 2007
Messages : 93
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 93
Points : 61
Points : 61
En mettant le dans la condition, le script affiche encore une fois la bonne valeur (à savoir un $codeErreur valant 04.

Donc il rentre bien dans la condition.

De plus après l'affichage du '04' php affiche l'erreur

Code :
Warning: Cannot modify header information - headers already sent by...
Il "voit" donc bien l'insctruction..


[EDIT]

Ca y est j'ai trouvé d'où venait le problème..

En fait le script se déroule de la façon suivante :
  • Controle de la valeur des champs et redirection si celles-ci sont incorrectes
  • Sinon le script effectue quelques opérations sur le fichier (renommage, insertion dans BDD etc.)
  • Puis à la fin du script il y à une autre instruction de redirection (avec la fonction header()), cette fois vers une page affichant le succès de l'opération

Je pensais que le fait de placer le contrôle des champs au début du script suffirait à ce que php "saute" le reste du code s'il y avait une erreur.
Mais apparemment ce n'est pas le cas.

C'est toi sharrascript qui m'a mis sur la voie. En effet mettre le echo($codeErreur) dans la condition de redirection m'affichait deux erreurs de header() : une pour la redirection vers la page d'envoi et une pour la redirection vers la page de succès.
J'en ai donc déduit que php, en quelque sorte, prenait en compte les deux redirections.

J'ai donc rajouté un
Code php :
if ($codeErreur == '0')
juste avant la redirection vers la page de succès

Cela fonctionne, php ne s'emmèle plus entre les deux redirections.

J'espère avoir été clair dans mon explication, en tout cas merci à toi sharrascript pour l'aide apportée

[/EDIT]
Christophe_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2007, 18h00   #6
Membre émérite
 
Avatar de sharrascript
 
Homme Franck
Développeur Web indépendant
Inscription : avril 2007
Messages : 678
Détails du profil
Informations personnelles :
Nom : Homme Franck
Âge : 31
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web indépendant

Informations forums :
Inscription : avril 2007
Messages : 678
Points : 900
Points : 900
Ha oui en effet ,

Je suis content d'avoir pu te mettre sur la voix, hehe, ça me rassure que mes petites bidouilles pour trouver les erreurs fonctionnent aussi chez les autres

Moi aussi j'ai eu et j'ai des moments à me taper la tête contre les murs avec la prog... Mais au final il y a toujours une solution

Bonne fin de journée Christophe_
__________________
LudiKreation Pour un web ludique et son Blog | CapRumbo pour un peu d'évasion | ChaOdisiaque Club Passion Rôliste |SierrElben le Jeu de rôle
sharrascript 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 04h09.


 
 
 
 
Partenaires

Hébergement Web