[PHP] Hoe bericht weergeven na header refresh?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Op mijn website heb ik een aantal forms, waarlangs gebruikers categorien aan een boom kunnen toevoegen, verwijderen, editten etc. Nadat het form is gesumbit en PHP de bewerking (bijvoorbeeld toevoegen van een categorie) heeft uitgevoerd, voer ik een header refresh uit. Hiermee voorkom ik dat de gebruiker na de uitvoering om wat voor reden dan ook de pagina refreshed en de form data weer opnieuw gezonden wordt (en dus de bewerking nogmaals plaatsvind).

Als de gebruiker middels het form een categorie toevoegt aan de boom, wil ik na de header refresh de gebruiker graag informeren over wat er gebeurd is. Omdat http stateless is, moet ik voor de header refresh een querystring bouwen waarlangs ik aangeef welk bericht ik wil laten zien aan de gebruiker - site.com/admin.php?msg=1:
PHP:
1
2
3
4
5
6
7
8
9
if (isset($_GET['msg']))
{
  switch ($msg)
  {
    case 1: echo 'De categorie is succesvol toegevoegd aan de boom'; break;
    case 2: echo 'De categorie is succesvol verwijderd';
    case 3: // etc...
  }
}

Dit werkt goed, maar werkt niet als ik meer specifieke berichten aan de gebruiker wil tonen, zoals: "De categorie Appels is succesvol verplaatst naar de categorie Fruit."

Nu kan dit ook wel via de querystring (ik geef dan gewoon een hele zin door ofzo), maar mijn vraag is of het niet netter kan: vlak voor de header refresh stop ik het specifieke bericht in een sessie of cookie, welke ik na de refresh uitlees. Probleem hierbij is alleen: het bericht moet alleen getoond worden meteen na de refresh, dus ik zal iets moeten inbouwen waardoor ik kan zien of het bericht al eerder is weergegeven, om dan het bericht weer uit de sessie of cookie te verwijderen.

Mijn vraag is: denk ik nu te moeilijk en moet ik alle mededelingen voor de gebruiker doorgeven via de querystring of wordt een methode als hierboven beschreven wel vaker toegepast?

[ Voor 5% gewijzigd door Reveller op 11-12-2004 14:07 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

Verwijderd

Wat ik doe is gewoon na elk formulier een aparte pagina met een aparte bevestiging, waar ik dan door de ingevoerde velden eventueel wat informatie tussen zet.. Dit werkt door het gebruik van templates allemaal wel handig.

Edit:
En voor het refreshen, als je het doet met method="post" / $_POST dan krijg je bij het refreshen een waarschuwing van de browser, dus het lijkt me niet noodzakelijk dat je zelf refreshed..

[ Voor 32% gewijzigd door Verwijderd op 11-12-2004 14:18 ]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Hiermee voorkom ik dat de gebruiker na de uitvoering om wat voor reden dan ook de pagina refreshed en de form data weer opnieuw gezonden wordt (en dus de bewerking nogmaals plaatsvind)
Dit kan imo beter met een
PHP:
1
if($_SERVER['REQUEST_METHOD']=='POST') { ... }

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@X-Lars - ik snap niet wat je bedoelt?

@Sidney - het is idd waar dat je een waarschuwing krijgt. Toch ben ik daar wat huiverig voor, in het geval dat iemand denkt "even proberen wat er gebeurt als ik op OK klik" of wat dan ook. Ik ga altijd uit van de stupiditeit van de gebruiker (niet naar bedoeld natuurlijk ;))

[ Voor 19% gewijzigd door Reveller op 11-12-2004 14:27 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

Verwijderd

Reveller schreef op zaterdag 11 december 2004 @ 14:26:
@Sidney - het is idd waar dat je een waarschuwing krijgt. Toch ben ik daar wat huiverig voor, in het geval dat iemand denkt "even proberen wat er gebeurt als ik op OK klik" of wat dan ook....
Is ook wel wat voor te zeggen ;)

Acties:
  • 0 Henk 'm!

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

drm

f0pc0dert

Het beste is imo om het script slim genoeg te maken om zelf uit te vogelen wat er precies gebeurd is aan de hand van de parameters die hij meekrijgt. M.a.w.: je redirect bijv. naar admin.php?page=msg&msg_type=category_moved&subject_id=8from_id=1&to_id=2 waarbij het script vervolgens gaat bepalen wat er precies gebeurd is (even kort door de bocht):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
switch ( $page ) {
   case ....: // andere zut
      break;
   case 'msg':
      switch ( $msg_type ) {
         case 'category_moved':
            printf ( 
               "The category %s was moved from %s to %s", 
               get_category_name ( $subject_id ),
               get_category_name ( $from_id ), 
               get_category_name ( $to_id ) 
            );
            break;
         // etc
      }
      break;
}
Iets van die strekking. Je kunt dat natuurlijk zo gek maken als ze zelf wilt.
edit:
't Grootste voordeel van deze manier is dat je ook eenvoudig weer de "context" kunt bepalen waar de gebruiker zich in bevindt. Linkjes naar andere contexten en situaties kun je dan weer makkelijk genereren. (Bijvoorbeeld: terug naar edit-pagina, terug naar overzicht, categorie a, b of c weergeven etc)

[ Voor 15% gewijzigd door drm op 11-12-2004 14:46 ]

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


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Reveller schreef op zaterdag 11 december 2004 @ 14:26:
@X-Lars - ik snap niet wat je bedoelt? [...]
Zo zal het deel in de if-constructie niet worden uitgevoerd na een refresh.

Acties:
  • 0 Henk 'm!

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

drm

f0pc0dert

X-Lars:
Zo zal het deel in de if-constructie niet worden uitgevoerd na een refresh.
Het probleem is alleen dat wanneer de gebruiker een resultaat van een post form ververst, hij in principe de data nog een keer kan verzenden (ookal vraagt de browser wel om een bevestiging). Dan wordt (na bevestiging) de complete post request nog een keer gedaan, en schiet je dus niet zo veel op met zo'n check :)

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


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

true O+

Ik was even in de war met andere constructies die ik zelf gebruik. Met die check bepaal je "slechts" of er wat wat gepost is of niet. Uiteindelijk zal het probleem (het opnieuw uitvoeren van de bewerking) met jouw (drm) oplossing ook niet opgelost worden imo. De enige echte manier is om het in de db zelf te checken voordat je de bewerking daadwerkelijk uitvoert.

Acties:
  • 0 Henk 'm!

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

drm

f0pc0dert

X-Lars:
Uiteindelijk zal het probleem (het opnieuw uitvoeren van de bewerking) met jouw (drm) oplossing ook niet opgelost worden imo. De enige echte manier is om het in de db zelf te checken voordat je de bewerking daadwerkelijk uitvoert.
Als je nadat het formulier verwerkt is een refresh header terug stuurt met een delay van 0 seconden, reduceer je de kans wel tot een minimum dat iemand 2x het formulier post. Dat is ook wat de TS doet, afaik.

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


Acties:
  • 0 Henk 'm!

Verwijderd

Vaak doe ik ook posten naar dezelfde pagina waar de <form> staat. Dit om makelijk aan te geven wat de gebruiker fout heeft gedaan (mocht dit zo zijn). Als er geen fouten zijn en de user wil graag de pagina refreshen krijg je idd zo'n post waarschuwing. Bij de meeste acties maakt het niet uit of de user op Ok of cancel drukt. Vaak wordt er dan een fout door je script gegenereerd of wordt een wijziging nogmaals doorgevoerd. Vaak maakt dit dus niks uit. Het ligt er een beetje aan wat je script doet.
Pagina: 1