[PHP] POST informatie twee maal submitted na F5

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een reactie systeem voor m'n website gemaakt.
Hierbij gaat alles met een POST naar dezelfde php. (Dus het formulier in 'response.php' submit de invoer naar 'response.php' waar het dan verwerkt wordt.)

Dit heeft het nadeel dat wanneer ik een f5 doe ik het prachtige pop-upje krijg:
Deze pagina kan niet worden vernieuwd zonder opnieuw de gegevens te verzenden...

Klik je dan op retry wordt de submit twee keer gepost. Dat wil ik voorkomen.
Nu heb ik al slim helemaal onderaan in het script alle relevante variabelen ge- unset, maar daar trekt de browser zich niets van aan.

Iemand enig idee hoe ik na de verwerking van de POST informatie deze kan resetten voor de browser, zodat een F5 gewoon de pagina refreshed?

Acties:
  • 0 Henk 'm!

  • G F0rce 1
  • Registratie: Juli 2003
  • Laatst online: 04-03-2015
Je zou natuurlijk een beveiliging kunnen maken dat een user binnen een x tijd niet kan posten na zijn vorige post. Dus wanneer de informatie dan gesubmit wordt kijk je naar de tijd van zijn vorige post, als het verschil nu kleiner is als x dan krijgt hij een foutmelding.
(waarin x bijvoorbeeld een halve minuut is).

I feel absolutely clean inside, and there is nothing but pure euphoria. - Alexander Shulgin


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-09 08:50

gorgi_19

Kruimeltjes zijn weer op :9

Na posten een Response.Redirect of Header("Location: ..") gebruiken.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
G F0rce 1 schreef op 12 juli 2004 @ 16:17:
Je zou natuurlijk een beveiliging kunnen maken dat een user binnen een x tijd niet kan posten na zijn vorige post. Dus wanneer de informatie dan gesubmit wordt kijk je naar de tijd van zijn vorige post, als het verschil nu kleiner is als x dan krijgt hij een foutmelding.
(waarin x bijvoorbeeld een halve minuut is).
Dat maakt niets uit, wanneer hij vervolgens na die halve minuut een F5 doet om de page te refreshen (net als je bij een forum doet om reactie's te checken) wordt nog steeds de informatie twee maal gepost.
gorgi_19 schreef op 12 juli 2004 @ 16:18:
Na posten een Response.Redirect of Header("Location: ..") gebruiken.
De header optie kreeg ik eerder. Maar die werkt alleen wanneer ik een en ander boven alle HTML zet?

Acties:
  • 0 Henk 'm!

  • bakakaizoku
  • Registratie: Januari 2002
  • Laatst online: 17-09 10:27
gorgi_19 schreef op 12 juli 2004 @ 16:18:
Na posten een Response.Redirect of Header("Location: ..") gebruiken.
De enige oplossing ja.

PSN: bakakaizoku - WoW: Thiccblonde (GM of Phoenix Ascension) @ Twisting-Nether


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

React slaat gewoon simpelweg je 'last post' tekst op en staat niet toe dat deze identiek is aan een nieuwe :)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-09 14:32

André

Analytics dude

En meerdere bestanden gebruiken is geen optie?

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

André:
En meerdere bestanden gebruiken is geen optie?
mattttt:
De enige oplossing ja.
What he said ^^^

Een location header is de enige oplossing hiervoor.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • ikke007
  • Registratie: Juni 2001
  • Laatst online: 18-09 14:10
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$bericht = $_POST['bericht'];
$ip         = $_SERVER['REMOTE_ADDR'];
$code    = md5(time('d-m-Y').$bericht.$ip);

$sql_test = "SELECT code FROM berichten WHERE code = '".$code."' LIMIT 1";
$exc_test = myql_query($sql_test) or die(mysql_error());
if(mysql_num_rows($exc_test) <> 1){
  #hele zwik inserten in database
}
else{
  #hij bestond al dus een f5!!!
}


Op deze manier kun je afvangen dat een gebruiker op f5 ramt en zijn stuff nog een keer post... alleen als hij om 23.59 post en om 00.00 f5 doet zal het niet werken. je zult dan dus moeten werken met mktime() oid...

