[php]dubbelposten voorkomen

Pagina: 1
Acties:
  • 66 views sinds 30-01-2008

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Topicstarter
hallow :)
ik heb gisteravond even een mooi scriptje gemaakt waarbij mensen commentaar kunnen geven op een foto...
nu is het echter zo dat na het geven van het commentaar iemand op F5 kan drukken en op die manier een post opnieuw toe kan voegen (dit wil ik dus niet hebben want als een of andere mallot 100 x op F5 drukt dan staat dat bericht 100 keer in de dbase)
ik heb er dus het volgende op gedaan:

PHP:
1
2
3
4
5
6
7
8
9
10
11
if($_POST['addcomment'] && $comment != "") { 
    $comment = htmlspecialchars(stripslashes($comment));
        $datum = date("d/m/y");
        $tijd = date("H:i");
        $adden = "INSERT INTO newscomments (nieuws, auteur, inhoud, datum, time) 
        VALUES ('$id', '$s_user_username', '$comment', '$datum','$tijd')";
        $addit = mysql_query($adden)or die(mysql_error());
        empty($comment);
}
// hieronder staan alle reacties onder elkaar een een
<form> waar mensen hun commentaar kunnen invullen


nadat de comment is toegevoegd aan de database emptied hij comment.
hij voegt alleen iets toe als $_POST['addcomment'] && $comment != "" dus dan zou hij hem niet toe moeten voegen.
vreemd echter vind ik dat als ik niks invul in het formulier en ik druk op submit, dan ziet het script dat comment leeg is en voegt hij niets toe. Als ik echter iets toevoeg maakt hij comment daarna niet leeg waardoor het F5-probleem nog steeds niet is opgelost...
Kan iemand mij misschien helpen met het oplossen van dit probleem, want ik zit er nu al de hele morgen op en begin er een beetje shaggie van te worden :'(

alvast bedankt

[ Voor 14% gewijzigd door Harrie_ op 21-09-2003 15:04 ]

Hoeder van het Noord-Meierijse dialect


  • JER00N
  • Registratie: Maart 2002
  • Niet online
Je kan bijvoorbeeld een cookie bij de submitter instellen met bijv een microtime er in. Als hij weer wil posten, vergelijk je de microtime van 'nu' met de microtime uit de cookie. Is dat verschil nu groter dan bijv 30 seconden, dan kun je zeggen 'ok, post maar!'. Als het minder is (en dus waarschijnlijk een dubbelpost) dan kan je zeggen 'wacht nog maar even ;)' :)

Verwijderd

Of je zou sessies kunnen gebruiken dat voorkomt alle misbruik zeker, een sessie is eigenlijk hetzelfde als een cookie maar dan serverside. Hoe dit precies werkt weet ik ook nog niet.

Verwijderd

Je kunt van alles en nogwat doen. Je kunt de POST laten verwerken voor een PHP script dat geen output genereert, maar alleen een Location header dat verwijst naar een script dat zegt of de post geslaagd is of niet. Als het goed is, gaan de user agents bij een F5 dan naar de url waar ze uiteindelijk terecht kwamen, dus niet het verwerkende script, maar het script met de bevestiging.

Wat ik me ook nog kan bedenken, is dat je voor iedere user een unieke string maakt, en die je als hidden input element meegeeft aan het formulier. Als bij een post de code uit het formulier en uit de database/sessie overeenkomen, dan verwerk je de post en genereer je een nieuwe unieke code voor de user.

Dit is even een brainstorm, ik heb het verder niet uitgedacht, maar volgens mij zijn er genoeg mogelijkheden. Het 2e idee kun je ook gebruiken ter preventie van flooding.

  • mjvdvlugt
  • Registratie: Maart 2003
  • Laatst online: 23-06 19:13
Wanneer de user op F5 drukt, dan wordt de complete HTTP request opnieuw verzonden. De POST-waarden waar je gebruik van maakt worden dus opnieuw verkregen.

Is hier niet makkelijker om eerst een query in de database te doen om te kijken of dezelfde user datzelfde bericht al heeft gepost in de laatste 10 mins?

Verwijderd

Ik zou na het posten de gebruiker via een header doorsturen naar een bepaalde pagina. Als je er dan nog voor zorgt dat de pagina met het formulier expired is, dan kan je ook niet door middel van de 'back' knop terug naar de vorige pagina.

Succes :)

edit:
Ben niet de eerste...

[ Voor 10% gewijzigd door Verwijderd op 21-09-2003 15:13 ]


  • Evilbee
  • Registratie: November 2002
  • Laatst online: 21-08 16:37
je kan ook in je database het veld waar het commentaar in staat uniek maken. Dan geeft de database een error.

Wat ik meestal doe is, net als Cheatah, een header laten uitvoeren die naar een andere pagina gaat.

LinkedIn - Collega worden?


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Zou het niet makkelijk zijn om te kijken of deze vraag al een keer is gevraagd.

Voor hetzelfde geld kom je er opeens achter dat een soortgelijke vraag zelfs deze week reeds is gesteld.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Pagina: 1

Dit topic is gesloten.