[PHP] private variabelen in een sessie worden later gevuld

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
Ik heb een nogal vreemd probleem met sessies.

Ik ben met een redelijk eenvoudig systeem bezig om bestellingen te plaatsen. Om dit voor elkaar te krijgen heb ik een aantal objecten gecreerd, waarvan de belangrijksten zijn:
* Bestelling
* Bestelregel

Een bestelling heeft een private array met bestelregels. Deze plaats ik als winkelwagen in de sessie.

Als ik bij een pagina voor het eerst de "winkelwagen" opvraag krijg ik de volgende dump:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
object(Bestelling)#6 (6) {
  ["gebruiker_id"]=>
  string(1) "2"
  ["prijs"]=>
  float(0)
  ["status"]=>
  int(0)
  ["timestamp"]=>
  string(19) "2009-04-11 14:28:44"
  ["bestelregels:private"]=>
  NULL
  ["id"]=>
  int(0)
}


Als ik vervolgens nogmaals de winkelwagen ophaal en vardump krijg ik het volgende:

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
object(Bestelling)#9 (6) {
  ["gebruiker_id"]=>
  string(1) "2"
  ["prijs"]=>
  float(0)
  ["status"]=>
  int(0)
  ["timestamp"]=>
  string(19) "2009-04-11 14:25:11"
  ["bestelregels:private"]=>
  array(1) {
    [1]=>
    object(Bestelregel)#10 (10) {
      ["bestelling_id"]=>
      int(0)
      ["product_id"]=>
      string(1) "1"
      ["product_prijs"]=>
      string(5) "50.00"
      ["product_titel"]=>
      string(9) "Product 1"
      ["aantal"]=>
      int(4)
      ["prijs"]=>
      float(200)
      ["maat"]=>
      string(3) "XXL"
      ["id"]=>
      int(0)
    }
  }
  ["id"]=>
  int(0)
}


In de php doe ik letterlijk niets anders dan twee keer achter elkaar de inhoud van de winkelwagen uit de sessie halen:

PHP:
1
2
var_dump( $_SESSION['winkelwagen'] );
var_dump( $_SESSION['winkelwagen'] );


Ik gebruik een autoloading functie om de class-files in te laden.

Heeft iemand enig idee waar dit probleem door wordt veroorzaakt? Ik kon zelf niets vinden en hoewel de work-around doodeenvoudig is, is het toch net niet wat je verwacht.

Gebruikte php-versie is 5.2.0

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Ik zie nergens hoe je tussen twee pagina's je sessie vult en weer ophaalt. Laat je serialize-code eens zien? :)

'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!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
Het serializen laat ik impliciet door PHP doen:

PHP:
1
2
$bestelling = new Bestelling ();
$_SESSION['winkelwagen'] = $bestelling;


Ik heb ook de gedachte gehad dat het misschien met het serializen te maken heeft, maar dat strookt niet met het feit dat het bij een tweede keer ophalen wel weer gewoon koek en ei is.

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Kun je toch eens proberen wat er gebeurt als je het expliciet doet?

'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!

Verwijderd

Laad alvorens session_start () aan te roepen eens het bestand waarin de class wordt gedefinieerd?

Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
Verwijderd schreef op zaterdag 11 april 2009 @ 18:05:
Laad alvorens session_start () aan te roepen eens het bestand waarin de class wordt gedefinieerd?
Dat wordt al afgevangen door de autoloader, anders had je immers een _PHP_Incomplete_class_ gehad :)

Zal zometeen eens handmatig serializen, eens kijken of dat misschien iets oplevert.

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Misschien zit er een bug in PHP dat de autoloader een race-conditie heeft, ergens. Wat gebeurt er als je de include boven de vardump neerzet?

Acties:
  • 0 Henk 'm!

Verwijderd

wackmaniac schreef op zaterdag 11 april 2009 @ 22:18:

Dat wordt al afgevangen door de autoloader, anders had je immers een _PHP_Incomplete_class_ gehad :)
Vertrouw daar maar niet teveel op.

Maar had je dat daadwerkelijk al geprobeerd, of denk je gewoon: "Die Cheatah lult uit zijn nek"?

Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
Ik moet diep door het stof; ik heb al mijn ongebouwde controles eens een voor een uitgecomment en toen kreeg ik ineens de melding dat "index 'winkelwagen' niet kon worden gevonden".

Ik heb een dus een grote fout gemaakt door de sessie op een verkeerd moment te starten en dan de default waardes van mijn Bestelling te zien als verkeerde unserialization. |:(

A thousand apologies!
Verwijderd schreef op zondag 12 april 2009 @ 00:18:
[...]

Vertrouw daar maar niet teveel op.

Maar had je dat daadwerkelijk al geprobeerd, of denk je gewoon: "Die Cheatah lult uit zijn nek"?
Een pluspunt Cheath, is dat de autoloader prima werkt! Aangezien is een NULL-object kreeg ipv een kapotte klasse heb ik die mogelijkheid ter zijde gelegd.

[ Voor 28% gewijzigd door wackmaniac op 12-04-2009 09:41 ]

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Error surpression (eigenlijk, die moet je loggen ipv weergeven) doe je pas in productie ;) Het scheelt echt zo veel als je gewoon error_reporting op E_ALL hebt staan tijdens het devven. Al meermaals tegen aan gelopen.

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


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

MueR schreef op zondag 12 april 2009 @ 14:43:
Error surpression (eigenlijk, die moet je loggen ipv weergeven) doe je pas in productie ;) Het scheelt echt zo veel als je gewoon error_reporting op E_ALL | E_STRICT hebt staan tijdens het devven. Al meermaals tegen aan gelopen.
Fixed. :P

'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!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Wijs :D

Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
MueR schreef op zondag 12 april 2009 @ 14:43:
Error surpression (eigenlijk, die moet je loggen ipv weergeven) doe je pas in productie ;) Het scheelt echt zo veel als je gewoon error_reporting op E_ALL hebt staan tijdens het devven. Al meermaals tegen aan gelopen.
Lag in deze niet in error supression, maar in mijn gewoonte om alle scenario's te willen afvangen :)

Read the code, write the code, be the code!

Pagina: 1