echter is header(location:blblabla) een betere oplossing imho

[ Voor 12% gewijzigd door ikke007 op 12-07-2004 16:43 . Reden: header() :) ]

Lets remove all security labels and let the problem of stupidity solve itself


Acties:
  • 0 Henk 'm!

  • -Odysseus-
  • Registratie: Oktober 2002
  • Laatst online: 21-01-2009
Je kan bijvoorbeeld ook een random MD5 hash gebruiken. Deze sla je op in je database en als de hash van het opgestuurde formulier overeenkomt met hetgeen in de database dan moet je het niet opslaan.

Helemaal goed is natuurlijk als je een timestamp in je database opslaat. Dan is het nooit gelijk.

Deze moeten dus wel in PHP gegenereerd worden voordat je het formulier aan de gebruiker laat zien en dan kan je dit in een hidden field kwijt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hoho jongens, ik heb verleden week zondag voor het eerst een php boek gekocht, dus de inside termen zijn me nog wat vreemd

De volgorde van mijn code:

De PHP code begint met het controleren of er 'gequote' wordt. Zoja, wordt de data van desbetreffende quote (naam van de poster, datum geplaatst en de daadwerkelijke content) uit de database gehaald en aan enkele variabelen toegewezen. Vervolgens pas ik wat controlles toe om geneste quotes (quotes in quotes in quotes, etc... een droste effect) te voorkomen en het uiteindelijke resultaat staat in 1 variabele

Vervolgens wordt in HTML het invulformulier opgebouwd. in de textarea tag komt een klein stukje PHP welke de variabele van de 'quote-php' bekijkt. Indien leeg gebeurt er niets, ander wordt er in het invoerveld de gequote tekst getoont.

De volgende stap is het php script wat de waarden uit het formulier ontvangt en verwerkt. Ik strip hier alle HTML tags, zodat lolbroeken de lay-out niet verneuken, controlleer of er een naam en datum is ingevoerd en vervolgens wordt alles naar de database tabel geschreven.

Als laatste het PHP script welke de data weer uit de tabel leest, de smiley en quote codes omzet naar correcte XHMTL codes en uiteindelijk wordt alles in correct HTML op het scherm gezet.

In mijn opinie moet bij de stap waar ik de waarden uit het formulier ontvang die header(location: ....); plaatsen.

Maar hoe ik het ook neerzet, er gebeurt niets.
Plaats ik de optie voor de doctype, etc werkt het wel. (de redirect dan, dat is nog geen oplossing voor het probleem :) )

De pagina waar het om gaat www.123swets.com/response.php

Acties:
  • 0 Henk 'm!

  • bakakaizoku
  • Registratie: Januari 2002
  • Laatst online: 17-09 10:27
formsubmit.php
PHP:
1
2
3
4
5
6
7
8
9
<?

if (!empty($_POST['naam'])) {
mysql rotzooi etc;
header("Location: dank.php");
} else {
echo "<html>"; etc etc
}
?>

PSN: bakakaizoku - WoW: Thiccblonde (GM of Phoenix Ascension) @ Twisting-Nether


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het werkt niet.
Voor de zekerheid heb ik eerst een andere code toegevoegd om te zien of ik uberhaupt wel op de juiste plek uitkwam:
PHP:
1
print ('hier kom ik altijd na een submit')

En inderdaad, zodra ik submit aanklik krijg ik de tekst in beeld te zien.

vervang ik de print door
PHP:
1
header("Location: http://www.123swets.com/index.php");

Gebeurt er niets.

Zet ik de header regel helemaal bovenaan in mijn document, zelfs nog voor de doctype, en ik ga naar response.php wordt ik netjes geredirect naar index.php.

Schiet mij maar lek :/

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Je mag niks outputten voordat je een header verstuurd.
Onthoud dat header() moet worden aangeroepen voor er output is verzonden, door normale HTML tags, lege regels in een file, of vanuit PHP. Het is een veel voorkomende fout om met include(), require(), functies, of een andere file toegang functie output te verzenden voordat header() wordt aangeroepen. Hetzelfde probleem bestaat wanneer er een enkele PHP/HTML file wordt gebruikt.
http://nl3.php.net/manual/nl/function.header.php

