PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : doppelte einträge im gästebuch nach browseraktualisierung (oder F5) vermeiden


mimatete
13.06.2009, 14:02:06
Hallo liebe Experten!

Mein Gästebuch, wohl bemerkt ohne DB, mach endlich, was es soll, sogar in Farbe (www.meinphp.mimatete.de/p3.php). Es macht aber sogar mehr - und zwar wenn man ein Beitrag abschickt und dann die Seite aktualisiert (per Schalter des Browsers oder F5, ich habe Firefox) schreibt das Prog den letzten Beitrag noch Mal ins Buch (dabei sind die Imput-Felder schon leer).
Ich habe folgendes Versucht (nicht gleichzeitig):
den Abschnitt mit
"öffne Datei mit Option 'a', schreibe ein Satz mit Tilden dazwischen, schließe Datei"
habe ich

1. zwischen IF (isset($_POST["Senden"])) und unset($_POST["Senden"]); gestellt
2. zwischen if (($_POST["Senden"])=="Abschicken") und $_POST["Senden"] =""; gestellt

(es handelt sich um die SUBMIT-schaltfläche mit dem Namen SENDEN und dem Wert ABSCHICKEN)

Ich glaube, dass man das Schreiben in die Datei unterbinden kann. Ziel ist: NUR dann schreiben, wenn die Daten per diese besondere Schaltfläche gesendet werden und nicht mit F5.
Bitte um ein Wink. Ich habe keinen Code eingefügt, weil Ihr Menschen und NICHT Parser seid. Mein Problem ist wirklich gut beschrieben.
Danke
mimatete

DokuLeseHemmung
13.06.2009, 14:09:15
Erzeuge eine zufalls "TAN" speichere sie in Session und gib sie als verstecktes Formfeld mit. Vor dem Speichern prüfe die gültikeit der TAN. Nach dem Speichern lösche die TAN in Session.

mimatete
14.06.2009, 14:16:24
Herzlichen Dank.

Folgendes habe ich gemacht:
1. gleich am Anfang des Formulars folgene Zeile eingefügt:
<input type="hidden" name="istweg" value=1>

2. vor dem öffnen der Datei mit den Einträgen:
if ($_POST["istweg"] == 1)

3. Nach dem Schließen der Datei zwei Varianten ausprobiert:

unset($_POST["istweg"]);
$_POST["istweg"] = "";


