2011-01-12 7 views
6

я получил массив как этотPHP как stringify массив и хранить в куки

$ значение = {массив ('ид' => $ ID, 'электронной почты' => $ электронной почты, 'маркер' => $ токен)}

Я хочу, чтобы строка массива затем закодировать, а затем сохранить его в cookie "login". Как ты это делаешь ? Также, пожалуйста, скажите мне, как декодировать и читать сохраненное значение.

Edit:

Я пытался сериализации/десериализации, но он не работает, как ожидалось. например,

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

Но когда значение пойти печенье, это выглядит, как этот

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

Печенье никогда не будет простым текстом. Причина в том, как он хранится в заголовке HTTP. В заголовке 'Cookie:' используются символы, такие как двоеточия и точки с запятой для разделителей, поэтому их нужно избегать (PHP в основном берет значение cookie и выполняет [url_encode] (http://php.net/manual/en/function. urlencode.php), прежде чем вывести его клиенту) –

+0

, поэтому для чтения значения cookie мне нужно сначала указать url_decode? –

+0

в php url_decode должен происходить автоматически, когда он создает суперкомбактуру $ _COOKIE. –

ответ

10

есть функция serialize/unserialize, чтобы преобразовать массив в строку и обратно.

Редактировать: Когда вы храните строку в файл cookie (setcookie), php необходимо выполнить кодировку url в строке. Это предотвращает любые символы в строке, сохраненной в cookie, мешающую другим заголовкам. Когда страница загружается следующей, php получает файл cookie и автоматически расшифровывает URL-адрес в файле cookie, чтобы вернуть его в прежнее значение. Что касается того, что хранится в файле cookie, это не должно иметь значения в php, потому что php будет автоматически кодировать/декодировать url. Теперь, если вы получаете cookie на другом языке, таком как javascript, тогда да, вы получите исходную строку. В этом случае вы можете использовать что-то вроде decodeURI в JS, чтобы вернуть исходное значение.

+1

Вы пытались base64_encode строку? Не требуется, но если у вас возникли проблемы, возможно, это не повредит и может помочь предотвратить проблемы с символами, которые неправильно кодируются автоматически. –

+2

-1 serialize вызовет конструктор сериализованного класса. Это плохо, потому что это может привести к выполнению кода. Не используйте на ненадежных данных. – goat

+0

@chris спасибо, я этого не знал. –

11

json_encode/json_decode

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

Можно также использовать serialize/unserialize:

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

Возможно.


UPDATE

С помощью этого кода:

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

Вы бы произвести следующие действия:

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

Вы видите кодированное значение в зависимости от того, как протокол HTTP передает файлы cookie. В передаче печенья есть два заголовка: Set-Cookie & Cookie. Один из них - сервер-> клиент, другой - клиент-> сервер, с уважением.

Когда PHP устанавливает cookie (используя setcookie, например.) PHP действительно просто короткое вручая следующее:

setcookie('login',$serialized); 

, который, в PHP переводит:

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

Если бы символы, такие как : или пробел, браузер не знал бы, где Свойства и свойства cookie начались и закончились.

+4

А ... редко используется кодировка Джейсона. :-) –

+0

Возможно, вы имели в виду "Jason_encode"? или это опечатка для «json_encode»? –

+0

$ array будет фактически STD_OBJECT, если вы не укажете, что вам нужен массив с дополнительным 2-м параметром. –

Смежные вопросы