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 :

formulaire / redirection empêcher double post


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut formulaire / redirection empêcher double post
    Bonjour.

    Je travail actuellement sur le traitement de formulaire pour ne pas avoir le problème de double poste lors du refresh de la page et je fais face à un petit soucis.
    Je suis sur ma page ou il y a mon formulaire (suppression.php), lorsque je clique sur le bouton submit j'arrive sur une page de traitement(verif_suppression.php) ou j'effectue mon action sur la BDD et je fais une redirection vers mon accueil(index.php). Une fois que je suis sur l’accueil(index.php), si je fais page précédente, c'est super j'arrive sur mon formulaire(suppression.php) sans avoir le message me demandant la confirmation de renvois des données, mais quand je fais page suivante (vers index.php),apres avoir fait le page précédente (donc depuis(suppression.php) là j'obtiens le message pour renvoyer les données...

    Quelqu'un aurait une solution pour ne plus avoir ce message?

    Je vous mets les codes si ça peut aider.

    suppression.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <form action="verif_suppression.php"> //Mon formulaire n'est qu'un bouton en fait, les données étant stockées en session.
    	<input type="submit" value="Supprimer la selection" />
    </form>
    Petite question en plus. Dans un cas comme celui la, vaut il mieux utiliser un form pour aller vers une page, ou cacher un lien en bouton avec du css?

    verif_suppression.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    include("import_BDD.php");
    session_start();
    if(!empty($_SESSION['selection']))	
    {
    	deleteDissolution();
    	unset($_SESSION['selection']);
    	header("Location: ./index.php" );
    }
    ?>

    Merci.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Supprime verif_suppression.php, fais le traitement du formulaire dans suppression.php et ensuite la redirection vers index.php

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Bonjour.
    Merci pour votre réponse et désolé pour ce délai de réponse, je n'était as présent ce we.

    Je ne suis pas sûr de comprendre. Comment puis-je faire le traitement de mon formulaire dans supression.php puisque le formulaire est présent dedans.
    Je met en paramètre action de mon formulaire "supression.php" et donc en haut de supression.php je met une condition sur l'existence des variables en post. Enfin si elles existent dans le if, je fais le traitement que je faisait dans verif_suppression.php avec la redirection?

    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
     
    <?php
    include("import_BDD.php");
    session_start();
    if(!empty($_POST['suppression'])
    {
    	if(!empty($_SESSION['selection']))	
    	{
    		deleteDissolution();
    		unset($_SESSION['selection']);
    		header("Location: ./index.php" );
    	}
    }
    ?>
     
    <form action="suppression.php"> //Mon formulaire n'est qu'un bouton en fait, les données étant stockées en session.
    	<input type="hidden" value="suppression"/>
    	<input type="submit" value="Supprimer la selection" />
    </form>
    Je devrais faire quelque chose comme ça ?

    Merci.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    on peut très bien avoir le formulaire et le traitement sur la même page :

    => PRINCIPE de TRAITEMENT et FORMULAIRE sur la même page : (voir cette discussion)
    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
    <?php
    // Initialisation
    $form_valid = 0;
    $form_msg_err = '';
    $form_msg_OK = '';
     
    // SI le formulaire a été soumis
    if (isset($_POST['envoi_form'])) {
    	// TRAITEMENT (fichier inclus)
    	include('./traitement_formulaire.php');
    }
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <!-- ........ -->
    </head>
    <body>
    <!-- ........ -->
     
    <?php if ($form_valid == 2){ // Affichage message d'erreur ?>
    	<p class="msg_erreur"><?php echo $form_msg_err; ?></p>
    <?php } elseif ($form_valid == 1){ // Affichage message OK ?>
    	<p class="msg_OK"><?php echo $form_msg_OK; ?></p>
    <?php } ?>
     
    <?php
    // Affichage du formulaire
    if ($form_valid == 0 || $form_valid == 2){
    ?>
    <form name="form_fiche" method="post" action="<?php echo $_SERVER['PHP_SELF']?>"> <!-- action sur la même page -->
    	<!-- ........ -->
    	<input type="submit" name="envoi_form" value="envoyer" />
    </form>
     
    </body>
    <html>
    Fichier de traitement traitement_formulaire.php :
    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
    <?php // TRAITEMENT (fichier inclus)
    // 1/ RECUPERATION des données du formulaire
    $var1 = (isset($_POST['var1']))? $_POST['var1'] : '';
    .......
    .......
    .......
    // 2/ GESTION DES ERREURS => en cas d'erreur : 
    if(.........){
    	$form_valid = 2;
    	$form_msg_err .= 'Oups ! .......<br />';
    }
    if(.........){
    	$form_valid = 2;
    	$form_msg_err .= 'Argh ! .......<br />';
    }
    if($form_valid != 2){ // OK
    	$form_valid = 1;
    }
    // 3/ TRAITEMENT SI PAS d'erreur
    if($form_valid == 1){
    	..............
    	..............
    	..............
    	..............
    	..............
    	$form_msg_OK .= 'Good ! .......';
    }
    Concernant le rechargement de page (F5) ou boutons ">" "<" du navigateur : (voir cette discussion)
    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
    <?php if(session_id()=='') { session_start(); }
    // -----------------------
    // TRAITEMENT SI LE FORM A ETE POSTE
    if (isset($_SESSION['random_OK'], $_POST['randomformOK'])
    	&& $_POST['randomformOK']==$_SESSION['random_OK']) {
    	include('./form-traiter.php'); // traitement...
    }
    unset($_POST);
    // -----------------------
    // Protection contre "actualiser la page" ou envoi depuis l'extérieur (vol de formulaire)
    $_SESSION['random_OK'] = uniqid(); // nombre aléatoire unique
     
    // -----------------------
    // AFFICHAGE DU FORMULAIRE
    ?>
    	<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    		<input type="hidden" name="randomformOK" value="<?php echo $_SESSION['random_OK']; ?>" />
    	..........
    	</form>
    • $_SESSION['random_OK'] contient un nombre aléatoire (voir uniqid() )
    • il est mis dans un input hidden du formulaire => il sera alors récupéré via $_POST['randomformOK'].


    SI on recharge la page (F5):
    • $_SESSION['random_OK'] est modifié
    • MAIS $_POST['randomformOK'] NON.

    Ils sont différents => le traitement ne se fait pas (une 2ème fois).

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Merci beaucoup, j'ai appris pleins de choses!

    Citation Envoyé par jreaux62 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    include('./traitement_formulaire.php');
    Je ne savais pas qu'on pouvait inclure du directement du contenu php avec le include. Je pensais qu'il fallait obligatoirement passer par des fonction que l'on appelle.

    Citation Envoyé par jreaux62 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <?php echo $_SERVER['PHP_SELF']?>
    Je ne connaissais pas cela non plus.
    J'ai une question par rapport à cette ligne, j'avais lu quelque part qu'en général, il fallait éviter de mélanger le code html/JS avec du PHP. Ce n'est pas génant si c'est avec des "petits" echo dans ce contexte? ou vaudrait-il mieux remettre l'adresse de la page en brut?

    Citation Envoyé par jreaux62 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($form_valid == 0 || $form_valid == 2)
    Comment récupérez-vous la variable $form_valid? Elle n'est pas déclarée à ce niveau et les variable on une durée de vie attachée aux balises non?

    Donc dans mon cas, je n'aurais qu'a faire une redirection à cet endroit :
    Citation Envoyé par jreaux62 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php } elseif ($form_valid == 1){ // Affichage message OK ?>
    	//<p class="msg_OK"><?php echo $form_msg_OK; ?></p>
            header("Location: ./index.php" );
    <?php } ?>
    Donc si j'ai bien compris, je fais tout le traitement comme vous me l'avez indiqué tout en haute de ma page suppression.php. Comme ça le traitement est la 1ere chose à être fait, je peux placer mon header car il n'y a pas encore d'html et si la suppression est ok, la redirection prend effet directement avant même que la page suppression.php ne s'affiche c'est bien cela?

    En tout cas merci pour vos bonnes explications.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Bonjour.

    Désolé de ne revenir sur ce sujet que longtemps après mais j'étais un peu pris par d'autre choses ces derniers temps.

    Dans un 1er temps un grand merci à vous jreaux62 votre solution fonctionne à merveille! J'ai néanmoins quelques questions, j’espère que vous pouvez m'éclairer de votre lumiére .

    Je fais donc le traitement en haut de la page comme vous me l'aviez recommandé :
    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
     
    //ajout.php
    <?php
    	session_start();
    	if(isset($_SESSION['random_OK'], $_POST['randomformOK']) && $_POST['randomformOK'] == $_SESSION['random_OK']) {
    		if(isset($_POST['champ1'], $_POST['champ2'])) {
                            //On verifie les données postées
    			header("Location: ./validation_ajout.php" );//On redirige sur la page de validation du formulaire où les données sont montrées dans un tableau avant que l'utilisateur ne confirme l'insertion
    			}
    		}
    	unset($_POST);
     
    	$_SESSION['random_OK'] = uniqid(); 
    ?>
     
    <form id="idFormAjout" method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
            <label> Champ 1 :</label> <input type="text" name="champ1" /> 
    	<label> Champ 2 :</label> <input type="text" name="champ2" /> 
            <input type="hidden" name="randomformOK" value="<?php echo $_SESSION['random_OK']; ?>" />
    	<input type="submit" id="btnSendForm" value="Ajouter à la base">
    </form>
    J'ai plusieurs questions quant à ce code.
    - A quoi sert le "unset($_POST);" ?

    - Je sais que c'est l'un des intérêts (en plus de se protéger avec le token) mais comment se fait-il que je n'ai plus de message du navigateur indiquant qu'il faut renvoyer les données lors d'un rechargement de la page, mais aussi après avoir été redirigé vers "validation_ajout.php", si je fais précédent avec le navigateur, je n'ai pas ce message non plus. Pourquoi?(c'est tout à fait ce que je voulais mais je ne comprends pas comment se fait-il que le navigateur ne le demande plus).

    J'avais essayé le traitement sur la même page avec juste une redirection (le même code qu'au dessus sans la partie du token) mais j'obtenais le message du navigateur...

    Merci.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Re-bonjour désolé de re-poster, je pensais avoir compris mais en fait non...

    Quand je disais que "J'avais essayé le traitement sur la même page avec juste une redirection (le même code qu'au dessus sans la partie du token) mais j'obtenais le message du navigateur..." je viens de le refaire mais en fait je n'ai pas le message non plus. Par contre j'ai essayé avec un formulaire d'upload de fichier mais j'obtiens bien le message du navigateur ...
    J'avoue ne plus y comprendre grand chose.
    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
     
    //Import.php
    <?php
    session_start();
     
            if(isset($_SESSION['random_OK'], $_POST['randomformOK']) && $_POST['randomformOK'] == $_SESSION['random_OK']) {
    	        if(isset($_POST['excel'])) {
    			 //Test pour vérifier le type de fichier
     
    			if() //Si l'extension n'est pas dans la liste d'extensions autorisées
    			else {//Si l'extension est autorisée
                                  //Test de l'existence du fichier, Renommage et Deplacement du fichier uploadé
                                  //Lecture du fichier et récupération des infos en session
                                  header("Location: ./confirm_import.php" );//On redirige sur la page de validation de l'import si tout est bon
                                  }
                            }
                     } 
            unset($_POST);
    	$_SESSION['random_OK'] = uniqid();
    ?>
     
             <form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" enctype="multipart/form-data">
    		<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
    		<label for="fichierExcel">Fichier Excel :</label><br />
    		<input type="file" name="fichierExcel" id="fichierExcel" /><br />
    		<input type="hidden" name="randomformOK" value="<?php echo $_SESSION['random_OK']; ?>" />
    		<input type="submit" value="Importer depuis Excel" name="excel" />
    	</form>
    Avec ce code, après avoir être arrivé à la page "confirm_import.php" via le formulaire, si je fais "page précédente" j'ai le message "Confirm Form Resubmission" qui s'affiche.
    Avez-vous une idée de ce que j'aurai pu faire de mal dans l'utilisation de votre code?

    Merci.

  8. #8
    Invité
    Invité(e)
    Par défaut
    bonjour,
    Citation Envoyé par flavors Voir le message
    Avec ce code, après avoir être arrivé à la page "confirm_import.php" via le formulaire, si je fais "page précédente" j'ai le message "Confirm Form Resubmission" qui s'affiche.
    Avez-vous une idée de ce que j'aurai pu faire de mal dans l'utilisation de votre code?
    "après avoir être arrivé..."


    C'est simple : quand on remplit/utilise un formulaire, on NE CLIQUE PAS sur le bouton "page précédente" du navigateur !!
    "page précédente" veux dire ici "retour au traitement du formulaire", d'où le message "Confirm Form Resubmission".
    Ce qu'on ne veut pas.

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Bonjour et désolé pour le "avoir être arrivé" je ne l'avais pas relevé à ma relecture.
    Je suis d'accord avec vous mais un utilisateur lambda ne le sait pas forcement et pourrait vouloir cliquer sur page précédente et avoir ce message. Il n'y a donc aucun moyen de l'éviter?

    Mon problème c'est que j'avais besoin de ce retour au formulaire, je m'explique.
    Le formulaire est assez long avec beaucoup de données numériques. Lorsque l'utilisateur envoie le formulaire, les données sont vérifiées avec un script PHP et placées dans un array en session, l'utilisateur est alors redirigé vers une page de validation ou les données du formulaire sont affichées dans un tableau pour qu'il puisse les vérifier plus aisément.
    Si les entrées lui conviennent, il peut confirmer et les données sont envoyées dans la BDD et l'utilisateur est redirigé vers l’accueil, sinon je voudrais qu'il ait la possibilité de revenir au formulaire pour modifier les données qui ne vont pas.

    Le problème c'est que si on ne peut pas revenir sur un formulaire, mon utilisateur ne peut pas modifier ses données. Il y aurait-il donc un autre moyen?

    Merci.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par flavors Voir le message
    ...sinon je voudrais qu'il ait la possibilité de revenir au formulaire pour modifier les données qui ne vont pas...
    C'est simple : A TOI d'ajouter un BOUTON/lien sur la page, indiquant : "Modifier vos informations".

    Le formulaire est assez long avec beaucoup de données numériques
    Tu peux découper ton formulaire en plusieurs "étapes".
    Et ajouter à chaque étape un autre BOUTON/lien : "Passer à l'étape suivante"

    A TOI de réfléchir pour CONCEVOIR un système ERGONOMIQUE, simple pour l'utilisateur (personne n'aime remplir 3 kilomètres d'informations...)

  11. #11
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Merci pour votre réponse.

    Citation Envoyé par jreaux62 Voir le message
    C'est simple : A TOI d'ajouter un BOUTON/lien sur la page, indiquant : "Modifier vos informations".
    Ah oui je n'avais pas du tout pensé à cette solution pourtant si simple...
    Dans ce cas ce que je vais faire, c'est une fois arrivé sur ma page de confirmation, je met un header vers cette même page (comme ça si on appuie sur précédent on revient sur cette même page) et un bouton pour revenir sur le formulaire avant traitement.

    Merci.

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

Discussions similaires

  1. comment empécher le poste d'un formulaire suite a un Enter ?
    Par belaggoun2000 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 22/11/2010, 20h04
  2. formulaire: enregistrement en double/date now pb
    Par debdev dans le forum Access
    Réponses: 18
    Dernier message: 02/01/2006, 12h54
  3. poster un formulaire + redirection
    Par apleker dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 23/06/2005, 21h20
  4. Formulaire utilisant la méthode POST + popup
    Par Hell dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 27/10/2004, 13h34
  5. Réponses: 4
    Dernier message: 28/07/2004, 10h42

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