Ik heb voor een intranet applicatie een functie ontwikkeld die een soort kopie maakt van pagina waar een gebruiker op dat moment is. Daarbij sla ik de get, post en sessie waardes geserialized op in een database, met daarbij de pagina waar ze op dat moment waren. Ik heb een sneltoets gemaakt voor het opslaan en voor het retrieven van zo'n pagina (waarbij ze een history van 5 pagina's te zien krijgen).
Maar nou werkt dit alleen alleen goed voor de laatste entry.
Even uitgelegd aan de hand van een voorbeeld.
Ze kunnen ergens door zoekresultaten navigeren. Omdat die zoekresultaten bestaan uit persoonsgegevens met een unieke id, sla ik telkens na de zoekopdracht de unieke IDs in de sessie op, zodat die gebruikt kan worden om er doorheen te navigeren.
zoekopdracht 1: er worden 3 personen gevonden: 100, 101 en 102.
Stel iemand navigeert door die resultaten en drukt bij persoon 101 op save position en gaat daarna andere dingen doen en vraagt daarna die positie weer op, dan komt ie weer in de zoekresultaten terecht, en bij persoon 101. So far, so good
Stel er wordt nu een nieuwe zoekopdracht gedaan:
zoekopdracht 2: er worden 5 personen gevonden: 60, 63, 65, 66 en 69.
Bij het navigeren door de resultaten wordt er nu bij persoon met nummer 66 op save gedrukt. Men gaat vervolgens weer andere dingen doen binnen het systeem en vraagt later deze pagina weer op. Ook dat gaat goed - je komt weer bij 66 terecht en kan weer door die 5 resultaten navigeren.
Echter, vraag je nu vervolgens de history op en ga je naar die van zoekopdracht 1 dan gaat er iets mis. Je komt dan wel netjes bij 101 terecht en als ik print_r($_SESSION) doe dan zie ik ook dat die array met de nummers van de zoekopdracht weer netjes in m'n sessie staat en met de juiste personen is gevuld (100, 101 en 102). Echter als nu met een navigeerbutton naar 100 of 102 gaat, dan wordt die sessie-array met nummers weer door de laatste vervangen (die van de 2e zoekopdracht). en bij de volgende klik zit je dus weer bij een persoon uit de resultaten van zoekopdracht 2
(de zoekopdracht gebeurt 100% zeker niet opnieuw waardoor ie vervangen zou kunnen worden ofzo)
Het lijkt wel alsof het unserializen van die sessie waarden niet helemaal 100% gaat. Ze worden wel in $_SESSION gestopt, maar toch niet echt in de sessie... zoiets.
Dit is hoe ik de sessie-waarden op sla:
Die functie wordt op bepaalde plekken in de code/files aangesproken. op het moment dat ze aangeven dat ze de huidige positie willen saven, haal ik de informatie uit $_SESSION['save_position'] en stop die in de database.
Dit is hoe ik ze er weer uit haal en terug stop:
ik hoop dat het duidelijk is. ik heb geen idee hoe ik dit verder moet debuggen, omdat die sessie waarden in eerste instantie wel gewoon goed staan maar op - voor mij - misterieuze wijze worden overschreven.
Maar nou werkt dit alleen alleen goed voor de laatste entry.
Even uitgelegd aan de hand van een voorbeeld.
Ze kunnen ergens door zoekresultaten navigeren. Omdat die zoekresultaten bestaan uit persoonsgegevens met een unieke id, sla ik telkens na de zoekopdracht de unieke IDs in de sessie op, zodat die gebruikt kan worden om er doorheen te navigeren.
zoekopdracht 1: er worden 3 personen gevonden: 100, 101 en 102.
Stel iemand navigeert door die resultaten en drukt bij persoon 101 op save position en gaat daarna andere dingen doen en vraagt daarna die positie weer op, dan komt ie weer in de zoekresultaten terecht, en bij persoon 101. So far, so good
Stel er wordt nu een nieuwe zoekopdracht gedaan:
zoekopdracht 2: er worden 5 personen gevonden: 60, 63, 65, 66 en 69.
Bij het navigeren door de resultaten wordt er nu bij persoon met nummer 66 op save gedrukt. Men gaat vervolgens weer andere dingen doen binnen het systeem en vraagt later deze pagina weer op. Ook dat gaat goed - je komt weer bij 66 terecht en kan weer door die 5 resultaten navigeren.
Echter, vraag je nu vervolgens de history op en ga je naar die van zoekopdracht 1 dan gaat er iets mis. Je komt dan wel netjes bij 101 terecht en als ik print_r($_SESSION) doe dan zie ik ook dat die array met de nummers van de zoekopdracht weer netjes in m'n sessie staat en met de juiste personen is gevuld (100, 101 en 102). Echter als nu met een navigeerbutton naar 100 of 102 gaat, dan wordt die sessie-array met nummers weer door de laatste vervangen (die van de 2e zoekopdracht). en bij de volgende klik zit je dus weer bij een persoon uit de resultaten van zoekopdracht 2
(de zoekopdracht gebeurt 100% zeker niet opnieuw waardoor ie vervangen zou kunnen worden ofzo)
Het lijkt wel alsof het unserializen van die sessie waarden niet helemaal 100% gaat. Ze worden wel in $_SESSION gestopt, maar toch niet echt in de sessie... zoiets.
Dit is hoe ik de sessie-waarden op sla:
PHP:
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
| // ik roep deze functie aan met een naam waaronder het in de db wordt weggeschreven: function save_position($name) { if (isset($_SESSION['save_position'])) unset($_SESSION['save_position']); if (isset($_GET)) { $serialized_get = serialize($_GET); $_SESSION['save_position']['get'] = $serialized_get; } if (isset($_POST)) { $serialized_post = serialize($_POST); $_SESSION['save_position']['post'] = $serialized_post; } if (isset($_SESSION)) { $session_temp = $_SESSION; unset($session_temp['login']); // we don't wanna save the login information $serialized_session = serialize($session_temp); $_SESSION['save_position']['session'] = $serialized_session; } $_SESSION['save_position']['page'] = $_SERVER['PHP_SELF']; $_SESSION['save_position']['name'] = $name; } |
Die functie wordt op bepaalde plekken in de code/files aangesproken. op het moment dat ze aangeven dat ze de huidige positie willen saven, haal ik de informatie uit $_SESSION['save_position'] en stop die in de database.
Dit is hoe ik ze er weer uit haal en terug stop:
PHP:
1
2
3
4
5
6
7
8
9
| // [...] $row = mysql_fetch_assoc($result); $_POST = unserialize(stripslashes($row['post'])); $_GET = unserialize(stripslashes($row['get'])); $temp_session_login = $_SESSION['login']; unset($_SESSION); $_SESSION = unserialize(stripslashes($row['session'])); $_SESSION['login'] = $temp_session_login; // de login data mag niet overschreven worden omdat daar instellingen in staan |
ik hoop dat het duidelijk is. ik heb geen idee hoe ik dit verder moet debuggen, omdat die sessie waarden in eerste instantie wel gewoon goed staan maar op - voor mij - misterieuze wijze worden overschreven.
[ Voor 80% gewijzigd door marty op 18-05-2003 03:51 ]