[php] sessies en serializen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
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:
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 ]


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
ik heb ff een online voorbeeldje neergezet (en op een andere server - dus daar kan het ook niet aan liggen)

http://www.marinesofficers.com/sessie/zoeken.php

Op die pagina zie je een dropdown menuutje die de zoekopdracht simuleert.
Kies er 1 van uit en druk op submit, en dan zie je op de volgende pagina de resultaten van je zoekopdracht.
Kies bijvoorbeeld uit de dropdown 1. Je ziet nu op de volgende pagina de nummers 1 tm 5. Kies hier nummer 3. Je Ziet staan dat current id = 3 en je kunt met de pijljtes naar de andere nummers navigeren. Daaronder zie je staan welke waarde er allemaal in de sessie zitten. van belang is de array id_array.
Klik nu op Save position en je krijgt een popup te zien met dat je positie bewaard is en welk nummer.
Klik nu weer op zoeken, kies een ander nummer, klik op submit en weer op een getal uit de resultaten. in de sessie informatie zie je weer staan welke getallen er in de array id_array zitten. Klik nu op restore position en klik op het linkje (het getal) van je vorige positie. Die wordt nu in de window.opener geopend en je ziet dat in de sessie id_array weer gevuld is met de getallen van toen je het opsloeg. Klik nu op eentje naar voren of achteren (me het navigatie menuutje) en voila: de id_array wordt weer overschreven met de resultaten van je tweede zoekopdracht.
8)7
Als iemand me kan uitleggen hoe dat kan zou ik diegene heel erg dankbaar zijn, want ik snap er werkelijk niets meer van. Ik zou eventueel wel alle code kunnen posten nu, maar wordt wel een aardige lap denk ik (is verspreid over 6 filetjes)

Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 23-08 22:47

dArtagnan

Een voor allen, allen voor een

Ik kan het probleem niet vinden. Ik heb je aanwijzingen gevolgt en ook zelf nog even geprobeerd maar het blijft netjes zo staan.

Na meerdere pogingen om de fout te vinden hield ik dit over:

21 2003-05-18 18:43:16
24 2003-05-18 18:42:12
3 2003-05-18 18:41:53
5 2003-05-18 18:39:48
30 2003-05-18 18:39:34

[ Voor 73% gewijzigd door dArtagnan op 18-05-2003 18:49 ]


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
De fout zit 'm er in dat de sessie-informatie die je met de restore-procedure ophaalt na 1x klikken met de navigatie-pijlen, weer wordt overschreven door de sessie-informatie van voor de restore procedure.

Heb even 4 screenshots gemaakt om het te verduidelijken:

screenshot 1:
Afbeeldingslocatie: http://www.marinesofficers.com/sessie/scrnsht1.png

screenshot 2:
Afbeeldingslocatie: http://www.marinesofficers.com/sessie/scrnsht2.png

screenshot 3:
Afbeeldingslocatie: http://www.marinesofficers.com/sessie/scrnsht3.png

screenshot 4:
Afbeeldingslocatie: http://www.marinesofficers.com/sessie/scrnsht4.png

En als je na screenshot 4 dus weer op een navigatiepijltje klikt, dan zit je gewoon weer in de resultaten van screenshot 2

[ Voor 56% gewijzigd door marty op 18-05-2003 21:14 ]