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 :

Actions effectuées en double : header() renvoie-t-il les données POST ?


Sujet :

Langage PHP

  1. #1
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut Actions effectuées en double : header() renvoie-t-il les données POST ?
    Bonjour

    J'ai un problème assez sérieux que je n'arrive pas du tout à résoudre.
    Si je fais une redirection avec header() sur la même page après le traitement d'un formulaire par POST, les données sont-elles envoyées à nouveau ?

    Un peu de code étant plus descriptif d'un long discours, je vous propose ceci (j'ai taillé à la hache).
    Il s'agit de rentrer des noms dans une table, et d'indiquer les erreurs de saisie s'il y en a avec la fonction consult_error_disp();
    Le problème est que mon code passe 2 fois dans la boucle (la page est exécutée 2 fois) : les erreurs apparaissent en double et surtout les insertions dans la BDD sont faites en double.
    Quelqu'un pourrait-il m'expliquer pourquoi ?

    Merci beaucoup.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    <html>
    <head>
    <?php
    $mode = isset($_GET['mode']) ? $_GET['mode'] : 'nouveau';
    if(isset($_GET['action']) && $_GET['action'] == 'modif') {
      if(is_null($adresse) or $adresse == '') {
       consult_error("L'adresse n'est pas renseignée", 'adresse');
       $erreur_status = TRUE;
      }
    }
     
    if($mode == 'nouveau') {
      /*Code d'insert dans une BDD*/
      $sql = "insert into blabla";
      $query = mysql_query($sql);  
      $numero = mysql_insert_id();
      if($numero == 0 or $numero === FALSE) {
        /*En cas d'erreur, on ne change pas de mode, on retourne sur la même page qui indiquera où se trouvent les erreurs*/
        header("Location: ".$_SERVER['SCRIPT_NAME']."?mode=nouveau");
        exit();
      }
      else {
        /*Sinon on change de mode : ce n'est plus une nouvelle création*/
        header("Location: ".$_SERVER['SCRIPT_NAME']."?mode=a_valider&numero=$numero");
        exit();
    }
     
    <head>
    <body>
    <form action="?action=modif<?php if(isset($mode)) echo '&mode='.$mode; ?><?php if(isset($numero)) echo '&numero='.$numero; ?>" method="POST" name=form>
    Adresse : <textarea name=adresse cols=80 rows=5 size=500><?php echo $adresse; ?></textarea>
    <input onClick="this.form.submit();" type=submit value="valider la demande">
    </form>
    </body>
    </html>
    et voici le code des fonctions d'erreur :
    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
    20
    21
    22
     
    /*Log une erreur*/
    function consult_error($error, $label = NULL)
    {
       if ( !isset( $_SESSION['consult_error_labels'][$label] ) ) {
            $_SESSION['consult_error_labels'][$label] = '';
         }
       $_SESSION['consult_error_labels'][$label] .= "$error<br/>";
    }
     
     
     /*Affiche les erreurs*/
     function consult_error_disp($label = NULL)
     {
     
       if ( isset( $_SESSION['consult_error_labels'][$label] ) )
       {
        $error = $_SESSION['consult_error_labels'][$label];
        unset($_SESSION['consult_error_labels'][$label]);
        echo("<font color=red><b>$error</b></font>");
       }
      }

  2. #2
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Non, si tu fais une redirection avec un header() les informations en POST ne sont pas renvoyées à nouveau.

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/09/2014, 15h30
  2. [WPF {toolkit}] Comment avoir un double header dans une DataGrid ?
    Par XREvo dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 28/01/2010, 15h31
  3. Comment effectuer un double case en une fois
    Par Krout dans le forum VBScript
    Réponses: 4
    Dernier message: 16/09/2008, 17h46
  4. Enregistrer les actions effectuée sur une fenêtre
    Par netomax dans le forum WinDev
    Réponses: 5
    Dernier message: 25/04/2007, 21h11
  5. [Dates] Action à effectuer quand date1 est > a Date2
    Par bilou95 dans le forum Langage
    Réponses: 2
    Dernier message: 14/12/2006, 09h31

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