Moin.
ich wollte mir eine neue Variante des "Form-Wächter" (also mehrfach abschicken der Form vermeiden) schreiben, ohne den User weiter zu leiten.
Im Grunde eine einfache Sache:
- user tippt was ein -> wenn richtig, dann Speichern oder Löschen ...
- das Abgeschickte ($_POST) in session merken
- wenn genau die gleiche Form nochmal rein kommt -> durchfallen lassen oder meckern.
Mein Problem: Ich lösche (unset) alle ungewollten $_POSTs. Aber beim 2ten mal "F5" sind alle $_POSTs wieder da
Hier mal das Script - sollte relative einfach zu lesen sein:
PHP
session_start();
class FormGuard
{
public static function justSubmitted()
{
$_SESSION['formGuard'] = md5(implode(':',$_POST));
}
public static function check($skip=array())
{
if(isset($_SESSION['formGuard'])){
if(isset($_POST)and md5(implode(':',$_POST)) == $_SESSION['formGuard']){
foreach($_POST as $key => $val){
if(!in_array($key,$skip)){
unset($_POST[$key]); echo '<br />unset: $_POST['.$key.']';
}
}
unset($_SESSION['formGuard']); echo '<br />unset: $_SESSION[\'formGuard\']';
return false;
}
}
return true;
}
}
$result = '';
if(!FormGuard::check()){
$result = '<h1>hatten wir schon ...</h1>';
}else{
if(isset($_POST['submit'])){
if($_POST['txt'] == 'test'){
$result = '<h1>irgentwas gespeichert ...</h1>';
FormGuard::justSubmitted();
}else{
$result = '<h1>irgentwas falsch ...</h1>';
}
}
}
echo '
<form name="testform" action="" method="post" enctype="text/html">
<input type="hidden" name="form_id" value="'.microtime(true).'" />
<input type="text" name="txt" value="'.@$_POST['txt'].'" size="20" maxlength="50" />
<input type="submit" name="submit" value="Save" />
</form>
'.$result.'
<hr />
<pre>
$_SESSION (md5): '.@$_SESSION['formGuard'].'
$_POST (md5): '.md5(implode(':',$_POST)).'
$_POST-';
print_r($_POST);
Alles anzeigen