[PHP] Session Reference probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 18-08 10:15
Hallo,

Ik ben op het moment bezig om een list class te schrijven die en opgehaalde lijst uit sql cachect in session en die hem returnt, nu zit ik met een probleem dat als ik de $_SESSION var ophaal en een andere variabel stop om als kopie er verder mee te werken dat ik meteen de inhoud van $_SESSION ook verandere wat niet de bedoeling is.

code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$this->list = $_SESSION["list_" . $this->name];

if($io->testGet("sortPage")) {
    $this->list['Data'] = array_slice($this->list['Data'],
        (is_numeric($io->retrieveGet("sortPage")) ? 
(($io->retrieveGet("sortPage") <= $this->list["NumberOfPages"] && $io->retrieveGet("sortPage") >= 0) ? 
$io->retrieveGet("sortPage")*$this->itemsperpage  : 0) : 0),
        (($this->itemsperpage != -1) ? $this->itemsperpage : $this->records));
} else {
    $this->list['Data'] = array_slice($this->list['Data'], 0, (($this->itemsperpage != -1) ? $this->itemsperpage : $this->records));
}


Het gaat dus bij array_slice waar ik een stuk van de array wil returnen naar de gebruiker en de inhoud van de sessie (alle items) wil bewaren, nee hij slicet hem direct op de session variabel.

Wat heb ik geprobeerd, en bekeken:

Op php.net stond dit:
I wanted to retain a session variable's value after a session_unset() and encountered this anomaly: PHP can assign your variable by reference/pointer if your data source is a session variable, even if "&" isn't supplied.

<?
$_SESSION['x'] = "foo";
$x = $_SESSION['x'];
echo $x; // "foo"
$_SESSION['x'] = "bar";
echo $x; // "bar";
?>

To fix this, you can assign your variable to a new variable:

<?
$_SESSION['x'] = "foo";
$x = $_SESSION['x'];
$y = $x;
echo $y; // "foo"
$_SESSION['x'] = "bar";
echo $y; // "foo";
?>
Geprobeerd, maar wou niet werken voor mij. Ook nog gegoolged, maar kreeg weinig resultaten.

Iemand ervaring mee en een oplossing toevallig?

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 22:00

orf

Geen ervaring mee, maar het lijkt behavior te zijn dat er een reference ontstaat. Wat gebeurt er als je dit neerzet:

PHP:
1
$this->list = clone $_SESSION["list_" . $this->name];


Als het tenminste om php5 gaat

Acties:
  • 0 Henk 'm!

  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 18-08 10:15
Werkte niet, ik had het al geprobeerd :P
Warning: __clone method called on non-object in /var/www/htdocs/aeternum/site/includes/libs/tablelist.inc.php on line 137

Warning: array_slice() [function.array-slice]: The first argument should be an array in /var/www/htdocs/aeternum/site/includes/libs/tablelist.inc.php on line 146
Kleine dump van de session, het is een multi dim array, en bevat 10 listitems als hij gesplicet ipv 45 (wat eigenlijk de bedoeling is)

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
Array
(
    [NumberOfRecords] => 45
    [NumberOfPages] => 5
    [DefaultSortField] => Name
    [Data] => Array
        (
            [http://armory.wow-europe.com/#character-sheet.xml?r=Ragnaros&n=Angelsdecay] => Array
                (
                    [Name] => Angelsdecay
                    [class] => Mage
                    [race] => Undead
                    [Level] => 70
                    [Gender] => Male
                )

            [http://armory.wow-europe.com/#character-sheet.xml?r=Ragnaros&n=Asquerat] => Array
                (
                    [Name] => Asquerat
                    [class] => Hunter
                    [race] => Orc
                    [Level] => 70
                    [Gender] => Male
                )

            [http://armory.wow-europe.com/#character-sheet.xml?r=Ragnaros&n=Bakka] => Array
                (
                    [Name] => Bakka
                    [class] => Shaman
                    [race] => Orc
                    [Level] => 70
                    [Gender] => Male
                )

            [http://armory.wow-europe.com/#character-sheet.xml?r=Ragnaros&n=Baszkurator] => Array
                (
                    [Name] => Baszkurator
                    [class] => Shaman
                    [race] => Tauren
                    [Level] => 70
                    [Gender] => Male
                )

            [http://armory.wow-europe.com/#character-sheet.xml?r=Ragnaros&n=Bobou] => Array
                (
                    [Name] => Bobou
                    [class] => Shaman
                    [race] => Tauren
                    [Level] => 70
                    [Gender] => Male
                )

            [http://armory.wow-europe.com/#character-sheet.xml?r=Ragnaros&n=Borak] => Array
                (
                    [Name] => Borak
                    [class] => Warrior
                    [race] => Orc
                    [Level] => 70
                    [Gender] => Male
                )

            [http://armory.wow-europe.com/#character-sheet.xml?r=Ragnaros&n=Bubber] => Array
                (
                    [Name] => Bubber
                    [class] => Warlock
                    [race] => Orc
                    [Level] => 70
                    [Gender] => Male
                )

            [http://armory.wow-europe.com/#character-sheet.xml?r=Ragnaros&n=Cyberia] => Array
                (
                    [Name] => Cyberia
                    [class] => Paladin
                    [race] => Blood Elf
                    [Level] => 70
                    [Gender] => Female
                )

            [http://armory.wow-europe.com/#character-sheet.xml?r=Ragnaros&n=Gaffer] => Array
                (
                    [Name] => Gaffer
                    [class] => Shaman
                    [race] => Orc
                    [Level] => 70
                    [Gender] => Male
                )

            [http://armory.wow-europe.com/#character-sheet.xml?r=Ragnaros&n=Granny] => Array
                (
                    [Name] => Granny
                    [class] => Hunter
                    [race] => Orc
                    [Level] => 70
                    [Gender] => Male
                )

        )

    [Name] => Members
    [Headers] => Array
        (
            [0] => Array
                (
                    [text] => Name
                    [style] => width: 65%
                    [column] => Name
                    [class] =>  active
                )

            [1] => Array
                (
                    [text] => Class
                    [style] => width: 10%
                    [column] => class
                    [class] => 
                )

            [2] => Array
                (
                    [text] => Race
                    [style] => width: 10%
                    [column] => race
                    [class] => 
                )

            [3] => Array
                (
                    [text] => Level
                    [style] => width: 5%;
                    [column] => Level
                    [class] => 
                )

            [4] => Array
                (
                    [text] => Gender
                    [style] => width: 10%
                    [column] => Gender
                    [class] => 
                )

        )

    [CurrentSortField] => Name
    [CurrentSortOrder] => ASC
)

[ Voor 87% gewijzigd door Av3ng3rtje op 18-05-2007 20:50 ]


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 22:00

orf

Kun je die procedurele code niet omzetten in een functie (met als argument de session var). Dan kun je een variabele returnen die je als var in je class kunt gebruiken.

Orf leest even mee met andere suggesties

Acties:
  • 0 Henk 'm!

  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 18-08 10:15
Gevonden!

Er bleef een reference hangen, deze handeling deed ik de constructor.

PHP:
1
$this->list = &$_SESSION["list_" . $this->name];


Oplossing

PHP:
1
2
3
4
//Remove the & reference            
unset($this->list);
//Set the list again
$this->list = $_SESSION["list_" . $this->name];