Reload (F5)

  • #1
N

noah1

Bekanntes Mitglied
Themenersteller
Dabei seit
16.08.2002
Beiträge
1.415
Reaktionspunkte
0
Ort
Hamburg
Hallo, folgendes Problem:
Ich bastele gerade an einer Website (PHP), unter anderem mal als Beispiel ein Formular zum Anlegen von Benutzern, die Zugang zum Admin-Center bekommen.
Sieht so aus:
accounts.inc.php
Code:
...
<?PHP
else if(($_REQUEST['submit']) && ($_POST['submit'] == Account speichern))
		{
			...
			if($fehler)
				{
				$fehler = 0;
				include(admin/accounts/account_neu.inc.php);
				}
			else if(!$fehler)
				{
				include(save/dbconnect.inc.php);
				$query = INSERT INTO accounts SET vorname =->.$_POST['vorname'].', nachname =->.$_POST['nachname'].', username =->.$_POST['username'].', password =->.md5(geheim).', usergroup =->.$_POST['usergr'].';
				mysql_query($query);
				mysql_close($dz);
				echo<meta http-equiv='Refresh' content='0; url=index.php?go=accounts'>;
				}			
		}
	else
		{
			include(admin/accounts/accounts_anzeigen.inc.php);
		}
?>

Die daten werden von der Datei account_neu.inc.php über ein Formular übergeben - funzt alles prima.
Jetzt kommt aber mein Problem, ich denke dieses Problem haben viele.
Wenn ich also die Daten übergebe werden sie in die Datenbank geschrieben und es wird wieder die Seite accounts.anzeigen.inc.php angezeigt - eine Liste bereits bestehender Accounts. Wie aber kann ich verhindern dass die Daten durch das Aktualisieren im Browser erneut gesendet werden?
 
  • #2
OK, so ganz versteh ich die Frage zwar nicht (oder doch :-\), aber nach dem Refresh sind doch die $_POST-Daten eh weg.

Zur Sicherheit kannste ja vor dem Refresh noch $_POST zurücksetzen.

$_POST = false;

oder

unset($_POST);
 
  • #3
PCDConny schrieb:
aber nach dem Refresh sind doch die $_POST-Daten eh weg.

Nee, leider nicht. Im Cache des Browsers sind sie offensichtlich noch gespeichert, (trotz <meta http-equiv=cache-control content=no-cache />im <head>), und bei einem Reload der Seite werden sie wieder an das Script übergeben. Und dem Script ist es wohl egal woher die Daten kommen, die werden in die DB geschrieben.

Mit unset($_POST); komme ich auch nicht weiter, ich denke mal daß ich damit ja nicht die eingegebenen Formulardaten im Cache des Browsers leere.
 
  • #4
Dann gib dem Formular einen timestamp mit auf die Reise, den kannste z.B. in der SESSION speichern.


Code:
<form .....>
 <input type=hidden name=timecheck value=<?php echo time(); ?> />
 <input ......
 <input ......
</form>

<?php
.....
.....

if($_POST[timecheck] == $_SESSION[timecheck]) $error = true;

.....
.....

mysql_close($dz);
$_SESSION[timecheck] = $_POST[timecheck];

.....
.....
?>

Natürlich sollte eine SESSION gestartet sein ;)

Du kannst natürlich den timestamp auch in die DB schreiben und vor dem INSERT abfragen ob für diesen timestamp schon ein Eintrag existiert.
Das würde dann auch ohne SESSION funktionieren.
 
  • #5
Session ist ein gutes Stichwort - ich definiere einfach in der Datei die für das Formular included wird eine Variable die ich in der Session speichere und gebe der den Wert 1. Vor dem Speichern der übergebenen Daten frage ich ab ob die Variable den Wert 1 hat, wenn ja wird alles in die DB geschrieben, wenn nicht dann passiert nichts...
Nach dem Eintrag in die DB muß ich nur der Variablen den Wert 0 oder sonstwas geben...
Code:
<?php
	$_SESSION[db_eintrag] = 1;
	?>
<form method=post action=index.php?go=accounts>
<table style=80$; margin:auto; font:9px verdana; color:#CCCCCC;>
	<tr>
		<td style=font:11px verdana; text-align:center colspan=2>Neuen Account anlegen</td>
	</tr>
...
Code:
else if(($_REQUEST['submit']) && ($_POST['submit'] == Account speichern) && ($_SESSION['db_eintrag'] == 1))
		{$query = INSERT INTO accounts SET vorname =->.$_POST['vorname'].', nachname =->.$_POST['nachname'].', username =->.$_POST['username'].', password =->.md5(geheim).', usergroup =->.$_POST['usergr'].';
				mysql_query($query);
				mysql_close($dz);
				$_SESSION['db_eintrag'] = 0;
				include(admin/accounts/accounts_anzeigen.inc.php);
...
?>
Und das Beste - es funktioniert. :1
 
  • #6
Ich bin stolz auf dich, aber im Prinzip ist es genau das was ich vorgeschlagen hab :2funny: :2funny:
 
  • #7
Aber bei Deiner Lösung habe ich länger gebraucht bis ich sie verstanden habe als bei meiner... ;D
 
Thema:

Reload (F5)

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.965
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben