session verloren? Gaat het dan met session_start() altijd maar weer goed?
Ik open met javascript een popup window:
Dit werkt op zich zelf, maar er werd steeds terug gekeerd naar de 'landings' page.
Ik ontdekte dat de session verloren/kwijt raakte. Daarop heb ik session_start(); op de eerste regel in de popup toegevoegd. Nu werkt het wel.
Wat ik mij afvraag, gaat dit zo maar altijd goed?
Ik bedoel wordt dit altijd wel in dezelfde sessie voortgezet?
Kan het niet zo zijn dat een gebruiker opeens in andere sessie verder gaat?
Evenzo gebeurde dit met jsTree waarbij een "stukje" Ajax uitgevoerd wordt (vanuit de jQuery wordt een php bestand aangeroepen om bepaalde data op te halen).
Hierbij raakte ook de sessie verloren en is het nu ook (even) opgelost met session_start();.
Maar ik vraag mij toch af moet ik niet nog iets met session_id doen, zodat ik zeker weet dat dit in de juiste sessie voortgezet wordt.
Als ik google, kom ik hier niet echt voorbeelden, dan wel problemen expliciet met session_start() / session_id tegen.
Nico
Gewijzigd op 21/07/2017 22:32:52 door - Ariën -
Je kan ook session_start(); eenmalig uitvoeren in een include van bijv. een config.inc.php.
Tot een 1440 seconden of 24 minuten wel. Daarna gaat de sessie de prullenbak in. Einde sessie en een hoop foutmeldingen in je error.log.
Waarom foutmeldingen? Die krijg je alleen als je je scripts niet graceful laat eindigen. Uiteraard controleer je altijd of je sessievariabelen bestaan en geldig zijn, dan gebeurt dat ook niet.
Ik krijg de indruk dat zolang de topicstarter de toverformule "session_start" invoceert dat dan alles (hopelijk) wel goed zou gaan. Misschien is het voor TS handig dat hij/zij zich verdiept in hoe sessies nu daadwerkelijk werken. Ik denk dat dat voor een hoop opheldering zorgt.
Ik heb gisteren verder gegoogled en over de session gelezen.
Ik heb hiervoor in een ASP -Oracle Utilities- project mee gedraaid/gewerkt. Dit is een framework/platform.
Op iedere ASP pagina kwam je het session_id tegen die in een hidden field(=f1776x57... lange waarde) werd weggeschreven. Ik besef nu, of althans dat denk ik, dit werd server-sided via jscript binnen het framework afgehandeld.
Hierdoor verkeer ik in de veronderstelling dat 1x session gestart wordt en dan wordt de sessie nooit meer ge(her)start.
De sessie wordt beeindigd totdat de gebruiker de applicatie verlaat of de session_time is afgelopen. Je wilt toch ook juist dat een gebruiker binnen die sessie werkt en nu ga je de sessie zo maar '(her)starten'?
Dus voor mij was/is het vreemd dat de sessie opeens 'kwijt' is.
Ik zie nu ook dat applicatie waar ik nu aan werk, wordt iedere submit langs de 'main.php?page=xxxx.php' gestuurd om vervolgens de betreffende php page te openen.
Op de eerste regel in deze main.php staat dus ook session_start()!!
Dit verklaard waarom bij mijn popup of zoals bij de jsTree het denk ik 'fout' gaat, deze gaan niet via de main.php
Wat ik nog niet begrijp is:
- is het zo'n vreemde gedachte dat als een gebruiker inlogt, session_start() wordt uitgevoerd, dat deze aktief blijft totdat de gebruiker uitlogt of session_time voorbij is?
- En wat ik mij ook afvraag waarom moet je dan session_start bij iedere submit opnieuw doen? Of hoeft dit niet?
OF zoals in mijn geval open ik een popup php page via javascript en begin dan met PHP in de popup. Het PHP
bestand met de sessie staat op de server en is de sessie op dat moment niet bekend. Is dat dan het probleem?
Bedankt.
Nico.
Quote:
is het zo'n vreemde gedachte dat als een gebruiker inlogt, session_start() wordt uitgevoerd, dat deze aktief blijft totdat de gebruiker uitlogt of session_time voorbij is?
Niet echt nee (*1), dit zal afhangen van sessie-instellingen. Zie een sessie als een serverside cookie. "Toegang" (je hebt hier natuurlijk niet rechtstreeks toegang toe) hiertoe verleen je via het sessie-id, meestal in de vorm van een cookie. Deze (het cookie) stuur je elk request mee met de HTTP-headers waarin je in feite zegt "de sessie met id XYZ is van mij". Het is verder aan de applicatie om de authenticiteit van de gebruiker vast te stellen, als dat een overweging is.
(*1) te meer omdat een script slechts heel kort "bestaat": tijdens de uitvoering. Uitvoering van PHP-code werkt niet hetzelfde als standalone executables die een soort van persistente geheugentoestand hebben. Dit werkt compleet verschillend.
Het sessie-cookie heeft meestal een bepaalde/beperkte levensduur. Daarna verwijdert de browser dit cookie en is dus in feite de link met het sessie-bestand op de webserver weg. Na een bepaalde tijd inactiviteit van het sessie-bestand zal deze als "afval" worden beschouwd en zal dit bestand op den duur worden opgeschoond.
(dit is trouwens allemaal informatie die je links en rechts makkelijk op het internet zou hebben moeten kunnen vinden)
Quote:
En wat ik mij ook afvraag waarom moet je dan session_start bij iedere submit opnieuw doen? Of hoeft dit niet?
OF zoals in mijn geval open ik een popup php page via javascript en begin dan met PHP in de popup. Het PHP
bestand met de sessie staat op de server en is de sessie op dat moment niet bekend. Is dat dan het probleem?
OF zoals in mijn geval open ik een popup php page via javascript en begin dan met PHP in de popup. Het PHP
bestand met de sessie staat op de server en is de sessie op dat moment niet bekend. Is dat dan het probleem?
Nee, want als je er de documentatie op naslaat (of op na had geslagen) doet session_start() het volgende:
Quote:
session_start() creates a session or resumes the current one based on a session identifier passed via a GET or POST request, or passed via a cookie.
Oftewel, op elke pagina waar je sessies wenst te gebruiken zou je session_start() als eerste -of in ieder geval voor enige output- aan moeten roepen.
Gewijzigd op 24/07/2017 19:32:01 door Thomas van den Heuvel
Het inloggen is eigenlijk het invullen van een gebruikersnaam/email en een wachtwoord in het login formulier dat vervolgens naar de server verzonden wordt. Dat je daarna ingelogd bent is een begrip dat uit de applicatie-sfeer komt. Je bent niet ingelogd op de webserver of in PHP. In plaats daarvan is het geheel afhankelijk van de applicatie (welke je in bijvoorbeeld PHP geschreven hebt) wat er met de gegevens gedaan wordt of wat een gebruiker aan de hand van de inloggegevens wel of niet mag doen.
Zoals Thomas al aangaf is de runtime van een PHP script enkele milliseconden tot hooguit enkele seconden (onder normale omstandigheden). Een PHP script start op het moment dat een request naar een .php bestand verwijst en eindigt als het script doorlopen is waarna de output van het script teruggestuurd wordt naar de browser van de aanvrager. (De output bestaat vaak uit HTML met of zonder Javascript). Aangezien een PHP script dus al beëindigd wordt op het moment dat de webserver de output terugstuurt naar de browser van de gebruiker zijn ook je variabelen gewist en zijn je gegevens verloren gegaan (tenzij je ze opslaat in de database, een bestand of in de sessie). Het opslaan in een bestand of database is enigszins gecompliceerd omdat een website natuurlijk door vele gebruikers gebruikt kan worden. Vraagstukken die al gauw ontstaan is welke data is van welke gebruiker en hoe raken we van oude ongebruikte data af voordat een filesysteem helemaal dicht slipt.
Hier komt het nut van een sessie van pas. Iedere nieuwe sessie krijgt een uniek ID welke opgeslagen wordt op de pc van de gebruiker in de vorm van een cookie en welke (binnen de geldigheidsperiode van een cookie) weer teruggestuurd wordt naar de server met ieder volgend nieuw request. Aan de hand van het sessie-ID wordt de sessie data weer ingelezen door de webserver en kunnen verschillende apparaten (niet eens gebruikers) van elkaar gescheiden worden.
Kortom geven sessies dus een mogelijkheid om voor elk apparaat (pc, tablet, mobiel etc) data apart te bewaren op de webserver voor een middellange duur (denk aan 30 minuten vanaf de laatste request afhankelijk van de instellingen).
Gewijzigd op 24/07/2017 20:53:06 door Frank Nietbelangrijk
De enige manier om informatie tussen verschillende requests te onthouden is via hulpmiddelen zoals cookies (clientside) en/of sessies (serverside). Dit is wel een "sessie" zoals gebruikt wordt in het PHP-jargon, oftewel de collectie van session_* functies.
Praten met een website is een schaakspel van requests en responses waarbij standaard elke vorige zet wordt vergeten. Dit is ook iets wat je in je achterhoofd zou moeten (ont)houden.
Gewijzigd op 25/07/2017 15:37:24 door Thomas van den Heuvel