Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

PHP page session_destroy() en refresh

Pagina: 1
Acties:

Onderwerpen


  • Gideonnn
  • Registratie: September 2007
  • Laatst online: 30-09 00:55
Ik moest voor mijn opleiding een Yahtzee spel maken in PHP, nu vond mijn moeder het zo leuk dat ik het online MOEST zetten. 8)7
Dus heb ik een database aangemaakt op m'n synology nasje en alles loopt lekker.
Het enige wat ik nog moet hebben is een 'begin opnieuw' knop.

Dus ik dacht lekker makkelijk, session_destroy(); dit werkt, alleen je moet 2 keer klikken om daadwerkelijk de cijfertjes in je browser weer op 0 te laten springen.
Ik weet dat als ik erop klik, hij daadwerkelijk alles leeg gooit, maar een normale gebruiker niet.
Dus ik dacht, ik plak er een page refresh achter, problem solved.

Na een tijd te hebben gezocht blijkt die niet echt te bestaan, alleen de header() functie.
Maar wat ik begrijp is dat die zorgt voor automatische refreshes, dat is niet de bedoeling.
Ook kwam er veel hits op javascript uit, maar daar heb ik helemaal geen kaas gegeten.

Iemand een goeie tip? :)

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 20:17
Ram a.u.b. niet na elke zin op Enter.
Qiro schreef op zondag 03 april 2011 @ 21:18:
Ik weet dat als ik erop klik, hij daadwerkelijk alles leeg gooit, maar een normale gebruiker niet.
Van deze zin begrijp ik vrij weinig.
Dus ik dacht, ik plak er een page refresh achter, problem solved.

Na een tijd te hebben gezocht blijkt die niet echt te bestaan, alleen de header() functie.
Maar wat ik begrijp is dat die zorgt voor automatische refreshes, dat is niet de bedoeling.
Je wilt toch juist wel automatisch, zodat men niet (handmatig) twee keer moet klikken? Het hele twee keer klikken kan je waarschijnlijk ook anders wegwerken, maar dan moet je toch een beetje (relevante) code laten zien (of liever eerst zelf debuggen).

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 10-10 08:02
wat werkt er niet aan een header('Location: /index.php'); dan?

Driving a cadillac in a fool's parade.


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Gooi alle sessie data weg aan het begin van de hit en klaar. Geen 2e request nodig hoor. :)

{signature}


  • Gideonnn
  • Registratie: September 2007
  • Laatst online: 30-09 00:55
code:
1
2
3
4
5
6
7
8
9
10
11
<div align="right">
        <input type="submit" name="btnOpnieuw" value="Begin Opnieuw"/>
        <?php
            if(isset($_POST['btnOpnieuw']))
            {
                session_destroy();
                unsetCbs();
                header('Location: /index.php');
            }
        ?>
        </div>


Zo ziet het er uit (na het proberen van Kwaak's oplossing). Het probleem is alleen dat header() niks lijkt te doen. Hij refreshed de pagina in ieder geval niet.
Met automatisch bedoel ik bijvoorbeeld iedere 2 minuten refreshen. Met die zin bedoel ik, alles word server side leeg gemaakt, maar hij update het als het ware niet in de browser, pas nadat ik op een andere knop druk.

Ik weet niet of het kwaad kan om hier mijn ip + port te posten,, kan wel even het yahtzee gebeuren public maken. Kwa debuggen.. valt niet echt veel te doen, het werkt allemaal goed. Alleen het niet updaten zeg maar. Normaal zeg ik na het vullen van bijvoorbeeld $_SESSION['scoreEnen'] gewoon echo $_SESSION['scoreEnen']; erbij zodat hij hem toch laat zien.

Damn als ik het na lees is het niet allemaal even helder. 8)7 Hoop dat er wat uit te halen valt, zou niet weten hoe ik het anders uit moet leggen.

  • Wiethoofd
  • Registratie: Juli 2007
  • Laatst online: 17-11 00:47

Wiethoofd

Broadcast TOM

Inderdaad, de sessie array als lege array ingeven en de sessie destroyen, scheelt weer met een header() door te moeten verwijzen.

Volg me op Twitter/X & Bluesky


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Qiro schreef op zondag 03 april 2011 @ 22:54:
Het probleem is alleen dat header() niks lijkt te doen.
Heb je display errors aan staan? Staat error_reporting op zoveel mogelijk (E_ALL of -1)? Heb je uberhauptde letterlijke HTTP response bekeken?

(Allemaal standaard debugvragen... Overigens blijft het antwoord staan dat een redirect totaal onnodig is)

{signature}


  • Gideonnn
  • Registratie: September 2007
  • Laatst online: 30-09 00:55
Het probleem is, het is allemaal nogal amateuristisch. Ik heb pas 2 maanden php, waarvan maar anderhalf uur in de week. Dit is in elkaar geflanst met wat gegoogle en youtube.
Ook heb ik barweinig verstand van het daadwerkelijk debuggen van PHP. Alleen Visual Studio debugging wil nog wel eens werken.

Misschien is het allemaal wat te snel etc, maar eigenlijk wil ik niet dat dat de reden is om het maar op te geven. Op een forum om antwoord kwijlen is natuurlijk niet veel minder, maar nu leer ik er hopelijk wat van.

Verwijderd

