[php] Redirect naar zelfde bestand

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 17-09 15:56
Hallo.

Ik heb met een shoutbox het volgende probleem :

Ik heb deze op meerdere pagina's en deze geinclude in de pagina. Tot zover geen probleem.
Echter als ik een bericht typ en daarna plaats en op de F5 druk krijg ik een melding dat er nog gegevens in het geheugen staan ofzo, en dan plaats ie nogmaals het bericht. Dit blijft ie herhalen als ik op f5 druk.

nu heb ik dan een Redirect code er in gezet. Maar als je dan op pagina A zit, en je gaat naar pagina B en je reageert in de shout dan moet ik dus naar 1 pagina verwijzen, waardoor je dus terugkomt op de beginpagina.

Ik zou graag willen weten hoe en of je kunt zorgen dat ie het zelfde bestand herlaad.

PHP:
1
2
3
<? 
header('Location: http://www.mijnsite.nl/index.php');
?>


Kan dat ?, ik heb gezocht maar kwam alleen maar deze bovenstaande redirect code tegen.

Litebit.eu voorraad check :).


Acties:
  • 0 Henk 'm!

  • Optix
  • Registratie: Maart 2005
  • Laatst online: 12-08 19:46
Jep, that's the way :)

.


Acties:
  • 0 Henk 'm!

Verwijderd

Dat kan ja. Beter nog om de url relatief te houden (gewoon 'index.php' dus).

Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 17-09 15:56
Jah, centraal... Maar dan zou ik dus de keus moeten nemen tussen :

- De shout/gastenboek alleen op de index of in ieder geval 1 pagina
- Het "probleem" dat als je op pagina b zit dat je na het posten steeds terugkeert naar pagina a

De eerste keuze vind ik nu nog geen optie, want ik zou toch graag zien dat ie als ik op pagina A een bericht post dat ie pagina A refreshed, maar als ik op pagina B,C of D iets post dat ik dan ook op de respectievele pagina blijf...

Litebit.eu voorraad check :).


Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 19-09 22:02

krvabo

MATERIALISE!

Shout.html:
HTML:
1
<form action="verwerk.php">

verwerk.php:
PHP:
1
2
$result = mysql_query("INSERT INTO...");
header('Location: Shout.html');

et voila?

[edit]

Als je wil dat ie op dezelfde pagina blijft kun je zoiets doen:

Shout.html:
HTML:
1
<form action="verwerk.php"><input type="hidden" name="page" value="Shout.html">

ShoutB.html:
HTML:
1
<form action="verwerk.php"><input type="hidden" name="page" value="ShoutB.html">

ShoutC.html:
HTML:
1
<form action="verwerk.php"><input type="hidden" name="page" value="ShoutC.html">


verwerk.php:
PHP:
1
2
$result = mysql_query("INSERT INTO...");
header('Location: '. $_POST['page']);

[ Voor 60% gewijzigd door krvabo op 23-01-2007 09:22 ]

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 17-09 15:56
Ik zal vanmiddag eens kijken of het werkt....

Litebit.eu voorraad check :).


Acties:
  • 0 Henk 'm!

Verwijderd

header('Location: ' . $_SERVER['PHP_SELF'] );

Ververst de huidige pagina. Is dat wat je zoekt?

[ Voor 36% gewijzigd door Verwijderd op 23-01-2007 09:56 ]


Acties:
  • 0 Henk 'm!

  • Solopher
  • Registratie: December 2002
  • Laatst online: 11-09 14:55
Een Header werkt natuurlijk niet meer als er al output is geweest, is dit het geval?
En vergeet niet om exit(); aan het einde van je header te zetten:

PHP:
1
2
3
4
<?php
header("Location: http://www.php.net/"); /* Stuur de browser naar de PHP website */
exit;                        /* Zorg dat de code hieronder niet wordt uitgevoerd */
?> 


