[PHP] postgegevens wissen *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo allen,

Ik heb een postsysteem in php geschreven zonder gebruik te maken van mysql. Hij schrijft de berichten weg in een .txt-file. Echter de post form gaat naar dezelfde site toe. En als ik dan vernieuw zijn er nog postgegevens aanwezig en als je dan 'OK' geeft, dan wordt er opnieuw gepost. Dit heb ik al geprobeerd:
PHP:
1
2
3
4
unset($_POST['submitb']);  //naam van de post form
unset($_POST['submit']);
unset($_POST['berichtb']);  //naam van het invoerveld
unset($_POST);

Acties:
  • 0 Henk 'm!

  • Justifier
  • Registratie: December 2004
  • Laatst online: 06-04-2024
En kan dit niet werken, of is dit niet helemaal wat je zoekt.

PHP:
1
$_POST['berichtb'] = "";

Acties:
  • 0 Henk 'm!

Verwijderd

Dit komt omdat aan de kant van de client de postwaarden nog in het geheugen zitten.

De (makkelijkste) oplossing is om gebruik te maken van 2 pagina's.

Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Komen die oude waarden werkelijk terug in de source van het formulier? Of cachet de browser ze? :)

Acties:
  • 0 Henk 'm!

Verwijderd

Ik vermoed het laatste, dat heb je wel eens vaker als je een pagina refresht en dan begint de browser te zeuren van "hier horen eigenlijk POST gegevens bij, zal ik die nu weer meesturen?".

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Even een titlefix: [postgegevens wissen] -> [PHP] postgegevens wissen

Wil je daar voortaan zelf even op letten? ;) Dank u :Y)

