Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [session handler] czytanie zmiennych sesji, php dziwnie przechowywuje zmienne sesji
aleksander
post 27.01.2005, 00:05:33
Post #1





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

Ostrzeżenie: (0%)
-----


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";
Go to the top of the page
+Quote Post
dr_bonzo
post 27.01.2005, 00:28:45
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


userid;s:1:"1";

nazwa zmiennej
typ: string
dlugosc 1
wartosc "1"

chyba jest taka funkcja unserialzie


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
hawk
post 27.01.2005, 09:45:21
Post #3





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
aleksander
post 27.01.2005, 16:21:11
Post #4





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

Ostrzeżenie: (0%)
-----


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

Ten post edytował olo 27.01.2005, 17:30:37
Go to the top of the page
+Quote Post
ganimedes
post 27.01.2005, 18:39:47
Post #5





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 1.04.2004

Ostrzeżenie: (0%)
-----


Działa, działa. Pochwalić!!! guitar.gif
Go to the top of the page
+Quote Post
kwiateek
post 8.02.2005, 15:40:17
Post #6





Grupa: Zarejestrowani
Postów: 223
Pomógł: 0
Dołączył: 13.01.2003
Skąd: 3rd ball of mud behind a big ball of burning gas

Ostrzeżenie: (0%)
-----


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"
}


--------------------
It's Time to Join the PLD Linux Generation!
<? while (!$success) { $try++; } ?>
Go to the top of the page
+Quote Post
bela
post 8.02.2005, 18:32:36
Post #7


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

Ostrzeżenie: (0%)
-----


  1. <?php
  2. for ($i = 0, $c = count($elements); $i < $c; $i = $i+2) {
  3. ?>


Optymalizacja sie klania winksmiley.jpg


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 09:35