2011-01-12 12 views
6

tengo una serie como estaPHP cómo stringify matriz y tienda en la galleta

valor $ = {array ('id' => $ id, 'email' => $ correo electrónico, 'símbolo' => $ token)}

Quiero stringificar la matriz, codificar y almacenarla en la cookie "iniciar sesión". Cómo haces eso ? También dime cómo decodificar y leer el valor almacenado.

Editar:

He estado tratando de serializar/unserialize, pero no funcionó como se esperaba. por ejemplo,

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

Pero cuando el valor de ir a la galleta, que se parece a esto

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

La cookie nunca será texto sin formato. La razón es cómo se almacena en el encabezado HTTP. El encabezado 'Cookie:' utiliza caracteres como dos puntos y punto y coma para delimitadores, por lo tanto, necesitan ser escapados (PHP básicamente toma el valor de la cookie y realiza un [url_encode] (http://php.net/manual/en/function). urlencode.php) antes de enviarlo al cliente) –

+0

para leer el valor de la cookie que tengo para url_decode primero? –

+0

dentro de php url_decode debería suceder automáticamente cuando está construyendo el superglobal $ _COOKIE. –

Respuesta

10

hay una función serialize/unserialize para convertir un arreglo en una cadena y la espalda.

Edit: Cuando almacena una cadena en cookie (setcookie), php necesita hacer una codificación de URL en la cadena. Esto evita que cualquier carácter en la cadena guardada en cookie interfiera con cualquier otro encabezado. Cuando la página se carga a continuación, php obtiene la cookie y automáticamente hace una decodificación url en el valor de la cookie para devolverlo a su valor anterior. En cuanto a lo que se almacena en la cookie, esto no debería importar dentro de php porque php hará que la URL se codifique/descodifique automáticamente. Ahora, si está obteniendo la cookie en otro idioma, como javascript, entonces sí, recuperará la cadena sin procesar. En este caso, puede usar algo como decodeURI en JS para recuperar el valor original.

+1

¿Intentó base64_encode la cadena? No debería ser necesario, pero si tiene problemas, probablemente no le haría daño y podría ayudar a evitar problemas con los caracteres que no se codifican de manera automática. –

+2

-1 serialize llamará al constructor de una clase serializada. Esto es malo porque puede causar la ejecución del código. No utilizar en datos no confiables. – goat

+0

@chris gracias, no lo sabía. –

11

json_encode/json_decode

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

También puede utilizar serialize/unserialize:

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

Tal vez.


ACTUALIZACIÓN

Con este código:

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

Usted podría generar el siguiente:

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

Está viendo el valor codificado en función de cómo el protocolo HTTP transfiere las cookies. Hay dos encabezados en una transferencia de cookies: Set-Cookie & Cookie. Uno es servidor-> cliente, el otro es cliente-> servidor, con respeto.

Cuando PHP establece la cookie (utilizando setcookie p.) PHP es realmente sólo a corto entrega el siguiente:

setcookie('login',$serialized); 

el cual, en PHP se traduce en:

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

Si había personajes como : o un espacio, el navegador podría no saber dónde está el las propiedades de cookie comenzaron y finalizaron.

+4

Ah ... la codificación de Jason poco utilizada. :-) –

+0

¿Querías decir "Jason_encode"? o es un error tipográfico para "json_encode"? –

+0

$ array sería en realidad un STD_OBJECT a menos que especifique que desea una matriz con el 2 ° parámetro opcional. –