[ Voor 24% gewijzigd door RobIII op 13-03-2007 17:16 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 13 maart 2007 @ 16:55:
Ik vermoed het laatste, dat heb je wel eens vaker als je een pagina refresht en dan begint de browser te zeuren van "hier horen eigenlijk POST gegevens bij, zal ik die nu weer meesturen?".
Dit is inderdaad het geval. Ik heb nu bij het submit gedeelte de volgende session variabele:
$_SESSION[berichtb] = $_POST['berichtb'];
als ik boven mijn php zet echo $_SESSION[berichtb] dan wordt deze niet het net geposte bericht. Als ik $_SESSION[berichtb] gebruik direct na het aanmaken/wijzigen om in de txt file te schrijven dan wordt wel de goede inhoud weggeschreven.
Justifier schreef op dinsdag 13 maart 2007 @ 16:37:
En kan dit niet werken, of is dit niet helemaal wat je zoekt.

PHP:
1
$_POST['berichtb'] = "";
Dit lijkt niet te werken...

@MOD: sorry for the bad title

[ Voor 15% gewijzigd door Verwijderd op 13-03-2007 17:30 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ok, maar waarom is het dan geen optie om 2 bestanden aan te maken...1 (html?) met het formulier en 1 php die het formulier verwerkt, en uiteindelijk weer terugkomt (via Header("Location: x.html"); ) bij het formulier?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik had al geprobeerd om het submit gedeelte in een aparte functie in een aparte php te zetten, maar toen ging het nog steeds mis...

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 21:36

orf

Na je verwerking van de POST een
PHP:
1
2
3
<?php
header('Location: http://www.domein.nl/script.php');
?>


geven. Dan heb je een nieuwe pagina zonder POST en kun je dus ook gewoon refreshen.

De URI in de header kun je natuurlijk dynamisch erin zetten met behulp van de $_SERVER array.

[ Voor 6% gewijzigd door orf op 13-03-2007 18:02 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
orf schreef op dinsdag 13 maart 2007 @ 18:01:
Na je verwerking van de POST een
PHP:
1
2
3
<?php
header('Location: http://www.domein.nl/script.php');
?>


geven. Dan heb je een nieuwe pagina zonder POST en kun je dus ook gewoon refreshen.

De URI in de header kun je natuurlijk dynamisch erin zetten met behulp van de $_SERVER array.
Ook die optie had ik al geprobeed, alleen dan krijg ik:

Warning: Cannot add header information - headers already sent by (output started at c:\phpdev\www\public\beschikbaarheid\main.php:27) in c:\phpdev\www\public\beschikbaarheid\main.php on line 166

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 21:36

orf

Dat komt omdat je output geeft voordat je dat zou moeten doen. Kun je ranzig oplossen met ob_start() of netjes oplossen door eerst de data te verwerken en dan pas iets op het scherm te printen.

Acties:
  • 0 Henk 'm!

  • b19a
  • Registratie: September 2002
  • Niet online
Kortom, wat gebeurt er op regel 27 in mail.php dat je al output geeft? Dat moet niet, anders werkt de header niet; zoals de foutmelding al suggereert.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
BoukeHaarsma schreef op dinsdag 13 maart 2007 @ 18:11:
wat gebeurt er op regel 27 in mail.php dat je al output geeft?
Dit:
<li><b><a href="nieuw.php">Nieuwe gebruiker</a></b></li>

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 13 maart 2007 @ 17:57:
Ik had al geprobeerd om het submit gedeelte in een aparte functie in een aparte php te zetten, maar toen ging het nog steeds mis...
Verwijderd schreef op dinsdag 13 maart 2007 @ 18:06:
[...]

Ook die optie had ik al geprobeed, alleen dan krijg ik:

Warning: Cannot add header information - headers already sent by (output started at c:\phpdev\www\public\beschikbaarheid\main.php:27) in c:\phpdev\www\public\beschikbaarheid\main.php on line 166
Verwijderd schreef op dinsdag 13 maart 2007 @ 18:15:
[...]

Dit:
<li><b><a href="nieuw.php">Nieuwe gebruiker</a></b></li>
Zeg... ik kijk dit topic nu al een tijdje aan, maar ik wil je toch écht vriendelijk verzoeken zelf een beetje meer inzet te tonen. Het is hier niet de bedoeling dat we je van voor tot achter aan het handje gaan houden. Je hebt voldoende 'pointers' gekregen in de juiste richting; als je nu zelf even aan 't proberen / lezen / googlen gaat moet je er prima uit kunnen komen. Het is hier niet de bedoeling dat we het je compleet voorkauwen.

[ Voor 38% gewijzigd door RobIII op 13-03-2007 18:23 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Juist, maar het lukt dus nog niet. En het is maar een klein deel van een groter geheel (te zien op: www.holeridders.nl/beschikbaarheid/main.php) Het lijkt mij een klein ding, het laatste wat nog niet werkt. Ik krijg inderdaad aardige tips, maar geen van allen werken volledig. Blijkbaar is er niemand die het juiste antwoord weet.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 13 maart 2007 @ 18:30:
Juist, maar het lukt dus nog niet.
Dat is één van de problemen in je topic: je roept steeds "het werkt niet" (zie mijn quotes in de vorige post) maar vermeldt daarbij niet wat er niet werkt...
Verwijderd schreef op dinsdag 13 maart 2007 @ 18:30:
Het lijkt mij een klein ding, het laatste wat nog niet werkt.
Dat is (voor ons) totaal oninteressant. Dat jij je site af wil hebben is leuk, maar voor het probleem niet meer/minder interessant.
Verwijderd schreef op dinsdag 13 maart 2007 @ 18:30:
Ik krijg inderdaad aardige tips, maar geen van allen werken volledig.
Omdat we je in de juiste richting wijzen en het niet volledig voorkauwen.
Verwijderd schreef op dinsdag 13 maart 2007 @ 18:30:
Blijkbaar is er niemand die het juiste antwoord weet.
Geloof me, er zijn meer dan genoeg mensen hier die het antwoord weten; maar again: we verwachten ook van jezelf dat je met de gegeven (al dan niet gedeeltelijke) oplossingen aan de slag gaat en van daar uit zélf verder werkt. We zijn nou eenmaal geen afhaalbalie voor kant-en-klare oplossingen.

En geloof me, de oplossing staat al lang en breed in dit topic. Daarnaast zijn foutmeldingen (zoals "headers already sent") prima zelf op te lossen door even wat moeite te doen (google, GoT).

[ Voor 21% gewijzigd door RobIII op 13-03-2007 18:37 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 21:26
Kort en krachtig: Voor de header(); mag alleen php staan en verder niets, geen spatie, geen enter en al helemaal niet die hele regel html die je zojuist hebt laten zien.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, wat er niet werkt, is dat de postgegevens opnieuw in de txt file geplaatst worden zonder dat ik dat wil. Ik heb bovenaan mijn php het header commando gezet, maar dan blijfven er dubbele posts komen bij refreshen.

Ik had gehoopt dat unset zal werken.
Verder probeer ik dus met een session variable die ik op "" zet nadat er in de txt is geschreven en dan alleen maar schrijven als deze session variabele net geset is door het invoerveld en dus niet gelijk is aan ""

En ik vind trouwens dat je erg (onnodig) hamert op zinnen die alleen maar opsommend zijn bedoeld. En die er dus zijn om een verhaal een beetje aan elkaar te binden.

Acties:
  • 0 Henk 'm!

Verwijderd

Het gaat erom dat vanuit de browser gezien er geen actie wordt ondernomen waardoor de POST gegevens gewist worden uit het geheugen van de browser.

Het heeft dus totaal geen zin om te proberen de waarden uit de $_POST array te gaan veranderen/wissen/unsetten...dus steek daar ook aub niet al te veel moeite in verder ;).

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 21:26
Verwijderd schreef op dinsdag 13 maart 2007 @ 18:46:
Ok, wat er niet werkt, is dat de postgegevens opnieuw in de txt file geplaatst worden zonder dat ik dat wil. Ik heb bovenaan mijn php het header commando gezet, maar dan blijfven er dubbele posts komen bij refreshen.
Je moet ook niet redirecten naar het bestand waar het formulier opstaat, maar een pagina waar de mededeling opstaat dat het versturen gelukt is, of iets dergelijks.

Acties:
  • 0 Henk 'm!

Verwijderd

Redirecten naar het bestand waar het formulier opstaat is wel degelijk een juiste oplossing naar mijn mening...juist omdat dit niet als "refresh" vanuit de browser wordt gezien, en zal er dus ook niks met de oude post gegevens gebeuren.

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 21:26
ja, maar dan moet je er wel de melding opzetten dat het gelukt is. Anders lijkt het alsof het form gewoon gewist is en dan gaan ze 'm nog een keer invullen. Heb je alsnog dubbele meldingen.

Wat ook mogelijk is: Als dat formulier wordt aangeroepen een uniek getal maken (microtime/randint/whatever), dat in een hidden-field zet en on submit controleert of dit nummer al een keer gebruikt is, dan heb je nooit dubbele invoer. Het is niet zo'n mooie oplossing, maar je zou er over na kunnen denken.

Of je doet gelijk met het invoeren van de gegevens
PHP:
1
$_SESSION[ 'submitted' ] = true;

En dan als controle:
PHP:
1
2
3
if( $_SESSION[ 'submitted' ] ){
  ZetInTxt();//whatever, de code om het in .txt te zetten
}


Dan moet de sessie vernietigd worden willen ze nog een keer het zaakje invullen en invoeren.

[ Voor 30% gewijzigd door doeternietoe op 13-03-2007 23:51 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Dat kan je inderdaad doen, maar dan heeft de client nog steeds last van de melding dat de browser opnieuw POST gegevens probeert te versturen...

En je hebt nog steeds geen antwoord gegeven waarom het niet over 2 pagina's kan?

formulier.html/php (wat jij wil): geeft het formulier weer
verwerk.php: is het (post) target van je formulier, verwerkt de zut, en stuurt de client dan weer terug naar formulier.html/php*

*waarom hier ook php? je zou eventueel na het verwerken de client terug kunnen sturen naar formulier.php?q=1, en dan dit scriptje inbouwen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
//formulier.php
if(addslashes($_GET['q']=='1'))
{
 echo "Bedankt voor het invullen van het formulier";
 //laat zien wat je wilt laten zien
}
else
{
?>
[Je formulier]
<?
}
?>

Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Wat er in de openingspost staat is:
heb een postsysteem in php geschreven zonder gebruik te maken van mysql. Hij schrijft de berichten weg in een .txt-file. Echter de post form gaat naar dezelfde site toe. En als ik dan vernieuw zijn er nog postgegevens aanwezig en als je dan 'OK' geeft, dan wordt er opnieuw gepost
je bent op jouw pagina gekomen via het posten van een formulier... of dat nou hetzelfde formulier is als de pagina waar je op terecht komt doet niet terzake... als je refresht gaat je browser precies hetzelfde doen als wat hij gedaan heeft om op die pagina te komen... in jouw geval dus: het formulier opnieuw posten... unieke random getallen in hidden fields hebben dus ook geen nut... die zijn dan weer hetzelfde....
deze functionaliteit zit in je browser en daar kun je met code weinig aan doen, behalve het afvangen...
en dat kun je bijvoorbeeld doen door te checken of de gezonden gegevens al voorkomen in je txt file... eventueel met timestamp...

Acties:
  • 0 Henk 'm!

  • toost
  • Registratie: Januari 2002
  • Laatst online: 30-01 03:23
Als ik het probleem zo zie dan kan ik niks anders zeggen dan een kleine spuit11. Die post info wordt door de browser gecached en hoe of wat je ook doet in PHP die browser cache blijft bestaan. (of je moet op de een of andere manier die browser cache uit krijgen, zal vast wel kunnen maar dat weet ik zo 123 niet).

Een work around kan het volgende zijn: (simpel uitgelegd)

PHP:
1
2
3
4
5
6
7
if (!isset($_SESSION['sendtofile'])) {

//Doe hier je post naar txt schrijven
...
$_SESSION['sendtofile'] = true;

}


vergeet dan niet als je het zelfde stuk (binnen de zelfde sessie) nog eens wilt herhalen eerst de sessie te unsetten anders gaat het niet werken ;)

This space for rent. Serious inquiries only please.


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 21:36

orf

Er is toch al een aantal keren in dit topic aangegeven dat een header() de cache leegt?!

edit @ hieronder: Dat snap ik, maar hierboven zie ik dit staan:
of je moet op de een of andere manier die browser cache uit krijgen, zal vast wel kunnen maar dat weet ik zo 123 niet

[ Voor 53% gewijzigd door orf op 14-03-2007 15:32 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ja, maar dat is de TS nog niet gelukt (hij kreeg de klassieke error van output voor een header ;) ).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 14 maart 2007 @ 00:21:
En je hebt nog steeds geen antwoord gegeven waarom het niet over 2 pagina's kan?
Ok, bij deze, het is gelukt met 2 pagina's. Een php 'verwerk.php' die naar de .txt schrijft en onderaan in die php heb ik dit gezet:
<script language="JavaScript">
<!--
window.location="main.php";
//-->
</script>

Bedankt!

Acties:
  • 0 Henk 'm!

Verwijderd

Geen dank, maar dat riep ik al gelijk in de 3e reactie in dit topic ;).

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Zonde dat je het met deze oplossing doet imo. Nu heb je alleen een workaround in javascript gemaakt omdat je een vrij simpel probleem had in je PHP code. Als iemand javascript uit heeft staan dan werkt het niet of als iemand (kleine kans) nog 5 drukt voordat je pagina helemaal geladen is dan heb je alsnog een probleem. Ik vind altijd dat javascript echt te gek is maar dat de functionaliteit van je site gelijk moet blijven als iemand het niet heeft aan staan.

Acties:
  • 0 Henk 'm!

Verwijderd

Het had wat mij betreft ook niet met javascript gehoeven...en zeg nou eerlijk, misschien 1% van al zn bezoekers zal zonder javascript (of standaard uitgeschakeld) browsen...

Want er zijn naar mijn mening slechts 2 type mensen die zonder javascript browsen.
1. Diegene met enorm verouderde software (maar die zul je bijna niet meer tegenkomen)
2. Diegene die zich enorm druk maken om hun veiligheid (ik o.a. :D)

[ Voor 41% gewijzigd door Verwijderd op 14-03-2007 20:23 ]


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 21:26
Edwardvb schreef op woensdag 14 maart 2007 @ 08:55:
[...]
unieke random getallen in hidden fields hebben dus ook geen nut... die zijn dan weer hetzelfde....
[...]
Dat is het juist. Ik zou met die randomgetallen hetzelfde doen als jij met je timestamp wil doen: vergelijken met de waarden in dat .txt-file en pas plaatsen als de waarde nog niet voorkomt.

Mij lijkt sessies toch nog de mooiste oplossing.

off-topic: Ik heb ook geen javascript en dat geeft nog een ander voordeel: veel reclame maakt gebruik van javascript en die zie je dan ook niet. :)

[ Voor 13% gewijzigd door doeternietoe op 15-03-2007 19:04 ]


Acties:
  • 0 Henk 'm!

Verwijderd

doeternietoe schreef op donderdag 15 maart 2007 @ 19:03:
[...]

off-topic: Ik heb ook geen javascript en dat geeft nog een ander voordeel: veel reclame maakt gebruik van javascript en die zie je dan ook niet. :)
Je doet je nick wel eer aan met deze mededeling ;).

Acties:
  • 0 Henk 'm!

Verwijderd

ik kan maar 1 hele goede en zeer belangrijke tip aan de topic-starter geven: www.php.net

de officiele PHP manual staat onder documentatie waar alles over php van headers tot ob duidelijk en zeer overzichtelijk staat uitgelgd. een echte MUST voor elke php programmeur vooral de introductie pagina's zijn een zeer goed punt om te beginnen.

dus lees dat eerst eens goed door voordat je weer een topic opent, anders gaat je topic zeker op slot.

'pointer': http://nl2.php.net/manual/nl/function.header.php
Pagina: 1