http://www.php.net/header/

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op dinsdag 23 januari 2007 @ 09:14:
Dat kan ja. Beter nog om de url relatief te houden (gewoon 'index.php' dus).
Beter om dat maar niet te doen. Zie hier. Een redirect header is een 302 response en hierbij hoor je de gehele URL op te geven inclusief de http(s) en domeinnaam.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Martijn02
  • Registratie: September 2000
  • Laatst online: 19-09 14:55

Martijn02

/* No Comment */

Dat je een absolute url moet gebruiken is nieuw voor me (schaam) Ik gebruik deze manier van redirecten (met relatieve URLs) al een jaar of 8 in www.gfxartist.com en heb er nog nooit problemen mee ondervonden.

Waar je wel voor op moet passen is het gebruik van de $_SERVER['HTTP_REFERER'] variable. Hij is hier nog niet genoemd, maar mocht je bedenken die te gaan gebruiken. De meeste browsers geven hem wel correct door, maar programmatjes als Norton internet security blocken deze headers. (met als gevolg dat mensen, als ze iets posten altijd weer op je homepage uitkomen)

Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 17-09 15:56
Verwijderd schreef op dinsdag 23 januari 2007 @ 09:56:
header('Location: ' . $_SERVER['PHP_SELF'] );

Ververst de huidige pagina. Is dat wat je zoekt?
ik krijg een error als ik dit er in zet :
Warning: Cannot modify header information - headers already sent by (output started at /sites/herejezus-sites/omega-thunder.antisociaal.nl/hosting/foxtuning/template.php:2) in /sites/herejezus-sites/omega-thunder.antisociaal.nl/hosting/foxtuning/shout/foxshout.php on line 54
op lijn 54 staat die code... Moet ik niks bij de locatie invoeren ? of juist wel...

Litebit.eu voorraad check :).


Acties:
  • 0 Henk 'm!

Verwijderd

Het klinkt mij in de oren als symptoom bestrijding. Ik zou, wanneer de gebruiker wil reageren, een postkey oid in zijn sessie gooien. Deze kun je verwijderen wanneer de gebruiker post. Post de gebruiker nog een keer dan bestaat er geen key in de sessie en verwerk je het niet. Dit lost ook back-knop problemen op.

Dus ik zou opzoek gaan naar een dergelijke strategie.

Acties:
  • 0 Henk 'm!

  • Mafkees
  • Registratie: Oktober 2003
  • Niet online
BLACKfm schreef op dinsdag 23 januari 2007 @ 11:03:
[...]

ik krijg een error als ik dit er in zet :

[...]

op lijn 54 staat die code... Moet ik niks bij de locatie invoeren ? of juist wel...
Headers kunnen niet meer gestart worden als er al output is verzonden. Als je de error had gelezen zul je dat toch ook wel zien ;) Tip: werk met output buffering, kun je op elk moment headers zetten en wordt alles aan het einde van het script in 1x aan de client teruggegeven.

Zie: http://nl2.php.net/manual/nl/ref.outcontrol.php

[ Voor 4% gewijzigd door Mafkees op 23-01-2007 11:19 ]


Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

Ik doe display/input/update en functionele afhandeling altijd in 1 file. Dit soort redirects naar andere files maakt het debuggen alleen maar moeilijker. Verder hou ik een state-machine bij die in dit geval de state POSTED zou hebben. Deze statemachine is, na het afhandelen van buttons, het eerste wat het script doorloopt. De states worden serverside bijgehouden (SESSION) dus een repost zal hier niets aan veranderen. Het scherm zal netjes opnieuw worden opgeboouwd zonder enige onbedoelde acties. Het gebruik van state-machines valt bij complexere pagina's zeker aan te raden. Als je alle acties netjes in functies wegwerkt en in includes drukt dan krijg je hele mooie slanke files die makkelijk te debuggen zijn (vind ik :P ).

... gecensureerd ...


Acties:
  • 0 Henk 'm!

  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
hamsteg, kan je hier wat meer info / links geven? (behalve als google me vanavond meteen de ideaal juiste sites doorgeeft), want ik vind het een zeer leuke oplossing die ik tot nu toe niet bestudeerd heb.

Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

Tja, nou heb ik met mijn grote waffel wel wat intelligents geroepen maar hoe leg je dat uit ;)

