Re-submit voorkomen in een formulier - Hoe?
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)
1
2
3
2
3
<?php
<input type="hidden" name="myform_key" value="<?php echo md5("CrazyFrogBros"); ?>" />
?>
<input type="hidden" name="myform_key" value="<?php echo md5("CrazyFrogBros"); ?>" />
?>
Daarna deze code in mijn php pagina:
Code (php)
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
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']);
}
?>
$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
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..
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
Dus nadat het formulier is verzonden en verwerkt, doe je:
Eingenlijk ben ik er bijna, maar ik snap iets niet.
Zie deze code:
Code (php)
1
2
3
4
5
6
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>
?>
<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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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']."";
}
}
}
?>
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
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.
index.php?pagina=formulier (de pagina van je formulier)
Code (php)
1
2
3
4
2
3
4
<form action="formulier_verwerken.php" method="POST">
<input type="text" name="blah">
<input type="submit" value="Verzenden" name="formulier">
</form>
<input type="text" name="blah">
<input type="submit" value="Verzenden" name="formulier">
</form>
formulier_verwerken.php
Code (php)
Op dit manier kom je die foutmelding niet tegen
Gewijzigd op 27/12/2012 11:31:44 door Albert de Wit
Gewijzigd op 27/12/2012 11:34:03 door Sara Z
Gewijzigd op 27/12/2012 11:31:36 door Albert de Wit
De opbouw van mijn script is precies wat je hierboven ziet. Dus eerst
Dan het html formulier en vervolgens de php code.
Moet ik de volgorde veranderen? Is dat wat je bedoelde? Geef mij een voorbeeld aub
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
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