Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [session handler] czytanie zmiennych sesji
Forum PHP.pl > Forum > PHP
aleksander
Witam,

mam napisanego session handlera, który dane przechowywuje w mysql. W artykule o SH na php.pl przeczytałem, że zmienne sesyjne są serializowane. Chciałem zrobić moduł "userzy on line" wiec wybrałem wszystkie wpisy z DB i probowalem odserializowac. Okazało się, że te dane nie są zaserializowane tylko zapisane w jakiś dziwny sposób. Czy ktoś może mi odpowiezieć, jak taki string, który przedstawiam poniżej zamienić na tablice assoc?
Kod
userid;s:1:"1";login;s:4:"olek";roles;s:54:"editMenus;viewNews;manageNews;viewComments;addComments";groupid;s:1:"1";groupName;s:13:"Administrator";lang;s:2:"pl";
dr_bonzo
userid;s:1:"1";

nazwa zmiennej
typ: string
dlugosc 1
wartosc "1"

chyba jest taka funkcja unserialzie
hawk
Jeżeli to jest wynik serializowania, to dane muszą przecież być "zaserializowane" i dać się odserializować. Nie ma sensu analizować tego ręcznie. No chyba że był jakiś błąd przy zapisywaniu tego do bazy danych i odserializowanie się nie udaje.

BTW, kiedyś miałem problem z zapisywaniem serializowanych obiektów do pliku - file_put_contents(serialize($foo)) - chyba obiekt był zbyt długi po serializacji i z powrotem wychodziły śmieci, i o dziwo pomogło mi jakieś wstawienie slashy (i usunięcie oczywiście przed deserializację). Summa summarum, wyszło bez sensu.
aleksander
muszę zrobić małe sprostowanie. Otóż gdy pisałem pierwszego posta byłem chyba bardzo śpiący bo podałem zły string. Prawidłowy string( czyli ten co zapisuje metoda write sesji) jest następujący:
Kod
userid|s:1:"0";login|s:9:"anonymous";roles|s:41:"useAuth;viewNews;viewComments;addComments";groupid|s:1:"2";groupName|s:10:"U?ytkownik";lang|s:2:"pl";

Ace zapodał mi takie wyrażenie regularne. Działa, jednakże rozwiązuje problem w sposób bardzo nieelegancki i raczej nie będę mógł go użyć w swojej aplikacji. Jeżeli ktos ma pomysł, jak ten string odczytać, proszę o rady smile.gif
  1. <?
  2. $pattern = '/(.*?)|(.*?):(.*?):\"(.*?)\";/';
  3. preg_match_all( $pattern , $result['session_value'], $match );
  4. print_r( $match );
  5. ?>
Rezultat:
Kod
Array
(
    [0] => Array
        (
            [0] => userid|s:1:"0";
            [1] => login|s:9:"anonymous";
            [2] => roles|s:41:"useAuth;viewNews;viewComments;addComments";
            [3] => groupid|s:1:"2";
            [4] => groupName|s:10:"U?ytkownik";
            [5] => lang|s:2:"pl";
        )

    [1] => Array
        (
            [0] => userid
            [1] => login
            [2] => roles
            [3] => groupid
            [4] => groupName
            [5] => lang
        )

    [2] => Array
        (
            [0] => s
            [1] => s
            [2] => s
            [3] => s
            [4] => s
            [5] => s
        )

    [3] => Array
        (
            [0] => 1
            [1] => 9
            [2] => 41
            [3] => 1
            [4] => 10
            [5] => 2
        )

    [4] => Array
        (
            [0] => 0
            [1] => anonymous
            [2] => useAuth;viewNews;viewComments;addComments
            [3] => 2
            [4] => U?ytkownik
            [5] => pl
        )

)


UPDATE: a więc problem rozwiązany:
  1. <?php
  2. $string = 'userid|s:1:\"0\";login|s:9:\"anonymous\";roles|s:41:\"useAuth;viewNews;viewComments;addComments\";groupid|s:1:\"2\";groupName|s:10:\"U?ytkownik\";lang|s:2:\"pl\";';
  3. $pattern = '/(.*?)|(.*?\";)/';
  4. preg_match_all( $pattern , $a, $match );
  5. $keys = &$match[1];
  6. $vals = &$match[2];
  7. $return = array();
  8. foreach( $keys as $key => $val )
  9. {
  10. $return[$val] = unserialize( $vals[$key] );
  11. }
  12. echo &#092;"<pre>\";
  13. print_r( $return);
  14. echo &#092;"</pre>\";
  15. ?>
Kod
Array
(
    [userid] => 0
    [login] => anonymous
    [roles] => useAuth;viewNews;viewComments;addComments
    [groupid] => 2
    [groupName] => U?ytkownik
    [lang] => pl
)
Gratulacje przyjmuję od poniedziałku do piątku w godzinach od 18:00 do 22:00 winksmiley.jpg
ganimedes
Działa, działa. Pochwalić!!! guitar.gif
kwiateek
Coś bardziej wydajnego (-;

  1. <?php
  2. function unserializeSessionData($serizalizedData) {
  3. $data = array();
  4. $elements = preg_split( &#092;"/(w+)|/\", $serizalizedData, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
  5. for ($i = 0; $i < count($elements); $i = $i+2) {
  6. $data[$elements[$i]] = unserialize($elements[$i+1]);
  7. }
  8.  
  9. return $data;
  10. }
  11. ?>

Przykład użycia:
  1. <?php
  2. $foo = 'userid|s:1:\"0\";login|s:9:\"anonymous\";roles|s:41:\"useAuth;viewNews;viewComments;addComments\";groupid|s:1:\"2\";groupName|s:10:\"U?ytkownik\";lang|s:2:\"pl\";';
  3. $data = unserializeSessionData($foo);
  4.  
  5. var_dump($data);
  6.  
  7. ?>

Output:
Kod
array(6) {
  ["userid"]=>
  string(1) "0"
  ["login"]=>
  string(9) "anonymous"
  ["roles"]=>
  string(41) "useAuth;viewNews;viewComments;addComments"
  ["groupid"]=>
  string(1) "2"
  ["groupName"]=>
  string(10) "U?ytkownik"
  ["lang"]=>
  string(2) "pl"
}
bela
  1. <?php
  2. for ($i = 0, $c = count($elements); $i < $c; $i = $i+2) {
  3. ?>


Optymalizacja sie klania winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.