Goed ... als voorbeeld gaan we uit van een heel simpel email adres invullen, controleren en opslaan. Lekker triviaal. Logisch bekeken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
       (New*)                 
          |                   
          |<---------.
      [NewHTML]      |
          |          |
      (NewPost)      |            
          |          |
          .          |
    (P)==>|     (EmailError)
          |          |
     [VerifyData]    |
          | nok>     |
          +--------->.
          |
    (CorrectEmail)
          |
          |<--------------------.
     [save email]               |
          | nok>                |
          +--------->           |
          |          |          |
          |     (CanNotSave)(RetrySave)
          |          |          |
          |     [RetryHTML]     |
          |          |          |
          |     (RetryPost)     |
          |          .          |
          |    (P)==>|          |
          |          |          |
          |     [HandleRetry]   |
          |          | ok>      |
          |          +--------->.
          |          |
      (EmailSaved)(EmailAbort)
          |          |
          |<---------+
     [ReadyHTML]
          |
        <EOF>

Ik heb me even in een statemachine uitgeleefd een beetje gecombineerd in een flow chart. '(P)' is een onderbreking van de flow door een 'Post'. States staan tussen '()' en acties staan tussen '[]'. Je begin dus altijd in de state New* als er nog geen state gezet is. Daarna, afhankelijk van de state ga je acties doen. In een PHP / Pseudo code wordt dit
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
if( not is set following three variables )
{
  $_SESSION['OldState'] = "NoState"; 
  $_SESSION['CurState'] = "New";
  $_SESSION['ErrorString'] =""; 
}

OpenDatabase();

do
{
  $_SESSION['OldState'] = $_SESSION['CurState'];
  switch($_SESSION['CurState'])
  {
    case "New":
    case "EmailError":
      ActionNewHTML();
      $_SESSION['CurState'] = "NewPost";
      // waiting for user input, abort statemachine
      $_SESSION['OldState'] = $_SESSION['CurState'];
      break;
    case "NewPost":
      if( ActionVerifyData )
      {
        $_SESSION['CurState'] = "CorrectEmail";
      }
      else
      {
        $_SESSION['CurState'] = "EmailError";
      }
      break;
    case "CorrectEmail":
    case "RetrySave":
      if(ActionSaveEmail)
      {
        $_SESSION['CurState'] = "EmailSaved";
      }
      else
      {
        $_SESSION['CurState'] = "CanNotSave";
      }
    case "CanNotSave": & case "RetryPost": 
      ... laat zich raden ...
      break;
    case "EmailSaved":
    case "EmailAbort":
      ActionReadyHTML;
      // Final state, no new state is set and statemachine will stop
      header("ga terug naar wat ik hiervoor deed");
      break;
    default:
      ... error handling undefined state ...
      // Undefined state, no new state will be set and statemachine will stop
      break;
} }
while( $_SESSION['OldState'] != $_SESSION['CurState'] )

CloseDatabase();
exit(0);

Dit zou ongeveer mijn VulEmailAdresIn.php pagina zijn. De acties voor het tonen van HTML code en alle controles zou ik in andere files onderbrengen maar kun je ook aan het einde van deze file toevoegen. Acties mogen alleen maar OK/NOK retrourneren. De actie die een fout constateert moet ook zorgen dat de fout gelogd word in $_SESSIOM['ErrorString'] zodat de volgende actie aan de hand van de state eventueel een mooie foutmelding rapporteerd.

Ik hoop dat bovenstaande code je helpt te begrijpen wat ik bedoel. Het voordeel van statemachines is de robuustere foutafhandeling en het eenvoudiger toevoegen van nieuwe functionaliteit. Het vereist wel even iets anders denken soms en voor kleinere systemen is het niet geschikt (zoals bijv. dit voorbeeld :+ ). Debuggen vind ik simpel omdat de logische fouten zich vaak op dit niveau bevinden en de output in acties is weggewerkt. Het (in code) beschikbaar hebben van een flow/state diagram is wel aan te raden (ASCII draw programma?).

... gecensureerd ...

Pagina: 1