Je header zal niet werken als er al iets (HTML) is verstuurd. Tenzij je output buffering gebruikt.

- Druk op knop
- Ajax request dat je sessie leeghaalt en on-success de pagina bijv ververst.

Wat het beste werkt in jouw geval is niet goed te zeggen zonder de rest te weten.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Qiro schreef op zondag 03 april 2011 @ 23:03:
Ook heb ik barweinig verstand van het daadwerkelijk debuggen van PHP.
Geen probleem, zoek uit hoe je mijn 3 vragen kan beantwoorden en wat ik ermee bedoel en je hebt al het grootste deel van je debug skills op zak. :)

{signature}


  • WeeJeWel
  • Registratie: April 2007
  • Laatst online: 25-11 11:26
Je moet gewoon

code:
1
2
3
4
5
6
7
<?php
            if(isset($_POST['btnOpnieuw']))
            {
                session_destroy();
                unsetCbs();
            }
        ?>


als aller aller aller eerste uitvoeren.

Homey — Critics are those without skills to create.


  • Gideonnn
  • Registratie: September 2007
  • Laatst online: 30-09 00:55
Oftewel gewoon bovenaan (na session_start();) plakken?
Zal zo eens proberen of het werkt. :) Maar wat is dan eigenlijk het verschil?

En Voutloos, thanks, zulke dingen wil ik horen! ;)

  • WeeJeWel
  • Registratie: April 2007
  • Laatst online: 25-11 11:26
Zie het zo:

1. Haal gegevens op en zet in 't geheugen (session_start)
2. Verwijder sessie
3. Lees geheugen -> hè, gegevens!

Nu draai je dus punt 1 en 2 om.

Homey — Critics are those without skills to create.


  • nowherebound123
  • Registratie: Mei 2009
  • Laatst online: 20:29
de header functie mag niet uitgevoerd worden na html, helemaal aan het begin van de pagina dus.

  • HuHu
  • Registratie: Maart 2005
  • Niet online
WeeJeWel schreef op zondag 03 april 2011 @ 23:33:
Zie het zo:

1. Haal gegevens op en zet in 't geheugen (session_start)
2. Verwijder sessie
3. Lees geheugen -> hè, gegevens!

Nu draai je dus punt 1 en 2 om.
Je kunt 1 en 2 niet omdraaien, want je moet eerst een session_start() doen voordat je een session_destroy() aan kunt roepen. Anders weet hij namelijk niet welke sessie te verwijderen.

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 17:22
Volgens mij heeft hij 2 en 3 dan ook in de originele code omgedraaid.

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • Gideonnn
  • Registratie: September 2007
  • Laatst online: 30-09 00:55
Het zag er uit als:

1 ,session_start()
2, Doe zn ding
3, Dan onderaan dat stukje code:

code:
1
2
3
4
5
6
7
<?php
            if(isset($_POST['btnOpnieuw']))
            {
                session_destroy();
                unsetCbs();
            }
        ?>


Nu heb ik bovenaan hetzelfde + de eerder genoemde header, dit werkt. :)
Ik heb wat gelezen over headers, ze zijn bedoeld om links te 'stealthen' en dus pages te refreshen. Klopt dit? Want vond het een beetje vaag, normaal pak ik het wel snel op, alleen header() vind ik een beetje wazig. :9

Bedankt voor de hulp!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 19:02
Qiro schreef op maandag 04 april 2011 @ 09:44:
Ik heb wat gelezen over headers, ze zijn bedoeld om links te 'stealthen' en dus pages te refreshen. Klopt dit?
Wikipedia: List of HTTP header fields, hier staat het wel zo'n beetje uitgelegd in 'technische' vorm.

[ Voor 8% gewijzigd door Caelorum op 04-04-2011 09:50 ]


  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Je kan ook gewoon:
$_SESSION = array();
doen (na session_start).

Als je moet refreshen dat betekent het meestal dat je eerst output genereert en daarna pas de session leeg maakt.

Een header kan je alleen maar sturen als de output nog niet gestart is. Dit kun je bereiken met output buffering, of door simpelweg niet echo / print of iets in die richting aan te roepen voordat je de header verstuurt.

Let ook op dat bij een header('Location: x'); de content van de betreffende pagina nog steeds uit te lezen is. Soms is dit niet erg, maar als we praten over admin panels:
PHP:
1
2
3
4
5
6
7
<?php
if ( !isset($_SESSION['admin']) ) {
    header('Location: x');
}
if ( isset($_POST['deleteEverything']) ) {
    exec('sudo rm -R /');
}

Dan maak je hackers erg blij.

Dus altijd:
PHP:
1
2
3
4
5
6
7
8
9
<?php
if ( !isset($_SESSION['admin']) ) {
    header('Location: x');
    echo 'Je wordt doorgestuurd naar <a href="x">x</a>';
    exit; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
if ( isset($_POST['deleteEverything']) ) {
    exec('sudo rm -R /');
}

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Ik snap geen fluit van je hackersvoorbeeld ReenL. Care to explain?

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Tharulerz schreef op maandag 04 april 2011 @ 19:40:
Ik snap geen fluit van je hackersvoorbeeld ReenL. Care to explain?
Je moet altijd een exit doen na een Location-header. Anders wordt alle daaropvolgende code alsnog gewoon uitgevoerd.
Pagina: 1