Re-submit voorkomen in een formulier - Hoe?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Sara Z

Sara Z

26/12/2012 22:50:30
Quote Anchor link
Hallo allemaal,

Ik worstel al twee dagen met een formulier, maar nog geen goede resultaten.

Ik heb een sessie met een unieke ID gemaakt en geplaatst in mijn formulier:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
<input type="hidden" name="myform_key" value="<?php echo md5("CrazyFrogBros"); ?>" />
?>



Daarna deze code in mijn php pagina:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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


$is_new_post
= true;
  if (isset($_SESSION["myform_key"]) && isset($HTTP_POST_VARS["myform_key"])) {
      // is the form posted and do the keys match
    
      
      
      if($HTTP_POST_VARS["myform_key"] == $_SESSION["myform_key"] ){
        $is_new_post = false;
        
      }
    }


    
    
     if($is_new_post){
      // register the session key variable
      $_SESSION["myform_key"] = $HTTP_POST_VARS["myform_key"];


$sql = "INSERT INTO...

unset($_SESSION['myform_key']);
}

?>



Ik wil eigenlijk de gegevens naar de database sturen alleen maar als ik op de knop druk en niet door f5 te klikken.

Hoe moet ik dat oplossen?
Alvast bedankt
Sara
 
PHP hulp

PHP hulp

22/11/2024 07:03:00
 
Reshad F

Reshad F

26/12/2012 23:36:50
Quote Anchor link
sowieso zou ik de isset vervangen door een

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
 if($_SERVER['REQUEST_METHOD'] == 'POST') {
// je code
}
?>


of je de f5 kan disablen.. hmm volgens mij niet.. maar wanneer je controleert of die hash al in de database staat dan zou je nooit een dubbele record krijgen in principe..
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/12/2012 23:47:48
Quote Anchor link
Je kunt niet voorkomen dat een form twee of meer keer gepost wordt. wel kun je inderdaad voor zolang een sessie duurt voorkomen dat je twee keer een query uitvoert.

unset moet je weghalen. je wilt dat je session variabele blijft bestaan.
$http_post_vars kun je beter vervangen voor $_POST['myform_key'] omdat die verouderd zijn
 
Ozzie PHP

Ozzie PHP

27/12/2012 01:10:01
Quote Anchor link
Na het versturen van het formulier kun je via header('Location: ') de bezoeker naar een nieuwe pagina sturen. De formuliergegevens worden dan automatisch gewist (en kunnen niet nogmaals verzonden worden door de pagina te verversen / op F5 te drukken).

Dus nadat het formulier is verzonden en verwerkt, doe je:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
header('Location: http://www.mijnsite.nl/gewenstepagina');
exit();
?>
 
Sara Z

Sara Z

27/12/2012 10:59:26
Quote Anchor link
Dankjewel voor de reactie. Ik wil op dit moment geen bruik maken van de Header(....).

Eingenlijk ben ik er bijna, maar ik snap iets niet.

Zie deze code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php

$_SESSION
['token'] = md5(date('U').'-'.rand(1000000,9999999));
?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
<form action="test_form.php" method="post">
    <
input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?>" />
    <
input type="submit" value="Submit" />
<
/form>
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
if (isset($_SESSION['token']))
{

    if (isset($_POST['token']))
    {

        
        if ($_POST['token'] != $_SESSION['token'])
        {

        echo "FOUT<br />S= ".$_SESSION['token']."<br />T= ".$_POST['token']."";
        }

        
        if ($_POST['token'] == $_SESSION['token'])
        {

        echo "GOED<br />S= ".$_SESSION['token']."<br />T= ".$_POST['token']."";
        }
        
        }
    }

?>


Ik vind het vreemd want $_POST['token'] moest gelijk zijn aan $_SESSION['token'] als ik op submit klik en niet gelijk als ik op f5 druk.

NB: als ik op f5 druk, dan is het altijd $_POST['token'] != $_SESSION['token']. Dus dit is goed.(De $_SESSION['token'] verandert en $_SESSION['token'] niet.

Nu is het probleem bij submit.

Wat doe ik hier fout?
Alvast bedankt
Sara
Gewijzigd op 27/12/2012 11:11:15 door Sara Z
 
Erwin H

Erwin H

27/12/2012 11:22:38
Quote Anchor link
Hoe is je opbouw van je script? Genereer je het token helemaal aan het begin? In dat geval is er al een nieuw token aangemaakt voor het gecontroleerd wordt.
 
Albert de Wit

Albert de Wit

27/12/2012 11:29:29
Quote Anchor link
Ozzie, je moet wel erbij vertellen dat als je een header in de php code zet dat er geen output boven mag staan. Dat kun je voorkomen door het volgende:

index.php?pagina=formulier (de pagina van je formulier)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<form action="formulier_verwerken.php" method="POST">
<input type="text" name="blah">
<input type="submit" value="Verzenden" name="formulier">
</form>


formulier_verwerken.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
    if (isset($_POST['formulier'])){
        // data hier verwerken
        
        header('Location: index.php?pagina=formulier');
        exit();
    }
}

?>


Op dit manier kom je die foutmelding niet tegen
Gewijzigd op 27/12/2012 11:31:44 door Albert de Wit
 
Sara Z

Sara Z

27/12/2012 11:29:53
Quote Anchor link
Foutje!
Gewijzigd op 27/12/2012 11:34:03 door Sara Z
 
Albert de Wit

Albert de Wit

27/12/2012 11:30:33
Quote Anchor link
foutje
Gewijzigd op 27/12/2012 11:31:36 door Albert de Wit
 
Sara Z

Sara Z

27/12/2012 11:30:33
Quote Anchor link
Hoi Erwin,

De opbouw van mijn script is precies wat je hierboven ziet. Dus eerst
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$_SESSION
['token'] = md5(date('U').'-'.rand(1000000,9999999));
?>


Dan het html formulier en vervolgens de php code.

Moet ik de volgorde veranderen? Is dat wat je bedoelde? Geef mij een voorbeeld aub
 
Erwin H

Erwin H

27/12/2012 11:37:34
Quote Anchor link
Precies. Je verandert nu de code elke keer dat je script aangeroepen wordt. Maar daarna controleer je de code pas met wat er in $_POST staat. Omdat inmiddels de $_SESSION is verandert, klopt die code dus niet meer.

Enige wat je hoeft te veranderen is eerst je code te checken en dan pas je sessie aan te passen.

Goede regel is uberhaupt om altijd eerst je hele php logica af te werken en dan pas je html te plaatsen. Volgorde die ik zou nemen is:
- php code, code check tussen POST en SESSION
- SESSION veranderen
- html form opmaken
 
Sara Z

Sara Z

27/12/2012 11:42:04
Quote Anchor link
Hoi Erwin,

Dankjewel. Het is opgelost. Ik het het net getest en nu zie ik de juiste resultaten.
Ik wens iedereen een fijne dag verder. Weer iets nieuws geleerd vandaag.

Groetjes,
Sara
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.