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

PHP & Base de données Discussion :

Empecher envoi du formulaire plusieurs fois


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2006
    Messages : 38
    Points : 31
    Points
    31
    Par défaut Empecher envoi du formulaire plusieurs fois
    Bonjour,

    Je sollicite votre aide afin de ne pas envoyer plusieurs fois le $_POST.
    En effet, après l'actualisation de ma page, je suis invité à renvoyer l'enregistrement.
    Pouvez-vous m'aider svp ?

    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
    <?php
    $FR_Email = NULL;
    $MSG_OK = NULL;
    $MSG_NO = NULL;
     
    if(isset($_POST['Envoyer'])){
     
    // Nettoyage des entrées
    foreach($_POST as $var=>$val){if(!is_array($val)){$$var = strip_tags($val);}else{while(list($arvar,$arval) = each($val)){$$var[$arvar] = strip_tags($arval);}}}
     
    if($MSG_NO==""){
    	$res = $pdo->query("SELECT Email FROM tb_newsletter_adresse WHERE Email='$FR_Email';"); $data = $res->fetch(PDO::FETCH_ASSOC);
    	if($data!=0) {$MSG_NO.= $NEWSLETTER_MSG_NO;}
     
    	if($data==0)
    	{
    	$FR_Source = PAGE;
    	$FR_Pays = $PAYS_ISO_2;
    	$req_fr = $pdo->prepare ("INSERT INTO tb_newsletter_adresse (Email) VALUES (:FR_Email)");
    	$req_fr ->execute(array("FR_Email"=>$FR_Email));
    	$MSG_OK.= $NEWSLETTER_MSG_OK;
    	}
    }
    }
    ?>
     
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data" name="Form1">
    <input type="email" id="FR_Email" name="FR_Email" value="<?php echo $FR_Email; ?>" required >
    <button type="submit" name="Envoyer">S'inscrire</button>
    </form>
     
    <?php if($MSG_OK){echo $MSG_OK;} ?>
    <?php if($MSG_NO){echo $MSG_NO;} ?>

  2. #2
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Tu peux mettre un flag qui n'affiche plus le formulaire si l'adresse est insérée. Une autre solution consiste à ne pas insérer l'adresse email si elle est déjà présente.

    $data!=0 ne me semble pas correct.

    Code php : 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    <?php
    $FR_Email = NULL;
    $MSG_OK = NULL;
    $MSG_NO = NULL;
     
    //---- ICI
    $affiche = true;
     
    if(isset($_POST['Envoyer'])){
     
    // Nettoyage des entrées
    foreach($_POST as $var=>$val){if(!is_array($val)){$$var = strip_tags($val);}else{while(list($arvar,$arval) = each($val)){$$var[$arvar] = strip_tags($arval);}}}
     
    if($MSG_NO==""){
     $res = $pdo->query("SELECT Email FROM tb_newsletter_adresse WHERE Email='$FR_Email';"); $data = $res->fetch(PDO::FETCH_ASSOC);
     if($data!=0) {$MSG_NO.= $NEWSLETTER_MSG_NO;}
     
     if($data==0)
     {
     $FR_Source = PAGE;
     $FR_Pays = $PAYS_ISO_2;
     $req_fr = $pdo->prepare ("INSERT INTO tb_newsletter_adresse (Email) VALUES (:FR_Email)");
     $req_fr ->execute(array("FR_Email"=>$FR_Email));
     $MSG_OK.= $NEWSLETTER_MSG_OK;
     //---- ICI
     $affiche = false;
     }
    }
    }
    ?>
    <?php
    //---- ICI
    if ($affiche == true)
    {?>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data" name="Form1">
    <input type="email" id="FR_Email" name="FR_Email" value="<?php echo $FR_Email; ?>" required >
    <button type="submit" name="Envoyer">S'inscrire</button>
    </form>
    <?php
    //---- ICI
    }?>
     
    <?php if($MSG_OK){echo $MSG_OK;} ?>
    <?php if($MSG_NO){echo $MSG_NO;} ?>
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2006
    Messages : 38
    Points : 31
    Points
    31
    Par défaut
    Merci Badaze et merci de t'intéresser à mon problème.

    En effet, <form> ne s'affiche plus lorsqu'une adresse mail est injectée, mais l'actualisation renvoie toujours ce message :
    Pour afficher cette page, les informations précédemment transmises par Firefox doivent être renvoyées. Ceci répétera toute action (telle qu’une recherche ou un ordre d’achat) entreprise précédemment.
    Tu penses pouvoir m'aider d'avantage ?

  4. #4
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Si tu veux rester sur la même page tu peux faire comme ça.

    Cela ne sert à rien d'avoir un MESSAGE_NO et un MESSAGE_OK puisque les deux ne sont jamais renseignés en même temps.

    Code php : 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
    37
     
    <?php
    $FR_Email = NULL;
    $MESSAGE = NULL;
     
    if(isset($_POST['Envoyer'])){
     
    // Nettoyage des entrées
    foreach($_POST as $var=>$val){if(!is_array($val)){$$var = strip_tags($val);}else{while(list($arvar,$arval) = each($val)){$$var[$arvar] = strip_tags($arval);}}}if(isset($_POST)){
     $res = $pdo->query("SELECT Email FROM tb_newsletter_adresse WHERE Email='$FR_Email';"); $data = $res->fetch(PDO::FETCH_ASSOC);
     if($data!=0) {$MESSAGE.= $NEWSLETTER_MSG_NO;}
     
     if($data==0)
     {
     $FR_Source = PAGE;
     $FR_Pays = $PAYS_ISO_2;
     $req_fr = $pdo->prepare ("INSERT INTO tb_newsletter_adresse (Email) VALUES (:FR_Email)");
     $req_fr ->execute(array("FR_Email"=>$FR_Email));
     $MESSAGE.= $NEWSLETTER_MSG_OK;
     //---- ICI
     header("location:".$_SERVER['PHP_SELF']."?message=".$MESSAGE);
     // }
    }
    }
    ?>
    <?php
    //---- ICI
    if (isset($_GET['message']) == false)
    {?>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data" name="Form1">
    <input type="email" id="FR_Email" name="FR_Email" value="<?php echo $FR_Email; ?>" required >
    <button type="submit" name="Envoyer">S'inscrire</button>
    </form>
    <?php
    //---- ICI
    }?>
    <?php echo $_GET['message'];?>
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  5. #5

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2006
    Messages : 38
    Points : 31
    Points
    31
    Par défaut
    Merci Jreaux62 et remercie pour ton aide.
    Penses-tu que ce que j'ai fais est dans les correct ?
    Le message lors de l'actualisation me vient toujours, mais l'enregistrement ne se renvoie plus (je penses )...

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <?php
    $FR_Email 	= NULL;
    $MSG_OK 	= NULL;
    $MSG_NO 	= NULL;
    $affiche 	= true;
    ?>
     
    <?php if(session_id()=='') { session_start(); } if (isset($_SESSION['random_OK'], $_POST['randomformOK']) && $_POST['randomformOK']==$_SESSION['random_OK']) { ?>
     
    <?php $_SESSION['Newsletter']['FR_Email'] = $FR_Email; ?>
     
    <?php
    if(isset($_POST['Envoyer'])){
     
    foreach($_POST as $var=>$val){if(!is_array($val)){$$var=strip_tags($val);}else{while(list($arvar,$arval)=each($val)){$$var[$arvar]=strip_tags($arval);}}}
     
    if($MSG_NO=="") {
    $res = $pdo->query("SELECT Email FROM tb_newsletter_adresse WHERE Email='$FR_Email';"); $data = $res->fetch(PDO::FETCH_ASSOC);
    if($data!=0) {$MSG_NO.= $NEWSLETTER_MSG_NO;}
     
    if($data==0) {
     $FR_Source = PAGE;
     $FR_Pays = $PAYS_ISO_2;
     $req_fr = $pdo->prepare ("INSERT INTO tb_newsletter_adresse (Email, Source, Pays) VALUES (:FR_Email, :FR_Source, :FR_Pays)");
     $req_fr ->execute(array("FR_Email"=>$FR_Email, "FR_Source"=>$FR_Source, "FR_Pays"=>$FR_Pays));
     $MSG_OK.= $NEWSLETTER_MSG_OK;
     $affiche = false; }
    }
    }
    ?>
     
    <?php } unset($_POST); $_SESSION['random_OK'] = rand(100000,999999); ?>
     
    <?php unset($_SESSION['Newsletter']); ?>
     
    <?php if($affiche == true) { ?>
     
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data" name="Form">
    <input type="hidden" name="randomformOK" value="<?php echo $_SESSION['random_OK']; ?>" />
    <input type="email" id="FR_Email" name="FR_Email" value="<?php echo $FR_Email; ?>" required >
    <button class="btn btn-primary" type="submit" name="Envoyer">Envoyer</button>
     
    </form>
     
     
    <?php } ?>
    <?php if($MSG_OK){ ?><div class="div_20"></div><div class="alert alert-primary col-md-5" role="alert"><?php echo $MSG_OK; ?></div>
    <?php } ?>
    <?php if($MSG_NO){ ?><div class="div_20"></div><div class="alert alert-danger  col-md-5" role="alert"><?php echo $MSG_NO; ?></div>
    <?php } ?>

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par sinistrus Voir le message
    Penses-tu que ce que j'ai fais est dans les correct ?
    Réponse évidente : non.
    Si tu mets les bouts de code n'importe où, sans logique, c'est normal.

    De plus, je t'ai indiqué un PRINCIPE de TRAITEMENT et FORMULAIRE sur la même page (qui fonctionne TRÈS bien).
    Pourquoi ne l'utilises-tu pas ??
    Au lieu de "bricoler" ton code : repars du mien.

    Et :
    • Mets des commentaires / explications dans ton code ! Ça t'aidera à comprendre ce qui fait quoi et quand.
    • INDENTE ton code ! Il sera plus facile à lire, et à débuguer.
    • Pourquoi ouvrir et fermer PHP (<?php ... ?>) là où ce n'est pas nécessaire ? (dans toute la 1ère partie du code, où il n'y a QUE du PHP ?)
    Dernière modification par Invité ; 16/07/2018 à 13h00.

Discussions similaires

  1. [AC-2007] Ouverture d'un formulaire plusieurs fois
    Par Nanille dans le forum IHM
    Réponses: 3
    Dernier message: 10/07/2013, 10h51
  2. [MySQL] Formulaire qui envoi des données plusieurs fois
    Par Aiglichon dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/02/2013, 23h41
  3. [2.x] Utiliser le même formulaire plusieurs fois dans la même page
    Par Daecarios dans le forum Symfony
    Réponses: 3
    Dernier message: 06/07/2012, 15h53
  4. Réponses: 1
    Dernier message: 28/05/2009, 23h45
  5. Réponses: 11
    Dernier message: 02/02/2005, 13h52

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