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 :

F5 et empêcher l'exécution du script déjà effectué


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut F5 et empêcher l'exécution du script déjà effectué
    Bonjour,

    j'ai un souci avec un formulaire basique sur une page A qui une fois validé (par du js) exécute un page B pour envoyer un mail et enregistrer des données dans un BDD.
    Tout fonctionne très bien sauf que je viens de m'apercevoir que si l'utilisateur fait un refresh de la page B, le script est de nouveau exécuté.... ce qui provoque des doublons et des envois de mails inutiles... bref c'est naz !

    Comment faire donc pour empêcher cela ?

    Au départ, j'avais pensé à utiliser un variable cachée pour valider l'exécution du script :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="hidden" name="action" value="submitted" />
    que page B vérifie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if($_POST['action'] == 'submitted') {
        // OK
        unset($_POST['action']);
    } else {
        // innattendu ou formulaire déjà exécuté
    }
    mais cette idée ne fonctionne pas....

    Une idée pour m'aider ?
    Merci d'avance

    @+

  2. #2
    Membre averti Avatar de TucSale
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 264
    Points : 325
    Points
    325
    Par défaut
    Bonjour,

    Personnellement j'utilise des variables de session pour savoir si mon formulaire à deja était envoyé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php 
    session_start();
    if(!isset($_SESSION['bSubmit']))$_SESSION['bSubmit'] = false;
     
    if($_POST['action'] == 'submitted' && !$_SESSION['bSubmit']) {  
    	$_SESSION['bSubmit'] = true;
    // OK  unset($_POST['action']);.
     } else {  
     // innattendu ou formulaire déjà exécuté 
     }
     ?>

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Hmm moi je fais comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php 
    if($_POST['action'] == 'submitted') {  
       // Ce que tu dois faire, mail, insertion bdd, etc...
       header('Location:lapageoutes.php');
    } else {  
    }
    ?>
    La redirection avec le header permet de ne plus pouvoir renvoyer les données POST en cas de F5. Par contre faut pas d'affichage avant, c'est a dire qu'il faut que ca soit en haut de ta page avant tout écho.

  4. #4
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    merci pour vos méthodes... je vais regarder ça de plus près lundi...

    Merci beaucoup... je vous tiens au courant

  5. #5
    Membre éprouvé
    Avatar de ozzmax
    Inscrit en
    Novembre 2005
    Messages
    977
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2005
    Messages : 977
    Points : 959
    Points
    959
    Par défaut
    Salut
    tout comme TucSale j'utilise les session pour valider la page de provenance ou l'action de provenance si c'est une redirection vers la meme page

    Cette méthode est également très pratique pour controler le changement d'url par l'usager
    ainsi si tu est à la page home.php et que tu entre dans ta barre d'adresse gestionmembre.php qui est une page de traitement seulement accessible a partir de gestion.php ben ca passera pas...alors tes validation de post vont pas planté non plus

    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
     
    //ex page infoDossierClosed accessible seulement via adminDossierClosed
    if(isset($_SESSION['nom'],$_SESSION['pageProvenance']) && $_SESSION['pageProvenance'] == "adminDossierClosed.php" ){
      //page actuelle pour éviter le f5 ou le back
      $_SESSION['pageProvenance'] = "infoDossierClosed.php";
     ....
    }
    else if(!isset($_SESSION['nom'])){
      //sort
    	header("location:login.php?erreur=2");
    }
    else if(!isset($_SESSION['pageProvenance']) || $_SESSION['pageProvenance'] != "adminDossierClosed.php"){
      //redirection vers page d'accueil
    	header("location:home.php?mod=4");
    }

  6. #6
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    j'utilise toujours le même algo

    ouvrir la session
    y copier $_Request
    fermer la session
    rediriger var le traitement

    ça prends trois lignes et c'est tellement rapide que le F5 ne provoque que le rafraichissement de la page suivante

    de même mon script de traitement ne fait que la mécanique et redirige vers une page de réponse

    si le traitement est rapide impossible de le réexécuter
    s'il est plus lent j'utilise un uuid dans la session pour marquer que le traitement est déjà passé

    A+JYT

  7. #7
    Acropole
    Invité(e)
    Par défaut
    Et si les cookies sont bloqués ?

  8. #8
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    il n'est pas nécessaire d'avoir de cookie pour utiliser les sessions

Discussions similaires

  1. Empécher l'exécution d'un script jusqu'à sa fin pour le relancer
    Par adil- dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 21/06/2012, 10h52
  2. Empêcher l'exécution d'un script PHP depuis le web
    Par anxious dans le forum Langage
    Réponses: 12
    Dernier message: 25/03/2010, 15h01
  3. Empêcher l'exécution de script (php, python ou autre)
    Par okparanoid dans le forum Apache
    Réponses: 8
    Dernier message: 29/07/2008, 21h16
  4. Réponses: 1
    Dernier message: 23/02/2005, 11h23
  5. Exécuter un script SQL
    Par borgfabr dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/03/2004, 08h47

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