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 :

Formulaire et rechargement de page


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 94
    Points : 56
    Points
    56
    Par défaut Formulaire et rechargement de page
    Bonjour à tous !

    Je viens vers vous car je développe actuellement une application web, et je rencontre un problème plutôt embêtant.

    En effet, dans une même page, j'ai un formulaire d'ajout et la liste des données présentes. Et lorsque j’effectue un ajout, les données sont ajoutés sans problèmes, mais lorsque je recharge la page, les données sont re-envoyées...


    Après quelques recherche, la solution serait de séparer le formulaire de la liste, mais je ne veux vraiment pas pour des raisons esthétiques...

    Une solution? Merci !

  2. #2
    Membre régulier
    Femme Profil pro
    Etudiante en informatique
    Inscrit en
    Janvier 2013
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 98
    Points : 95
    Points
    95
    Par défaut
    D'une façon générale, lorsque tu actualises la page (F5) tu renvoies les données du formulaire. Du coup l'ajout s'effectue deux fois.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    voici une technique pour empêcher le renvoi du formulaire par actualisation (Formulaire et Traitement sur la même page) :

    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
    <?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...
    }
    // Protection contre "actualiser la page" ou envoi depuis l'extérieur (vol de formulaire)
    unset($_POST);
    $_SESSION['random_OK'] = rand(100000,999999); // nombre aléatoire
    // -----------------------
    // 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
    • 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).
    Dernière modification par Invité ; 16/07/2018 à 11h36.

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 103
    Points : 61
    Points
    61
    Par défaut
    Plus simple, tu mets à la fin de ton enregistrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    header('Location: pageDuFormulaire.php');
    exit;
    et plus de problème.

  5. #5
    Membre averti Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Points : 390
    Points
    390
    Par défaut
    Bonjour Clebit,

    La solution de jreaux62 a le double avantage de :
    - UN : empêcher que les informations soumises au serveur viennent d'un formulaire différent de celui afficher par ce serveur (tentative de piratage)
    - DEUX : empêcher, indirectement, le double envoi des informations par la touche F5.

    Cette protection par chiffre aléatoire vise à contrer ce que l'on appelle : faille CSRF. Je t'invite à te documenter dessus c'est très intéressant.

    Enjoy

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 103
    Points : 61
    Points
    61
    Par défaut
    Effectivement, cela ralentirait une attaque sans la bloquer. Rajouter $_SERVER['HTTP_REFERER'] permettrait de compliquer la tâche.

    Mais en mettant le header location, cela évite le message "Renvoyer les données... " et est compatible avec le script.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par Clebit Voir le message
    ..., cela ralentirait une attaque sans la bloquer...
    Il ne faut pas tout mélanger.

    Il ne s'agit pas de bloquer une attaque, et ça ne remplace pas les vérifications des champs reçus.

    Rappel : Formulaire et Traitement sur la même page
    Comment penses-tu que header('location...') va réagir alors qu'on est ici sur une seule et même page ?
    Une boucle infinie !

    Formulaire et Traitement sur la même page permet, en outre, de pouvoir afficher les messages d'erreur ou de validation, ré-afficher le formulaire avec les données pré-remplies...
    Le header('location...'), non.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 103
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,
    Il ne faut pas tout mélanger.
    Je mélange rien, je répondais des à Njörd sur les attaques de type Cross-Site Request Forgery.

    Citation Envoyé par jreaux62 Voir le message
    Rappel : Formulaire et Traitement sur la même page
    Comment penses-tu que header('location...') va réagir alors qu'on est ici sur une seule et même page ?
    Une boucle infinie !
    Je n'ai pas oublié, et m'a solution est fonctionnelle. Tu peux tester l'exemple ci-dessous :

    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
     
    <?php
    session_start();
     
    if(isset($_POST['exemple'])){
    	//s'il y a un post, on enregistre
     
    	//vu que tu veux réafficher la saisie, on met en post
    	//perso, je contrôle d'abors en javascript, ce qui permet d'économiser des ressources serveur
    	$_SESSION['post'] = $_POST;
     
    	//et on redirige SUR LA MEME PAGE
    	header("location:exemple.php");
    	exit;
    }
    ?>
    <html>
    <head>
    </head>
    <body>
    	<form action="exemple.php" method="post">
    		<input type="input" name="exemple" value="<?php echo isset($_SESSION['post']['exemple']) ? $_SESSION['post']['exemple'] : ''; ?>" />
    		<input type="submit" name="Test" />
    	</form>
    </body> 
    </htlm>

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Clebit Voir le message
    Je mélange rien, ...
    La preuve que si.


    Ta solution est (peut-être) fonctionnelle, mais pas dans les même conditions, puisque tu changes de page (même si tu reviens ENCORE sur la même APRES header(location) !).
    Ce qui t'oblige aussi à utiliser des SESSION si on veut ré-afficher des données.

    Mais on ne va pas se fâcher : laissons Kalas22 décider.
    Dernière modification par Invité ; 16/07/2018 à 11h40.

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 103
    Points : 61
    Points
    61
    Par défaut
    J'avoue que je suis un peu perdu, peux-tu m'expliquer en quoi je mélange?

    Ensuite, mon exemple reste sur une seule page de code ce qui répond à la demande de Kalas22. La où ma solution fait la différence, c'est qu'il n'y a plus le message du navigateur "Voulez-vous renvoyez les données..." lorsque l'on actualise ou utilise les flèches pages précédentes et suivantes. Ce qui évite d'inquiéter l'utilisateur moyen et est plus ergonomique.

    Ensuite, tu utilises également les sessions. Moi je les utilises uniquement pour correspondre à ta demande de les ré afficher dans le formulaire mais elles ne sont pas obligatoires.

  11. #11
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Je relance un peut en y ajoutant qu'on peut changer de page en y envoyant l'ID de l'enregistrement effectué et en fait refaire une petite query pour relire la valeur réellement enregistrée, sans passer par une session ... mais c'est le choix de chacun, mois je préfère refaire un bon contrôle.
    En utilisant un formulaire unique pour tout, ce n'est pas difficile à mettre en oeuvre.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2018
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Très bon truc la coup du nombre aléatoire.
    Je me suis rendu compte que je dupliquait sans fin un commentaire en ajustant le css et en actualisant la page !
    Je vais donc essayer sur le champ (du formulaire bien sûr)

    Merci.

Discussions similaires

  1. Verifier valeur d'un formulaire sans recharger la page
    Par afrodje dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 04/02/2009, 16h17
  2. [AJAX] soumission d'un formulaire sans rechargement de page?
    Par coupolites dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/08/2008, 10h07
  3. [AJAX] Transmettre un formulaire sans rechargement de page
    Par micka39 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 21/11/2007, 12h20
  4. [AJAX] Remplir un formulaire sans recharger la page
    Par houdazcom dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/11/2007, 12h37
  5. bouton formulaire qui recharge la page mere
    Par BernardT dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/06/2006, 10h14

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