Leider ist das Programm sehr stur und wiederholt die Ausgabe weiter. Jede Aktualisierung bring eine neue Zeile in die Datei. Hmmmm.....
Ich habe auch nach dem eine Zeile in die Datei geschrieben wurde die entsprechende Variable auf NIX gesetzt. Wo befinden sich die Daten, die wiederholt reigeschrieben werden? im Cache? Ich habe zwar sehr viel über Computer gelernt, aber dieses Verhalten war nicht dabei :(
Hat noch jemand eine Idee?
Stört es, dass die Plausibilitätskontrolle von JS realisiert wird? Ich habe gelesen, dass es ohne Probleme geht und sogar empfohlen wird.

Danke
mimatete

DokuLeseHemmung
14.06.2009, 14:22:33
Wo befinden sich die Daten, die wiederholt reigeschrieben werden? im Cache?
Im Browser Cache!
Und da kommst du mit PHP nicht dran.
Es ist also sinnfrei, im Post Array rumzurühren.

Indyk
15.06.2009, 11:01:26
Hallo mimatete,

du hast zwei gebräuchliche lösungen zu auswahl, einmal die von DokuLeseHemmung vorgeschlagene token lösung, und zum anderen kannst du den user nach der formularverarbeitung weiterleiten, ich zitiere:

Eine Zweite Möglichkeit, mit dem Problem umzugehen, ist, den Benutzer einfach zu "forwarden". Das heißt, dass der User, nachdem die Daten gespeichert wurden, mit Hilfe der Funktion header() umgeleitet wird. Auch damit kann man die Seite "reaload-sicher" machen, da das Versenden der Daten dann nicht mehr in der History des Browsers bleibt; es wird durch die Weiterleitung ersetzt.

mimatete
15.06.2009, 18:02:52
Ach, Ihr lieben Experten,

ich habe nicht nur die 2 Möglichkeiten.

Jetzt gehen "Eingabe" und "Auswertung + Darstellung" getrennte Wege und sind in Frames eingebetet. Ich weiss, dass man Frames nicht mag. Aber jetzt ist mein GB sehr schön und funktioniert (http://www.meinphp.mimatete.de/GB2/gb2.htm).

Wenn man programmiert darf man sich nicht so versteifen auf 2 oder 3 Lösungen.
Vielle Wege führen ins Ziel, auch wenn sie manchmal sehr komisch aussehen.

Ich werde versuchen Euch nicht mehr zu beanspruchen. Ihr seid mir ... zu trocken. Vielleicht, weil Ihr (alle?) Männer seid. Es ist wirklich nicht angenehm von Euch beratschlagt zu werden (mit eine einzige Ausnahme - DokuLeseHemmung). Ich habe keine Komplexe oder Vorurteile, vielleicht bin ich in meiner Krankheit ein wenig dünnhäutig geworden.
Nicht alle Programmierer sind gefühllose Eremiten. Und nicht alle sind Männer ;o)

mimatete

Indyk
15.06.2009, 18:12:37
Hallo mimatete,


du hast zwei gebräuchliche lösungen zu auswahl


Damit meinte ich das es 2 Wege gibt die sich bewehrt haben und auf die oft zurück gegriffen wird. Da steht in keinster weise das es nicht möglich ist diese Problematik auf 1000000 anderen wegen zu lösen.

Das man frames nicht benutzt hat seine Gründe, die dir anscheinend nicht wichtiger sind als deine exotische lösung.

Tut mir leid wenn wir versuchen schnell und kompetent zu helfen und keinen kaffe und kuchen verteilen.

DokuLeseHemmung
15.06.2009, 18:46:18
Danke für die Blumen.
(Nicht alle sehen das so)
Eigentlich bin ich hier dafür "berühmt", dass ich "Denkblockierte" ordendlich zusammenfalte.
(habe hier fast mehr Feinde als Freunde)

Aber das mit dem M/W Gedöns ist mir wurscht. Ich antworte als Neutrum(zumindest versuche ich es).

Zum Thema:
Auch meines bescheidenen Wissens nach, gibts nur diese 2 genannten praktikablen Möglichkeiten. Wie du das per Frames abgehandelt hast, KA. Kann ich mir auch nicht vorstellen.

PS:
Ich habe es gerade mal getestet...
Doppelte Einträge sind über F5 problemlos möglich.

Mache meine Beiträge ruhig weg.....(zumindest den doppelten)

Big-Gremlin
16.06.2009, 05:19:58
@DokuLeseHemmung

zusammenfalten??? naja...ich finde nur, dass du teils eine seltsame Art zu antworten hast wenn man nicht gleich auf den Punkt kommt Oo

wie auch immer....das mit den Frames klappt bei mir auch nich so ganz...kenne auch nur die 2 besagten Lösungen...wobei ich eher zur zweiten tendiere.... man muss bei header() halt nur aufpassen, dass keine Ausgabe vorher kommt

cortex
16.06.2009, 09:27:31
Ich weiss, dass man Frames nicht mag

nein - frames sind lediglich keine antwort auf (d)ein problem. aber nun... jeder, wie er / sie es mag.


Wenn man programmiert darf man sich nicht so versteifen [...]


mich persönlich beschleicht ein sehr eigenartiges gefühl, wenn ein user im anfänger-stadium zuerst einmal (grundlegende) hilfe benötigt und plötzlich kluge sprüche macht.


Es ist wirklich nicht angenehm von Euch beratschlagt zu werden [...]


die hand, die einen füttert, beisst man nicht. ist dir das schon einmal zu ohren gekommen?


Ich habe keine Komplexe oder Vorurteile, vielleicht bin ich in meiner Krankheit ein wenig dünnhäutig geworden.


ach gottchen... und deswegen schwingst du dich zum botschafter - sorry: zur botschafterin - der sensibilität auf und wirfst uns sowas hier an den kopf: Nicht alle Programmierer sind gefühllose Eremiten. verleiht dir deine gesundheitliche beeinträchtigung das recht, uns zu be- / verurteilen...? welche rolle spielt es, dass du (möglicherweise) weiblich bist?

mädchen... du gibst mir kraft am frühen morgen.

cx

mimatete
16.06.2009, 17:04:36
Mit gefühllosen Eremiten habe ich nicht Euch gemeint sondern mich. Manchmal kann man schon vorbei verstehen.

Und warum darf man (Frau!) bitte schön nicht PHP-Anfängerin und gleichzeitig etwas "klug" (weil in die Jahre gekommen) sein?

Ich habe mich noch nicht mal aufgeregt gnadenlos gedutzt zu werden.

Ach Leute, ich danke Euch für Eure Hilfe.
Ich glaube mein GB kann jetzt - mit Umleitung übrigens!
Und noch ein Wort zu Frames - man mag sie nicht, weil sie nicht mit jedem Browser können.
Aber ich dachte, hier ist es bekannt.
Man weiß nie, wer einen Beitrag liesst, und wer antwortet. Und auch nicht wer einen schreibt
In dem Sinne
mimatete

Sandra
03.07.2009, 18:02:02
Hallo,

ich habe dieses Problem mit einer generierten Zufallszahl gelöst,die zudem vor spam eingaben schützen soll:


//Vor dem Formular:
$zufallszahl1 = rand(1,9);
$zufallszahl2 = rand(1,9);
$rechenaufgabe= $zufallszahl1.'+'.$zufallszahl2.'=';
$rechenfeld1="<input name='zufallszahl1' type='hidden' value='$zufallszahl1'>";
$rechenfeld2="<input name='zufallszahl2' type='hidden' value='$zufallszahl2'>";
$rechnen=$rechenaufgabe."<input type='text' name='confirm' value='' size='5' />";

//im Formular
echo $rechnen.$rechenfeld1.$rechenfeld2

//vor dem Öffnen und Hineinschreiben

if(($_POST['confirm']!=($_POST['zufallszahl1']+$_POST['zufallszahl2'])))
{
echo"<span class='red'>Sie haben vergessen die Bestätigung einzugeben</span>";}



Da bei jedem neuen Aufruf der Seite auch bei F5 neue Zufallszahlen generiert werden, gibt es keinen doppelten Eintrag.

Sandra

cortex
03.07.2009, 19:17:46
ich habe dieses Problem mit einer generierten Zufallszahl gelöst

wurde bereits vorgeschlagen... die op war allerdings beratungsresistent und darüber hinaus (nach selbsteinschätzung) dünnhäutig.

cx