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:

<?php
<input type="hidden" name="myform_key" value="<?php echo md5("CrazyFrogBros"); ?>" />
?>


Daarna deze code in mijn php pagina:

<?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
sowieso zou ik de isset vervangen door een

<?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..
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
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:

<?php
header('Location: http://www.mijnsite.nl/gewenstepagina';);
exit();
?>
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:

<?php

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

<?php
<form action="test_form.php" method="post">
<input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?>" />
<input type="submit" value="Submit" />
</form>
?>
<?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

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.
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)

<form action="formulier_verwerken.php" method="POST">
<input type="text" name="blah">
<input type="submit" value="Verzenden" name="formulier">
</form>


formulier_verwerken.php

<?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
Foutje!
foutje
Hoi Erwin,

De opbouw van mijn script is precies wat je hierboven ziet. Dus eerst
<?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
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

Reageren