IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Disfonctionnement de la fonction header()


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Membre émérite Avatar de sharrascript
    Homme Profil pro
    Développeur Web indépendant
    Inscrit en
    Avril 2007
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 678
    Par défaut
    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...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Bonjour,

    Et bien avec un


    juste avant le

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?!

  4. #4
    Membre émérite Avatar de sharrascript
    Homme Profil pro
    Développeur Web indépendant
    Inscrit en
    Avril 2007
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 678
    Par défaut
    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

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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]

  6. #6
    Membre émérite Avatar de sharrascript
    Homme Profil pro
    Développeur Web indépendant
    Inscrit en
    Avril 2007
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 678
    Par défaut
    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_

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP-JS] La fonction header()
    Par davinout dans le forum Langage
    Réponses: 16
    Dernier message: 16/05/2006, 08h43
  2. php5: difficulté avec la fonction header
    Par koueletbak dans le forum Langage
    Réponses: 2
    Dernier message: 02/05/2006, 20h44
  3. Comment utiliser la fonction Header(Location..)
    Par arti2004 dans le forum Langage
    Réponses: 3
    Dernier message: 10/04/2006, 18h42
  4. Pb de redirect avec fonction header
    Par adlaf dans le forum Langage
    Réponses: 4
    Dernier message: 20/02/2006, 16h25
  5. [Dates] Problème avec la fonction header
    Par d.w.d dans le forum Langage
    Réponses: 2
    Dernier message: 06/09/2005, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo