[php] Array in een session neemt oude waarden over

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik heb een vreemdsoortig probleem. Ik heb een array in een sessie opgeslagen en elk record uit het array bevat een integer.

voorbeeld van array: 0=>3, 1=>5, 2=>7, 3=>2, en 4=>1
PHP:
1
2
3
4
$_SESSION['AANTAL_cart']=$AANTAL_cart;
$AANTAL_cart[0]=3;
$AANTAL_cart[1]=5;
etc...


Nu vervang ik enkele waardes in het array door de waarde 0. dus bijv 0=>0, en 2=>0, dmv de code
PHP:
1
2
$AANTAL_cart[0]=0;
$AANTAL_cart[2]=0;


Het volgende probleem doet zich nu voor: Vlak na het 'updaten' van het array, als ik verder navigeer op de site, worden de oude waarden vanzelf weer teruggezet in het array, dus $AANTAL_cart[0] wordt weer 3 en $AANTAL_cart[2] wordt weer 7.

Het gebeurt heel onregelmatig, ik kan ook niet ontdekken wanneer of waarom hij het doet. Ik heb nergens een stuk code staan die iets doet met de inhoud van het array. Ik vind het heel vreemd. Heeft iemand een idee waar dit door zou kunnen komen? Kan het misschien zijn dat ik underscores gebruik in mijn variabelen die in de sessies worden opgeslagen? de php versie is 4.3.10 Heeft misschien iemand anders wel eens zoiets gehad? Ik wordt er helemaal dol van...

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Weet je zeker dat $_SESSION['x'] en $x[] hetzelfde is? ;)

{signature}


Acties:
  • 0 Henk 'm!

  • [ash]
  • Registratie: Februari 2002
  • Laatst online: 05-04 18:06

[ash]

Cookies :9

Zet je die aangepaste waarden wel terug in je sessie?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Anders zou hij toch in eerste instantie geen waarden kunnen toekennen aan het array in de sessie?? Het vreemde is dat als ik na de update het array weergeef, er wel de waardes '0' wordt weergegeven, echter een paar klikken later staat het array er weer met de oude waarden?

Kan het misschien ook liggen aan MS internet explorer, dat ie misschien moeilijk verbinding met de server krijgt (de server is de laatste tijd een beetje traag) en daarom een pagina uit zijn cache haalt? Het lijkt me niet want ik dacht dat php nooit gecached kon worden...

Acties:
  • 0 Henk 'm!

  • WPN
  • Registratie: Augustus 2003
  • Laatst online: 24-07 21:14

WPN

voorbeeld van array: 0=>3, 1=>5, 2=>7, 3=>2, en 4=>1
PHP:
1
2
3
4
$_SESSION['AANTAL_cart']=$AANTAL_cart;
$AANTAL_cart[0]=3;
$AANTAL_cart[1]=5;
etc...


Nu vervang ik enkele waardes in het array door de waarde 0. dus bijv 0=>0, en 2=>0, dmv de code
PHP:
1
2
$AANTAL_cart[0]=0;
$AANTAL_cart[2]=0;
waar zeg je dat je je sessie variabele weer update voor je de volgende pagina opgaat?

met andere woorden:
je update wel je variabelen maar niet je sessievariabele, dat doe je pas als de pagina weer opnieuw geladen wordt.........

tis net alsof je de deur opslot doet voordat je de klink omlaag doet om hm te openen :D

[ Voor 33% gewijzigd door WPN op 23-01-2006 22:07 ]

Als ik denk zoals ik dacht, dan doe ik zoals ik deed, als ik doe zoals ik deed, dan denk ik zoals ik dacht! Cogito Ergo Sum


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op maandag 23 januari 2006 @ 22:05:
Anders zou hij toch in eerste instantie geen waarden kunnen toekennen aan het array in de sessie??
Kijk nog eens naar je code. $_SESSION heeft nog wel een opvallend kleurtje.
Kan het misschien ook liggen aan MS internet explorer, dat ie misschien moeilijk verbinding met de server krijgt (de server is de laatste tijd een beetje traag) en daarom een pagina uit zijn cache haalt? Het lijkt me niet want ik dacht dat php nooit gecached kon worden...
Nee, ligt niet aan MS IE, maar puur aan jouw PHP code. Nee, de output van een PHP script kan wel degelijk gecached worden door een client (browser), maar nee, dat zal het probleem niet zijn.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
updaten van de sessie variabele... gebeurt dat niet vanzelf als ik..
PHP:
1
$AANTAL_cart[0]=0;

..doe dan? hoe moet ik dit dan anders doen??

onderstaande wordt slechts 1 keer in het begin van het script gedaan als er nog geen sessie bestaat
PHP:
1
$_SESSION['AANTAL_cart']=$AANTAL_cart;

[ Voor 15% gewijzigd door Verwijderd op 23-01-2006 22:12 ]


Acties:
  • 0 Henk 'm!

  • BramT
  • Registratie: Oktober 2001
  • Laatst online: 18:42

BramT

Rule #1

Precies,

Je eerste blok moet je omdraaien:

PHP:
1
2
3
$AANTAL_cart[0]=3; 
$AANTAL_cart[1]=5;
$_SESSION['AANTAL_cart']=$AANTAL_cart;


En je gebruikt lokale en sessie variabelen door elkaar, wat op zich natuurlijk kan, maar daardoor raak je je overzicht wel 's kwijt en kom je dit soort dingen tegen.

Gebruik b.v.:
PHP:
1
2
3
$tempAANTAL_cart[0]=3; 
$tempAANTAL_cart[1]=5;
$_SESSION['AANTAL_cart']=$tempAANTAL_cart;


Je ziet dan wat beter waar je mee bezig bent.

You are the all-dancing, all-singing crap of the world - Jack


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op maandag 23 januari 2006 @ 22:10:
onderstaande wordt slechts 1 keer in het begin van het script gedaan als er nog geen sessie bestaat
PHP:
1
$_SESSION['AANTAL_cart']=$AANTAL_cart;
Gelukkig werkt niet alles met terugwerkende kracht. Scripts zouden anders wel bezig kunnen blijven. :P

{signature}


Acties:
  • 0 Henk 'm!

  • BramT
  • Registratie: Oktober 2001
  • Laatst online: 18:42

BramT

Rule #1

(crap.. hoe edit je een bericht?! ik had nog iets toe te voegen)

Ik zie dat je waarschijnlijk met een shop of iets dergelijks bezig bent. "Natuurlijk" gebruik je dan header("location: ..."); e.d. om te voorkomen dat mensen met hun back-knop het 'wagentje' gaan aanpassen.

Wat ik er op het werk ook nog niet ingestampt krijg bij sommige is dat na een header(); command je script gewoon doorloopt! Doe dus *altijd* een die(); na een header();. Doe je dit niet dan kan je ook dit soort dingen tegenkomen.

Ik zeg niet dat het hier van toepassing is, maar ik moest er ineens aan denken - misschien heb je er wat aan ;)

You are the all-dancing, all-singing crap of the world - Jack


Acties:
  • 0 Henk 'm!

Verwijderd

Staat er een load balancer voor je website? Dan kun je namelijk dit soort problemen verwachten

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb altijd gedacht dat een variable die in een session geregisteerd staat zich vanzelf update als je er een andere waarde aan toekent, blijkbaar niet dus. Als ik nu na de update

PHP:
1
$_SESSION['AANTAL_cart']=$AANTAL_cart;


doe dan is het probleem inderdaad opgelost. Weer een belangrijke les geleerd! Bedankt!

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
session_register('foo');

op het einde van je script kan ook wonderen doen...

Acties:
  • 0 Henk 'm!

  • WPN
  • Registratie: Augustus 2003
  • Laatst online: 24-07 21:14

WPN

waar jij aan denkt is volgens mij het "oude" sessie system waar je eerst
PHP:
1
2
3
4
5
session_start()

en 

session_register('AANTAL_cart')


deed en dan de sessie variabelen declareert...
je probeerde dus 2 manieren de mixen :)

[ Voor 18% gewijzigd door WPN op 23-01-2006 22:25 ]

Als ik denk zoals ik dacht, dan doe ik zoals ik deed, als ik doe zoals ik deed, dan denk ik zoals ik dacht! Cogito Ergo Sum


Acties:
  • 0 Henk 'm!

  • Boogie
  • Registratie: Januari 2001
  • Laatst online: 06-11-2024
De vraag is eigenlijk waarom je niet gelijk je waarden inje sessie aanpast ipv steeds eerst met een lokale variabele te werken die je vervolgens weer in je sessie zet;
Dit gebruikt dubbel zoveel geheugen

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Allebei offtopic:
BramT schreef op maandag 23 januari 2006 @ 22:16:
Wat ik er op het werk ook nog niet ingestampt krijg bij sommige is dat na een header(); command je script gewoon doorloopt! Doe dus *altijd* een die(); na een header();. Doe je dit niet dan kan je ook dit soort dingen tegenkomen.
Na een 'Location: ' header. Niet elke header is evil. :+ Overigens kan je ook overwegen om na een 'Location:'header wel gewoon een doodsimpel html linkje naar die nieuwe locatie te geven en dan pas te stoppen met je script.
Verwijderd schreef op maandag 23 januari 2006 @ 22:19:
Staat er een load balancer voor je website? Dan kun je namelijk dit soort problemen verwachten
Het probleem was al duidelijk en bovendien treedt het al op in 1 executie van het PHP script, dus een load balancer heeft hier 0,0 invloed op.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Beetje offtopic en vooral laat maar wil het toch even melden.

Als je site op een cluster gehost is (dus achter een loadbalancer) en de sessons worden centraal opgeslagen op een aparte server, dmv. NFS kan dit problemen opleveren.

Het kan dan nog wel eens voorkomen dat na een reload de sessie gewoon weer de oude waarden laat zien.

Dit heeft iets te maken met een write buffer van NFS. Zelf heb ik dit alleen nog maar op Linux systemen ondervonden, op een *BSD systeem ben ik het nog niet tegen gekomen, dit kan natuurlijk ook aan de instellingen liggen maar dat ben ik nog aan het uitzoeken.

Maar dit heeft blijkbaar niets met het probleem van TS te maken.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nog wat meer offtopic :)
BramT schreef op maandag 23 januari 2006 @ 22:16:
Wat ik er op het werk ook nog niet ingestampt krijg bij sommige is dat na een header(); command je script gewoon doorloopt! Doe dus *altijd* een die(); na een header();. Doe je dit niet dan kan je ook dit soort dingen tegenkomen.
Maar goed ook dat je het er niet in gestampt krijgt!

PHP:
1
2
3
4
5
6
7
<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
die();

// En hoe nu nog output geven?
?>


Misschien een beetje flauw voorbeeld, maar je moet uitkijken met generieke uitspraken over dat soort zaken te doen. Zelfs na een Location-header hoef je niet per se de boel gelijk af te sluiten. Sowieso kan het zijn dat je nog een en ander aan administratie wilt verrichten of dat je nog wat extra data wilt toesturen voor het geval de client niet zo lekker met Location-headers overweg kan (niet dat die clients nog echt bestaan geloof ik).

Sterker nog, de Location-header en aanverwanten zijn zo'n beetje de enige waar een die() uberhaupt zinnig is...

[ Voor 6% gewijzigd door ACM op 23-01-2006 23:00 ]


Acties:
  • 0 Henk 'm!

  • BramT
  • Registratie: Oktober 2001
  • Laatst online: 18:42

BramT

Rule #1

ACM schreef op maandag 23 januari 2006 @ 22:59:
Nog wat meer offtopic :)


[...]

Maar goed ook dat je het er niet in gestampt krijgt!

PHP:
1
2
3
4
5
6
7
<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
die();

// En hoe nu nog output geven?
?>


Misschien een beetje flauw voorbeeld, maar je moet uitkijken met generieke uitspraken over dat soort zaken te doen. Zelfs na een Location-header hoef je niet per se de boel gelijk af te sluiten. Sowieso kan het zijn dat je nog een en ander aan administratie wilt verrichten of dat je nog wat extra data wilt toesturen voor het geval de client niet zo lekker met Location-headers overweg kan (niet dat die clients nog echt bestaan geloof ik).

Sterker nog, de Location-header en aanverwanten zijn zo'n beetje de enige waar een die() uberhaupt zinnig is...
Dan hijacken we meteen deze hele thread maar weer, maar laat me even ;)

Zoals iemand anders al correct aangaf hierboven, ik was bedoelde inderdaad natuurlijk header("Location: .."), en niet alle header(..) commando's. Was ik inderdaad vergeten.

Maar verder, om toch weer even terug te komen op het topic, kunnen dit soort "vage" sessie-variabelen-die-een-andere-waarde-krijgen makkelijk het gevolg zijn van een geen-die()-na-een-header(location). Dat dit hier niet het geval was wisten we ook al, maar omdat ik zag dat hij met iets bezig is waarbij je hier dit risico loopt, gaf ik dit -als wijze van extra 'service'- ook even aan.

En als je na een header("location...") commando nog zaken wilt gaan uitvoeren ben je imho niet echt structureel bezig, maar da's mijn mening. Maar goed, het kan inderdaad. In dat geval weet je alleen al wel waar je mee bezig bent en heb je mijn posts zowiezo niet nodig ;)

You are the all-dancing, all-singing crap of the world - Jack


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Verwijderd schreef op maandag 23 januari 2006 @ 22:23:
PHP:
1
session_register('foo');

op het einde van je script kan ook wonderen doen...
Of je gebruikt geen code die al meer dan 2 jaar deprecated is.

TS > of je gebruikt een variabele met een reference naar je session array, of je wijzigt gewoon het session array zelf.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Verwijderd schreef op maandag 23 januari 2006 @ 22:20:
Weer een belangrijke les geleerd! Bedankt!
Nou, hou er rekening mee dat je in een andere taal weleens ander gedrag tegen kan komen. Als de eerste toewijzing er voor zorgt dat het element van de $_SESSION array verwijst naar de locatie van de andere array, dan hebben wijzigingen daar wel het gewenste effect. Misschien kan je dat gedrag zelfs in PHP wel voor elkaar krijgen?

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • PiweD
  • Registratie: Augustus 2004
  • Niet online

PiweD

Redacteur
PHP:
1
2
3
4
$_SESSION['AANTAL_cart']=$AANTAL_cart;
$AANTAL_cart[0]=3;
$AANTAL_cart[1]=5;
etc...


de sessie array staat nu niet synchroon gekoppeld aan de $AANTAL_cart array. Dit kan namelijk niet, je moet gewoon de session upaten, of je code omdraaien.

zo moet het lukken:
PHP:
1
2
3
$AANTAL_cart[0]=3;
$AANTAL_cart[1]=5;
$_SESSION['AANTAL_cart']=$AANTAL_cart;


en zo ook:
PHP:
1
2
$_SESSION['AANTAL_cart'][0] = 3;
$_SESSION['AANTAL_cart'][0] = 5;

so·wie·so (bijwoord) - 1 hoe dan ook

Pagina: 1