[PHP] Session array doet vreemd

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 15-09 21:46
Beste,

Ik heb een kleine applicatie draaiend wat kortgezegd een 'quiz' is. Je beantwoordt een x aantal vragen en krijgt een overzicht. Om de vragen te onthouden (deze zijn niet van te voren vastgelegd) worden 'vraag'-objecten (iedere soort vraag is een object) toegevoegd aan een array in een sessie.

Echter, wanneer ik bijvoorbeeld 10 vragen achter elkaar doe, blijft hij soms steken op vraag 4, je komt dan nooit verder. Na wat debuggen blijkt dat het object wel aan de array wordt toegevoegd, maar dat na refreshen de array ongewijzigd is. Nu gebeurt dit ook niet altijd op een vast punt. Soms na 4 vragen, soms 5, soms 6.

Na veel gegoogle kwam ik op iets dat leek op mijn probleem. Dit had te maken met het serializen van de objecten, heb het allemaal geprobeerd, maar leverde niets op.

Iemand enig idee waar dit aan kan liggen en/of dit te verhelpen?

Ik hoop dat ik een beetje duidelijk ben geweest in mijn probleemstelling aangezien het een vrij vaag en bizar probleem is.

Edit: Ow, klein (handig) detail misschien, ik maak gebruik van het Kohana framework.

[ Voor 4% gewijzigd door Koeniepoenie op 08-12-2009 17:38 . Reden: Added info ]

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ehm...hoe moeten wij raden wat je fout doet zonder een relevant stukje code? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 15-09 21:46
Hmm ja, ik dacht dat het niet zozeer aan de code lag omdat het soms wel, soms niet goed gaat.

Maar je hebt gelijk.

Ik heb een controller waar dit in gebeurt:
PHP:
1
$_SESSION['questions'][] = serialize($q);


Waar $q een object is die de vraag representeert. Dit is verder weinig speciaals.

Ik had het eerder zonder serialize(), maar dat werkte ook niet. array_push maakt uiteraard ook geen verschil. Omdat het 'tijdelijk' (zeg: in dezelfde pageload) wel goed gaat, maar zodra er gerefreshed is, niets is toegevoegd.

Ik begin een beetje te vrezen dat het te maken heeft met een maximum size van de session, maar heb hier nog weinig over kunnen vinden.

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:33

MueR

Admin Tweakers Discord

is niet lief

De max size van de session zal niet zo rap geraakt worden, tenzij je ontzettend bloated code hebt. Overigens vraag ik me wel af waarom je niet gewoon een array met de IDs van de vragen opslaat, dat is makkelijker dan complete objecten imho. Maar probeer eens om keys toe te voegen in plaats van automatisch te genereren. Mogelijk komt er om een of andere reden net een andere key op je vraag, waardoor het lijkt alsof je vast staat.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 15-09 21:46
ID's opslaan is een leuk idee, als we die hadden ;) Onze vragen worden 'gegenereerd' en zijn dus ook voor ons steeds weer een verrassing. Mochten we deze applicatie ooit willen uitbreiden gaan we zeker de vragen opslaan, maar op het moment gebeurt dit nog niet.

Daarom willen we ook het hele object onthouden (of iig, de data die erin zit). Keys genereren is een idee inderdaad, int-keys genereren hebben we geprobeerd, misschien eens iets van een string proberen.

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Kun je niet alleen de waarden opslaan die je echt nodig hebt uit je object en als je ze nodig hebt gewoon het object opnieuw maken adhv. die values?

Acties:
  • 0 Henk 'm!

  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 15-09 21:46
Cartman! schreef op dinsdag 08 december 2009 @ 20:50:
Kun je niet alleen de waarden opslaan die je echt nodig hebt uit je object en als je ze nodig hebt gewoon het object opnieuw maken adhv. die values?
Dat is inderdaad nog het proberen waard. Tot nu toe ben ik wat dat betreft enigszins lui geweest. Ik zal vanavond of morgen eens kijken of dat het verhelpt.

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337


Acties:
  • 0 Henk 'm!

  • Kwastie
  • Registratie: April 2005
  • Laatst online: 13:58

Kwastie

Awesomeness

Als een PHP request 'klaar is', dan word de session opgeslagen op de server (harddisk, database, etc.). Hierbij roept hij op ieder object (in de session) de serialze functie aan. Je moet echter bij PHP zelf aangeven welke waardes van dit object je bewaren wilt (dit doe je d.m.v. de __sleep method in je class) Voor meer info zie: http://www.php.net/manual/en/language.oop5.magic.php

Volgens de PHP manuel

"When serializing objects, PHP will attempt to call the member function __sleep prior to serialization."

edit: Iets beter uitgelegd

[ Voor 57% gewijzigd door Kwastie op 08-12-2009 22:22 ]

When I get sad i stop being sad and be awesome instead


Acties:
  • 0 Henk 'm!

  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 15-09 21:46
Kwastie schreef op dinsdag 08 december 2009 @ 22:11:
Als een PHP request 'klaar is', dan word de session opgeslagen op de server (harddisk, database, etc.). Maar als je een object wil serializen in een session moet je d.m.v. de __sleep aangeven welke waardes van dit object je wilt bewaren als de request klaar is.

(zie http://www.php.net/manual/en/language.oop5.magic.php)

edit:

Volgens mij word tijdens het serialzen ook de __sleep methode aangeroepen.

edit:

Found:

(van de php-manuel: "When serializing objects, PHP will attempt to call the member function __sleep prior to serialization.")
Ja, dit had ik ook gevonden. En ik las ergens in de comments dat het implementeren van __sleep() zodat die doet wat hij hoort te doen zou werken. Heb ik uiteraard geprobeerd, maar leverde niets op bij mij?

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337

Pagina: 1