Kijk hier eens naar:
http://nl2.php.net/manual/nl/function.ob-start.php

[ Voor 7% gewijzigd door Brakkie op 12-07-2004 17:54 ]

Systeem | Strava


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Inderdaad heb ik een en ander prima voor elkaar gekregen met buffering :)
Bedankt voor de tips!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GEK wordt ik ervan....

code:
1
$invoer = preg_replace("/(www*.*?)(\s|$|\\[)/i",'<a href="http://\1" rel="external">\1</a> ',$invoer);


Mooi en prachtig

www.123swets.com wordt netjes een linkje
'www.123swets.com test' wordt www.123swets.com ook netjes een linkje en de spatie tussen de com en test blijft gewoon bestaan.

bij 'www.123swets.com[' wordt www.123swets.com als link... zonder de [. Waar blijft die????
Dat probleem had ik eerst ook met de spatie.
Big deal zou je denken, maar [.quote]www.123swets.com[./quote] geeft door het in cyberspace verdwijnen van de blokhaak hele rare taferelen.

-edit-
overigens geeft 'www.123swets.com[test' als output www.123swets.com test. De blokhaak wordt dan opeens spatie.

[ Voor 18% gewijzigd door Verwijderd op 15-07-2004 21:17 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom match je na de www. dan ook op een [? 8)7

Tipje: http://www.regexplib.com/

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
NMe84 schreef op 15 juli 2004 @ 21:25:
Waarom match je na de www. dan ook op een [? 8)7

Tipje: http://www.regexplib.com/
[.quote]www.123swets.com[./quote]
Hoe moet ik hier anders de www uit vissen?
ik moet ERGENS vanuit gaan waar de wuote eindigt. Ik ga nu uit van een spatie, einde string of blokhaak.

Overigens heb ik het al gevonden
code:
1
 $invoer = preg_replace("/(www\..*)(\s|$|\\[)/Ui",'<a href="http://\1" rel="external">\1</a>\2',$invoer);

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 12 juli 2004 @ 16:15:
Ik heb een reactie systeem voor m'n website gemaakt.
Hierbij gaat alles met een POST naar dezelfde php. (Dus het formulier in 'response.php' submit de invoer naar 'response.php' waar het dan verwerkt wordt.)

Dit heeft het nadeel dat wanneer ik een f5 doe ik het prachtige pop-upje krijg:
Deze pagina kan niet worden vernieuwd zonder opnieuw de gegevens te verzenden...

Klik je dan op retry wordt de submit twee keer gepost. Dat wil ik voorkomen.
Nu heb ik al slim helemaal onderaan in het script alle relevante variabelen ge- unset, maar daar trekt de browser zich niets van aan.

Iemand enig idee hoe ik na de verwerking van de POST informatie deze kan resetten voor de browser, zodat een F5 gewoon de pagina refreshed?
In een sessise zet je een "random nummer" (hash, tijd, whatever, zolang deze maar uniek is).
Ditzelfde "random" nummer zet je in een hidden form-field.

Als het form op een "normale manier" gepost wordt, dan zijn deze twee waarden gelijk. In dat geval worden de gegevens verwerkt. en verander je het "random number" weer.

Bij een F5, wijkt het "random number" in het form-vield af van de waarde in de sessie. In dit geval laat je de actie vervallen en doe je alleen een weergave van de gegevens. En verander je natuurlijk weer het "random number".

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 15 juli 2004 @ 23:40:
[...]

In een sessise zet je een "random nummer" (hash, tijd, whatever, zolang deze maar uniek is).
Ditzelfde "random" nummer zet je in een hidden form-field.

Als het form op een "normale manier" gepost wordt, dan zijn deze twee waarden gelijk. In dat geval worden de gegevens verwerkt. en verander je het "random number" weer.

Bij een F5, wijkt het "random number" in het form-vield af van de waarde in de sessie. In dit geval laat je de actie vervallen en doe je alleen een weergave van de gegevens. En verander je natuurlijk weer het "random number".
Ik heb gewoon de redirect gebruikt :)
Maar deze oplossing is wel mooi.
Pagina: 1