2011-01-12 7 views
6

Mam tablicę jak tenPHP jak stringify tablicę i przechowywać w pliku cookie

$ value = {array ('id' => $ id, 'email' => $ email 'Token' => $ token)}

Chciałbym uszeregować tablicę, a następnie ją kodować, a następnie zapisać w cookie "login". Jak to robisz? Proszę mi również powiedzieć, jak rozszyfrować i odczytać zapisaną wartość.

Edit:

Próbowałem serialize/unserialize, ale to nie działa zgodnie z oczekiwaniami. na przykład

$value = serialize(array('id'=>33, 'email'=>'[email protected]', 'token'=>'e9aa0966773d68e0fbf9cb21fc2877b4')); 

echo $value; //a:3:{s:2:"id";i:33;s:5:"email";s:20:"[email protected]";s:5:"token";s:32:"e9aa0966773d68e0fbf9cb21fc2877b4";} 

Ale gdy wartość iść do ciastka, wygląda to

a%3A3%3A%7Bs%3A2%3A%22id%22%3Bs%3A1%3A%226%22%3Bs%3A5%3A%22email%22%3Bs%3A20%3A%22craigcosmo%40gmail.com%22%3Bs%3A5%3A%22token%22%3Bs%3A32%3A%22e9aa0966773d68e0fbf9cb21fc2877b4%22%3B%7D 
+1

Plik cookie nigdy nie będzie zwykłym tekstem. Powodem jest to, jak jest przechowywany w nagłówku HTTP. Nagłówek 'Cookie:' używa znaków, takich jak dwukropki i średniki, dla separatorów, w związku z czym należy je pominąć (PHP w zasadzie pobiera wartość cookie i wykonuje [url_encode] (http://php.net/manual/en/function. urlencode.php) na nim przed wysłaniem go do klienta) –

+0

tak, aby odczytać wartość cookie mam najpierw do url_decode? –

+0

w php url_decode powinno nastąpić automatycznie podczas budowania superglobalu $ _COOKIE. –

Odpowiedz

10

jest serialize/unserialize funkcja konwersji tablicę na ciąg iz powrotem.

Edycja: Podczas zapisywania ciągu znaków w cookie (setcookie), php musi wykonać kodowanie url na łańcuchu. Zapobiega to umieszczaniu jakichkolwiek znaków w łańcuchu w ciasteczku ingerującym w inne nagłówki. Po załadowaniu strony php pobiera plik cookie i automatycznie dekoduje adres URL wartości pliku cookie, aby przywrócić ją do poprzedniej wartości. Jeśli chodzi o to, co jest przechowywane w ciasteczku, nie powinno to mieć znaczenia w php, ponieważ php zrobi kodowanie/dekodowanie adresu URL automatycznie. Teraz, jeśli otrzymujesz plik cookie w innym języku, na przykład javascript, wtedy tak, otrzymasz surowy łańcuch z powrotem. W takim przypadku możesz użyć czegoś takiego jak decodeURI w JS, aby odzyskać oryginalną wartość.

+1

czy próbowałeś base64_encode ciągu? Nie powinno być wymagane, ale jeśli masz problemy, prawdopodobnie nie zaszkodzi i może pomóc w zapobieganiu problemom z znakami, które nie są poprawnie zakodowane automatycznie. –

+2

-1 serialize wywoła konstruktor klasy zserializowanej. Jest to złe, ponieważ może spowodować wykonanie kodu. Nie używaj na niezaufanych danych. – goat

+0

@chris dzięki, nie wiedziałem tego. –

11

json_encode/json_decode

$_COOKIE['login'] = json_encode($array); 
$array = json_decode($_COOKIE['login']); 

mogą również korzystać serialize/unserialize:

$_COOKIE['login'] = serialize($array); 
$array = unserialize($_COOKIE['login']); 

Być może.


UPDATE

Z tym kodem:

<html><body><pre><?php 
    $array = Array(
    'id' => 1234, 
    'email' => '[email protected]', 
    'token' => base64_encode('abcDEF1234') 
); 

    echo "Var Dump (initial):\r\n"; 
    var_dump($array); 

    $serialized = serialize($array); 
    echo "Serialized:\r\n".$serialized."\r\n"; 

    $unserialized = unserialize($serialized); 
    echo "Unserialized:\r\n".$unserailized."\r\n"; 
    var_dump($unserialized); 
?></pre></body></html> 

będzie generować następujące:

Var Dump (initial): 
array(3) { 
    ["id"]=> 
    int(1234) 
    ["email"]=> 
    string(19) "[email protected]" 
    ["token"]=> 
    string(16) "YWJjREVGMTIzNA==" 
} 
Serialized: 
a:3:{s:2:"id";i:1234;s:5:"email";s:19:"[email protected]";s:5:"token";s:16:"YWJjREVGMTIzNA==";} 
Unserialized: 

array(3) { 
    ["id"]=> 
    int(1234) 
    ["email"]=> 
    string(19) "[email protected]" 
    ["token"]=> 
    string(16) "YWJjREVGMTIzNA==" 
} 

EDIT2

Widzisz zakodowaną wartość na podstawie sposobu, w jaki protokół HTTP przesyła pliki cookie. W przenoszeniu plików cookie znajdują się dwa nagłówki: Set-Cookie & Cookie. Jeden to serwer-> klient, a drugi to klient- serwer, z szacunkiem.

Kiedy PHP ustawia plik cookie (używając zestawu ustawień np.) PHP jest naprawdę krótki przekazanie następuje:

setcookie('login',$serialized); 

, które przekłada się na PHP:

header('Set-Cookie: login='.urlencode($serialized).'; ' 
     .'expires=Wed, 12-Jan-2011 13:15:00 GMT; ' 
     .'path=/; domain=.mydomain.com'); 

Gdybyś znaków jak : lub spacja, przeglądarka nie wie, gdzie właściwości pliku cookie rozpoczęły się i zakończyły.

+4

Ah ... rzadko używane kodowanie Jason. :-) –

+0

Czy chodziło Ci o "Jason_encode"? czy jest to literówka dla "json_encode"? –

+0

Tablica $ faktycznie byłaby STD_OBJECT, chyba że określisz, że chcesz mieć tablicę z opcjonalnym drugim parametrem. –

Powiązane problemy